Solidity
由於數據類型與預期不同,松露測試失敗
我正在使用 truffle 和 ganache 為自己製作一個代幣展示。我正在遵循本指南,然後根據我的項目進行自己的更改。
當我嘗試執行測試以驗證我的合約是否正常執行時,我會看到一個有趣的數據返回,這是我沒有預料到的。
當我使用此測試鑄造令牌時:
describe("mint", () => { it("Created token with specified attributes", async () => { let instance = await Token.deployed(); let owner = await instance.owner(); let tokenId = await instance.mint(5, 2, 5, 10, 5); describe("Expected output: ", tokenId); let attributes = await instance.getToken(0); assert.equal(attributes, [5, 2, 5, 10, 5]); }); });
我期待這個函式返回
$$ 5, 2, 5, 10, 5 $$:
function getToken( uint _TokenId ) public view returns( uint256 value1, uint256 value2, uint256 value3, uint256 value4, uint16 value5 ){ Token memory _token = tokens[_TokenId]; value1 = _token.value1; value2 = _token.value2; value3 = _token.value3; value4 = _token.value4; value5 = _token.value5; }
但據報導,變數屬性返回了這個奇怪的資料結構,它似乎是一個 5 數組,其中包含字元“c”、“e”、“s”到變數的 3 個映射。“c”包含我希望的值:
{"c" : [5] "e" : 0 "s" : 1} {"c" : [2] "e" : 0 "s" : 1} {"c" : [5] "e" : 0 "s" : 1} {"c" : [10] "e" : 1 "s" : 1} {"c" : [5] "e" : 0 "s" : 1}
我的問題是為什麼我得到這個資料結構?我不應該收到預期的結果嗎?我相信“e”的映射是位數 - 1,但我不知道“s”代表什麼。我可以通過每個“c”映射創建一個數組,但我不知道這是否是處理這個問題的最佳方式。
TLDR;採用
tokenId.toString()
您收到的數組是從區塊鏈返回的 BigNumber 的表示。或者實際上區塊鏈返回一個
uint256
(或您使用的許多位),然後將其轉換為 BigNumber。BigNumber 的“問題”是你不能這樣顯示它的值。我不確定數組值代表什麼,但我相信庫本身是https://github.com/MikeMcl/bignumber.js/ 。
無論如何,要顯示數字的人性化版本,您只需使用
value.toString()
.