Truffle

如何在 Javascript 測試中正確測試 bytes32

  • September 30, 2018

我如何解決下面的 bytes32 測試問題?從下面的程式碼:

coinState = await NewCoin.at(newCoinAddress).getAuthorization(web3.fromAscii("1A2B3C4D5E6F7G8H9I0J"));
console.log(coinState);
console.log("A+" + web3.toAscii(coinState[1]).toString().trim() + "+");
console.log("B+" + "1A2B3C4D5E6F7G8H9I0J" + "+");
console.log("C+" + coinState[1] + "+");
console.log("D+" + web3.fromAscii("1A2B3C4D5E6F7G8H9I0J") + "+");
assert.equal(web3.toAscii(coinState[1]).trim(), "1A2B3C4D5E6F7G8H9I0J", "authGUID not correct.")

生成輸出:

在此處輸入圖像描述

下面是toAscii函式的實現:

var toAscii = function(hex) {
   var str = "";
   var i = 0, l = hex.length;
   if (hex.substring(0, 2) === '0x') {
       i = 2;
   }
   for (; i < l; i+=2) {
       var code = parseInt(hex.substr(i, 2), 16);
       str += String.fromCharCode(code);
   }

   return str;
};

基於傳入值的結果值,如果傳入值的類型為bytes32,則結果值的長度為 32,並0轉換為\u0000。這就是你面臨這個問題的原因。

有多種方法可以解決此問題:

  1. 代替\u0000

assert.equal(web3.utils.toAscii(coinState[1]).replace(/\u0000/g, ''), '1A2B3C4D5E6F7G8H9I0J'); 2. 以十六進制格式斷言值(理論上應該有效)

assert.equal(coinState[1], web3.utils.fromAscii('1A2B3C4D5E6F7G8H9I0J', 32)); 3. 修復toAscii函式的實現

引用自:https://ethereum.stackexchange.com/questions/59737