繁体   English   中英

使用以太坊RPC获取令牌余额?

[英]Get token balance with Ethereum RPC?

如何通过以太坊RPC显示令牌的平衡?

$id = 0;
$data = array();
$data['jsonrpc'] = '2.0';
$data['id'] = $id++;
$data['method'] = 'eth_call';
$data['params'] = [['from' => '0x0...', 'to' => '0x0...', 'data' => 'contract byte code here 0x0...'], 'latest'];

$ch = curl_init();
...

返回:

{"jsonrpc":"2.0","id":0,"result":"0x"}

接下来做什么? 呼叫合同方法balanceOf? 怎么做?

要获得令牌平衡eth_call你需要todata参数。 to是合同地址,这里我们需要生成data参数。 正如doc eth_call所说,

data:DATA - (可选)方法签名和编码参数的散列。 有关详细信息,请参阅Ethereum-Contract-ABI

以此EOS令牌事务为例。

合同地址: 0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0

令牌持有人地址: 0x0b88516a6d22bf8e0d3657effbd41577c5fd4cb7

您可以在此处查看合同代码。

contract ERC20 {
    function totalSupply() constant returns (uint supply);
    function balanceOf( address who ) constant returns (uint value);
    function allowance( address owner, address spender ) constant returns (uint _allowance);

    function transfer( address to, uint value) returns (bool ok);
    function transferFrom( address from, address to, uint value) returns (bool ok);
    function approve( address spender, uint value ) returns (bool ok);

    event Transfer( address indexed from, address indexed to, uint value);
    event Approval( address indexed owner, address indexed spender, uint value);
}

功能选择器

>>> from web3 import Web3
>>> Web3.sha3("balanceOf(address)")
HexBytes('0x70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be')

取前四个字节70a08231

参数编码

地址:相当于uint160,但假定的解释和语言输入除外。

int:enc(X)是X的big-endian二进制补码编码,填充在高阶(左)侧,0xff为负X,零字节为正X,使得长度为32字节的倍数。

将20字节令牌地址填充为32字节,使用0填充令牌持有者地址:

0000000000000000000000000b88516a6d22bf8e0d3657effbd41577c5fd4cb7

然后连接函数选择器和编码参数,我们得到data参数:

0x70a082310000000000000000000000000b88516a6d22bf8e0d3657effbd41577c5fd4cb7

提出请求:

curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to": "0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0", "data":"0x70a082310000000000000000000000000b88516a6d22bf8e0d3657effbd41577c5fd4cb7"}, "latest"],"id":67}' -H "Content-Type: application/json" http://127.0.0.1:8545/

这里是curl结果(你可能会在这里得到不同的答案,因为在我查询请求后可能会有一些事务与这个地址完成)

{"jsonrpc":"2.0","id":67,"result":"0x00000000000000000000000000000000000000000000014a314d9ff9b20b9800"}

您可以将十六进制格式转换为十进制

>>> 0x00000000000000000000000000000000000000000000014a314d9ff9b20b9800
6090978215900000000000

检查结果,

在此输入图像描述

在调用Solidity契约函数时,通常, data应为以下内容,编码为十六进制字符串:

  1. “函数选择器”,它是您正在调用的函数的签名的keccak-256哈希的前四个字节。
  2. 您正在调用的函数的ABI编码参数。

ERC20令牌的balanceOf的函数签名是balanceOf(address) keccak-256哈希是70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be ,所以前四个字节是70a08231

该功能仅使用一个参数:您尝试查找其余额的帐户的地址。 要对它进行ABI编码,只需用零填充它,直到它的长度为32个字节。 由于地址是20个字节,这意味着添加12个字节的零(或十六进制的24个字符)。

因此,完整data字段应为"0x70a08231" + "000000000000000000000000" + address

对于令牌事务,您需要使用eth_sendTransaction

我可以为自己开发的PHP推荐一个合适的ERC20库。

https://www.furqansiddiqui.com/libraries/erc20-php/

https://github.com/furqansiddiqui/erc20-php

检索余额的示例代码:

<?php
$geth = new EthereumRPC('127.0.0.1', 8545);
$erc20 = new \ERC20\ERC20($geth);

// Pass ERC20 contract address as argument below
$token = $erc20->token('0xd26114cd6EE289AccF82350c8d8487fedB8A0C07');

var_dump($token->name()); # string(8) "OMGToken"
var_dump($token->symbol()); # string(3) "OMG"
var_dump($token->decimals()); # int(18)

var_dump($token->balanceOf('0x...')); // Enter ethereum address here

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM