Я использую трюфель и ганаш, чтобы сделать демонстрацию токена для себя. Я следую этому руководству , а затем вношу свои собственные изменения в соответствии с моим проектом.
Когда я пытаюсь запустить тесты, чтобы убедиться, что мой контракт работает правильно, я получаю интересные данные, которых не ожидал.
Когда я чеканю токен, используя этот тест:
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 с 3 сопоставлениями символов «c», «e», «s» в переменную. "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()
.