ais*_*tes 3 php token blockchain ethereum
如何通过以太坊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();
...
Run Code Online (Sandbox Code Playgroud)
返回:
{"jsonrpc":"2.0","id":0,"result":"0x"}
Run Code Online (Sandbox Code Playgroud)
接下来做什么?呼叫合同方法balanceOf?怎么做?
要获得与eth_call
您需要to
和data
参数的令牌平衡.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);
}
Run Code Online (Sandbox Code Playgroud)
>>> from web3 import Web3
>>> Web3.sha3("balanceOf(address)")
HexBytes('0x70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be')
Run Code Online (Sandbox Code Playgroud)
取前四个字节 70a08231
地址:相当于uint160,但假定的解释和语言输入除外.
int:enc(X)是X的big-endian二进制补码编码,填充在高阶(左)侧,0xff为负X,零字节为正X,使得长度为32字节的倍数.
将20字节令牌地址填充0
到令牌持有者地址的32字节:
0000000000000000000000000b88516a6d22bf8e0d3657effbd41577c5fd4cb7
Run Code Online (Sandbox Code Playgroud)
然后连接函数选择器和编码参数,我们得到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/
Run Code Online (Sandbox Code Playgroud)
这里是curl结果(你可能会在这里得到不同的答案,因为在我查询请求后可能会有一些事务与这个地址完成)
{"jsonrpc":"2.0","id":67,"result":"0x00000000000000000000000000000000000000000000014a314d9ff9b20b9800"}
Run Code Online (Sandbox Code Playgroud)
您可以将十六进制格式转换为十进制
>>> 0x00000000000000000000000000000000000000000000014a314d9ff9b20b9800
6090978215900000000000
Run Code Online (Sandbox Code Playgroud)
检查结果,
调用 Solidity 合约函数时,一般data
应如下,编码为十六进制字符串:
ERC20 代币的函数签名balanceOf
是balanceOf(address)
。keccak-256 哈希为70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be
,因此前四个字节为70a08231
。
该函数仅采用一个参数:您要查找其余额的帐户的地址。要对其进行 ABI 编码,只需在左侧填充零,直到长度达到 32 字节。由于地址是 20 个字节,这意味着添加 12 个字节的零(或 24 个十六进制字符)。
所以完整的data
字段应该是"0x70a08231" + "000000000000000000000000" + address
.
归档时间: |
|
查看次数: |
5138 次 |
最近记录: |