Не уверен, стоит ли опубликовать это на Ethereum SE, но у меня такое чувство, что это больше связано с javascript, поэтому я попробую здесь:
У меня есть очень простой смарт-контракт, который по сути состоит только из функции getNum и функции setNum. Смарт-контракт можно посмотреть здесь: https://pastebin.com/ci6mbPDq
Я пытаюсь создать простой интерфейс для его вызова. По сути, я следую этому гид. Рабочий код моего интерфейса (демонстрирующий дрянную функциональность) можно найти здесь: https://codepen.io/heh/pen/PeMmKe Как вы можете видеть в моем коде, я вызываю свою функцию getNum следующим образом:
BasicToken.getNum(0x64319ca297239d8652a0b5f0f12dd6666cb0e05b,
function(error, result)
{
console.info(result.toNumber());
document.getElementById("target").innerText = result.toNumber();
}
);
Однако в результате я продолжаю получать «0». С другой стороны, моя функция setNum может отправлять результат в блокчейн Ropsten. Однако я заметил, что оба вызова функций, похоже, мгновенно запускают свой обратный вызов.
Может ли кто-нибудь помочь мне понять, почему вызовы функций возвращаются мгновенно?
Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Обратный вызов вызывается не сразу, проблема в том, что вы не отправляете фактический адрес, который должен быть строкой, и отправляете номер:
0x64319ca297239d8652a0b5f0f12dd6666cb0e05b == 5.720054584403591e+47
И вы получаете 0, потому что отправляемый вами недопустимый адрес не существует в сопоставлении:
mapping (address=>uint) map23;
И если он не существует, он вернет значение по умолчанию для uint, равное нулю.
Отправьте строку, и она будет работать:
BasicToken.getNum('0x64319ca297239d8652a0b5f0f12dd6666cb0e05b', () => {})
Кроме того, если вы хотите, чтобы текущий пользователь извлекал только свое собственное значение и не позволял другим пользователям извлекать эти данные (они могут, поскольку они общедоступны, но не так просто), вам следует использовать msg.sender и удалить параметр функции.
function getNum() public view returns (uint) {
return map23[msg.sender];
}
Пожалуйста :), шестнадцатеричные числа тебя кусают, так как синтаксис валидный :)
Ага, да, думал, что у javascript почему-то есть тип "адрес" :)
Спасибо! Это было именно то! И спасибо за подсказку, я учту это