Как проверить баланс контракта, например Augur (REP), на адресе с JSON-RPC? Кажется, не так много документации по этому поводу.
Чтобы получить баланс токена REP через JSON-RPC, вам придется использовать eth_call
метод. Дополнительные сведения об использовании eth_call
.
А из augur-core/src/repContract.se функция balanceOf(...)
определяется как:
def balanceOf(address: address):
return(self.reporting[address]: uint256)
И это соответствует стандарту ERC: Token #20 , где balanceOf(...)
функция должна иметь подпись:
function balanceOf(address _owner) constant returns (uint256 balance)
Чтобы найти сигнатуру функции в geth
, я запускаю следующую команду:
> web3.sha3('balanceOf(address)').substring(0,10)
"0x70a08231"
Для примера мы будем использовать баланс токена REP для адреса 0xab11204cfeaccffa63c2d23aef2ea9accdb0a0d5 со следующим балансом:
Теперь мне нужно использовать приведенную выше сигнатуру функции с заполненным слева нулем представлением адреса, который будет передан balanceOf(...)
функции:
0x70a08231000000000000000000000000ab11204cfeaccffa63c2d23aef2ea9accdb0a0d5
Из etherscan.io/token/REP адрес контракта REP — 0x48c80F1f4D53D5951e5D5438B54Cba84f29F32a5.
Я выполнил следующую команду JSON-RPC для своего узла Parity (для параметра geth
можно не --header
указывать):
curl localhost:8545 -X POST --header 'Content-type: application/json' --data '{"jsonrpc":"2.0", "method":"eth_call", "params":[{"to": "0x48c80F1f4D53D5951e5D5438B54Cba84f29F32a5", "data": "0x70a08231000000000000000000000000ab11204cfeaccffa63c2d23aef2ea9accdb0a0d5"}], "id":1}'
Результат команды выше:
{"jsonrpc":"2.0","result":"0x000000000000000000000000000000000000000000010843f6b148a2ec22c604","id":1}
И чтобы подтвердить правильность результатов, я выполнил следующую команду geth
:
> new BigNumber("000000000000000000000000000000000000000000010843f6b148a2ec22c604", 16)/1e18
1247958.4593995938
Вам нужно будет преобразовать шестнадцатеричный результат в число в вашем приложении.
Как описано в ошибке RPC «недопустимое или отсутствующее значение для параметров» при вызове функций void константы контракта , возможно , вам придется добавить параметр блока в params
список. Ваша команда с параметром блока будет:
curl localhost:8545 -X POST --header 'Content-type: application/json' --data '{"jsonrpc":"2.0", "method":"eth_call", "params":[{"to": "0x48c80F1f4D53D5951e5D5438B54Cba84f29F32a5", "data": "0x70a08231000000000000000000000000ab11204cfeaccffa63c2d23aef2ea9accdb0a0d5"}, "latest"], "id":1}'
Ссылка Параметр блока по умолчанию и eth_call
.
eth_call
без блочного параметра работало раньше, но теперь кажется обязательным.
конфиденциальностьisahumanright.eth
Джулиан