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