Truffle
如何在 Javascript 測試中正確測試 bytes32
我如何解決下面的 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
。這就是你面臨這個問題的原因。有多種方法可以解決此問題:
- 代替
\u0000
assert.equal(web3.utils.toAscii(coinState[1]).replace(/\u0000/g, ''), '1A2B3C4D5E6F7G8H9I0J');
2. 以十六進制格式斷言值(理論上應該有效)
assert.equal(coinState[1], web3.utils.fromAscii('1A2B3C4D5E6F7G8H9I0J', 32));
3. 修復toAscii
函式的實現