| 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.
   测试: 
                        (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |