Solidity

由於數據類型與預期不同,松露測試失敗

  • July 25, 2018

我正在使用 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().

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