获取与复仇RPC令牌平衡?

问题描述 投票:3回答:4

通过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"}

接下来做什么?呼叫合同法的平衡呢?怎么做?

php token blockchain ethereum
4个回答
7
投票

要获得令牌平衡,你需要eth_callto参数datato是合同的地址,在这里我们需要生成data参数。由于DOC eth_call说,

数据:DATA - 方法签名和编码参数(可选)散列。有关详情请参阅Ethereum-Contract-ABI

借此EOS token transaction作为一个例子。

合同地址:0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0

令牌持有者地址:0x0b88516a6d22bf8e0d3657effbd41577c5fd4cb7

你可以看到合约代码here

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);
}

Function Selector

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

就拿前四个字节70a08231

Argument Encoding

地址:相当于uint160,除了假设解释和语言输入。

INT:ENC(X)是X的大端二的补码的编码,高阶(左)侧用0xff为负X和与正X,使得长度为32个字节的多个零个字节上填充。

填充所述20个字节令牌地址到32个字节与0到令牌持有者地址:

0000000000000000000000000b88516a6d22bf8e0d3657effbd41577c5fd4cb7

然后CONCAT功能选择和编码参数,我们得到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/

这里是卷曲的结果(你可以在这里得到不同的答案,因为可能有一些交易与此地址我的轮询请求后进行)

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

您可以更改转换十六进制格式余额为十进制

>>> 0x00000000000000000000000000000000000000000000014a314d9ff9b20b9800
6090978215900000000000

检查的结果,

enter image description here


3
投票

当调用的密实度合同的功能,一般来说,data应从以下,编码为十六进制字符串:

  1. 在“功能选择”,这是第4个字节你调用该函数的签名keccak-256散列。
  2. 在ABI编码参数要呼叫的功能。

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

该功能只需要一个参数:其平衡你要查找的帐户的地址。 ABI的编码,只需留下垫用零它,直到它的32个字节长。由于地址是20个字节,这意味着将12个字节的零(或以十六进制24个字符)的。

因此,全data场应该是"0x70a08231" + "000000000000000000000000" + address


0
投票

对于代币交易,你需​​要使用eth_sendTransaction


0
投票

我可以推荐一个合适的ERC20库,我已经开发了自己的PHP。

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
© www.soinside.com 2019 - 2024. All rights reserved.