设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > PHP教程 > 正文

详解php与ethereum客户端交互(2)

发布时间:2021-05-22 04:04 所属栏目:121 来源:网络整理
导读: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

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.

测试:

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读