加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

详解php与ethereum客户端交互

发布时间:2021-05-22 11:30:53 所属栏目:PHP教程 来源:网络整理
导读:php与ethereum rpc server通信 一、Json RPC Json RPC就是基于json的远程过程调用,这么解释比较抽象。简单来说,就是post一个json格式的数据调用rpc server中的方法. 而这个json格式是固定的,总的来说有这么几项: method: 方法名 params: 参数列表 id: 对过

public static function __callStatic($method,$params)
{
$params = count($params) < 1 ? [] : $params[0];

try {
  if (is_null(self::$client)) {
    self::$client = new jsonRPCClient('http://127.0.0.1:8545',true);  
  }
} catch (Exception $e) {
  echo $e->getMessage();
}

return call_user_func([self::$client,$method],$params);

}

public static function getBalance($address)
{
$method_hash = '0x70a08231';
$method_param1_hex = str_pad(substr($address,2),64,'0',STR_PAD_LEFT);
$data = $method_hash . $method_param1_hex;

$params = ['from' => $address,'to' => self::CONTRACT,'data' => $data];

$total_balance = self::eth_call([$params,"latest"]);

return hexdec($total_balance) / (pow(10,18));

}

public static function transfer($to,$value)
{
self::personal_unlockAccount([self::COINBASE,"123456",3600]);

$value = bcpow(10,18) * $value;

$method_hash = '0xa9059cbb';
$method_param1_hex =str_pad(substr($to,STR_PAD_LEFT);  
$method_param2_hex = str_pad(strval(bc_dechex($value)),STR_PAD_LEFT);

$data = $method_hash . $method_param1_hex . $method_param2_hex;
$params = ['from' => self::COINBASE,'data' => $data];

return self::eth_sendTransaction([$params]);

}

}

代码比较简单,要注意几点:

  • transfer函数的value单位很小,是 10 ^ -18,所以如果你想转1000个,其实是要乘于 10的18次方,这里的18是decimals.
  • 由于第1点,应该使用bcpow代替pow函数.
  • 不能使用php自带的dechex函数. 因为dechex要求整型不能大于 PHP_INT_MAX,而这个数在32位机上为4294967295。由于第1 点,所有的数都要乘于10的18次方,所以得到的数要远远大于PHP_INT_MAX. 建议自己实现10进制转16进制,如果你不知道如何实现,参考上述代码。
  • 在运行某些合约方法,比如transfer时,要先unlock用户.
  • 发送交易之后,一定要在服务器端启动挖矿,这样交易才会真的写入到区块,比如你调用transfer之后,却发现对方没有到账,先别吃惊,启动挖矿试试。如果想启用自动挖码,在geth --rpc ...最后加上 --mine.

测试:

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读