PHP ETH私链交易操作

关于PHP 操作eth钱包私链的工具类少之又少,这是本人利用EthCommon.class这个工具类 写的eth钱包私链操作方法

<?php
require("EthCommon.class.php");
//token合约地址
$tbos_ctadr='0xe5fc11fae0a453b56f708288acc46320e12cc0b7';
$candy_ctadr="0x45555629AAbfEA138EAd1C1E5f2AC3Cce2aDd830";//CANDY
$usdt_ctadr="0xdac17f958d2ee523a2206206994597c13d831ec7";

query_trading_record("0x9DBC9be51a4ffe4D0905e4406b87bF6A2F105C8C",$usdt_ctadr);

/**
 * 查询交易记录(在线接口)
 * 如果$contractAddress为空则默认查询eth,不为空则根据代币合约地址查询代币
 *
 */
function query_trading_record($address,$contractAddress){//
    $action="txlist";
    if($contractAddress){
        $contractAddress="&contractAddress=".$contractAddress;
        $action="tokentx";
    }
    date_default_timezone_set("Asia/Shanghai");
    $url1='http://api-cn.etherscan.com/api?module=account&action='.$action.'&sort=desc&address='.$address.$contractAddress; //交易记录
    print_r($url1);
    $url2="http://api-cn.etherscan.com/v4/latest/USD";//货币 汇率兑换
    $url3="http://api-cn.etherscan.com/api?module=stats&action=ethprice";//ETH最新价格
    $rsobj1 = file_get_contents($url1);
    $rsobj2 = file_get_contents($url2);
    $rsobj3 = file_get_contents($url3);
    echo "\n";
    $trading_record=json_decode($rsobj1);
    $exchange_rate=json_decode($rsobj2);
    $eth_money=json_decode($rsobj3);
    echo "\n";
    print_r("USD($)".$exchange_rate->rates->USD." = "."RMB(¥)".$exchange_rate->rates->CNY."  校准时间:".date('Y-m-d H:i:s',$exchange_rate->time_last_updated));
    echo "\n";
    print_r("ETH $".$eth_money->result->ethusd);
    echo "  ";
    print_r("ETH ¥".$exchange_rate->rates->CNY*$eth_money->result->ethusd);
    echo "  ";
    $times=$eth_money->result->ethusd_timestamp;
    print_r("  校准时间:".date('Y-m-d H:i:s',$times));
    if($contractAddress){
        $nums= pow(10,intval($trading_record->result[0]->tokenDecimal));// wei 基本单位
    }else{
        $nums= pow(10,18);
    }
    $trsize=count($trading_record->result);
    for($indexs=0;$indexs<$trsize;$indexs++){
        $blockNumber=$trading_record->result[$indexs]->blockNumber;
        $timeStamp=date('Y-m-d H:i:s',$trading_record->result[$indexs]->timeStamp);
        $hash=$trading_record->result[$indexs]->hash;
        $nonce=$trading_record->result[$indexs]->nonce;
        $blockHash=$trading_record->result[$indexs]->blockHash;
        $transactionIndex=$trading_record->result[$indexs]->transactionIndex;
        $from=$trading_record->result[$indexs]->from;
        $to=$trading_record->result[$indexs]->to;
        $money_eth=number_format($trading_record->result[$indexs]->value / $nums,10)." ether";
        $gas=$trading_record->result[$indexs]->gas;
        $gasPrice=number_format($trading_record->result[$indexs]->gasPrice / $nums,10);
        $gasUsed=$trading_record->result[$indexs]->gasUsed;
        $cumulativeGasUsed=$trading_record->result[$indexs]->cumulativeGasUsed;
        $miner_servicecharge=number_format($gasPrice * $gasUsed,10)." ether";
        $money_usd=number_format($money_eth*$eth_money->result->ethusd,10);
        $money_cny=number_format($money_eth*$exchange_rate->rates->CNY*$eth_money->result->ethusd,10);
        echo "\n";
        print_r("区块:".$blockNumber);
        echo "\n";
        print_r("时间:".$timeStamp);
        echo "\n";
        print_r("交易号:".$hash);
        echo "\n";
        print_r("随机数:".$nonce);
        echo "\n";
        print_r("区块哈希:".$blockHash);
        echo "\n";
        print_r("区块索引位置:".$transactionIndex);
        echo "\n";
        print_r("付款地址:".$from);
        echo "\n";
        print_r("收款地址:".$to);
        echo "\n";
        print_r("金额:".$money_eth."  $:".$money_usd."  ¥:".$money_cny);//
        echo "\n";
        print_r("燃料限制:".$gas);
        echo "\n";
        print_r("燃料价格:".$gasPrice);
        echo "\n";
        print_r("交易燃料费用:".$gasUsed);
        echo "\n";
        print_r("累计使用燃料:".$cumulativeGasUsed);
        echo "\n";
        print_r("矿工费用:".$miner_servicecharge);
        echo "\n";
        echo "  ";
    }
}

/**
 * eth转账(geth)
 */
function eth_tr($from,$to,$pwd,$value){
    $eth = new EthCommon('192.168.1.1','37564');
    $wei=pow(10,18);;// wei 基本单位
    $b=$value*$wei;
    $b = number_format($b, 0, '', '');
    $amounthex=base_convert($b, 10, 16);
    $hash= $eth->eth_sendTransaction($from,$to,$pwd,$amounthex);
    echo $hash;
}

/**
 * 代币转账(geth)
 * 如果合约地址是usdt,$exp的值则为6,$exp的为wei单位,自行去eth浏览器查看
 * $value:欲转出的数量
 * $exp:代币的wei单位
 */
function token_transfer_accounts($from,$pwd,$to,$contractAddress,$value,$exp){
    $ethc = new EthCommon('192.168.1.1','37564');
    $methodid="0xa9059cbb";//data头部
    $wei = pow(10,$exp);
    $v=$value/$wei;
    $num = pow(10,18);
    $nums=$v*$num;
    $sbstr=substr($to,2);
    $nums = number_format($nums, 0, '', '');
    $amounthex=base_convert($nums, 10, 16);
    $amounthex = sprintf("%064s", $amounthex); //转换为64位
    $dataraw=$methodid.'000000000000000000000000'.$sbstr.$amounthex;//拼接data
    $hash= $ethc->eth_sendTransactionraw($from,$contractAddress,$pwd,$dataraw);
    echo ' 交易执行返回结果:'.$hash;
}

这个EthCommon.class.php类不是本人写的,是从网上找的

<?php

class EthCommon
{
    protected $host, $port, $version;
    protected $id = 0;
    public $base = 1000000000000000000;//1e18 wei  基本单位

    /**
    * 构造函数
    * Common constructor.
    * @param $host
    * @param string $port
    * @param string $version
    */
    function __construct($host, $port = "80", $version = "2.0")
    {
        $this->host = $host;
        $this->port = $port;
        $this->version = $version;
    }

    /**
    * 发送请求
    * @author qiuphp2
    * @since 2017-9-21
    * @param $method
    * @param array $params
    * @return mixed
    */
    function request($method, $params = array())
    {
        $data = array();
        $data['jsonrpc'] = $this->version;
        $data['id'] = $this->id + 1;
        $data['method'] = $method;
        $data['params'] = $params;
        // echo json_encode($data);
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $this->host);
        curl_setopt($ch, CURLOPT_PORT, $this->port);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

        $ret = curl_exec($ch);
        //返回结果
        if ($ret) {
            curl_close($ch);
            return json_decode($ret, true);
        } else {
            $error = curl_errno($ch);
            curl_close($ch);
            return json_decode('ETH钱包服务器连接失败', true);
            // throw new Exception("curl出错,错误码:$error");
        }
    }

    /**
    * @author qiuphp2
    * @since 2017-9-21
    * @param $weiNumber 16进制wei单位
    * @return float|int 10进制eth单位【正常单位】
    */
    function fromWei($weiNumber)
    {
        $ethNumber = hexdec($weiNumber) / $this->base;
        return $ethNumber;
    }

    /**
    * @author qiuphp2
    * @since 2017-9-21
    * @param $ethNumber 10进制eth单位
    * @return string    16进制wei单位
    */
    function toWei($ethNumber)
    {
        $weiNumber = dechex($ethNumber * $this->base);
//         $weiNumber = float($weiNumber);
        return $weiNumber;
    }

    /**
    * 判断是否是16进制
    * @author qiuphp2
    * @since 2017-9-21
    * @param $a
    * @return int
    */
    function assertIsHex($a)
    {
        if (ctype_xdigit($a)) {
            return true;
        } else {
            return false;
        }
    }
    
    /**
    * 获取版本信息,判断是否连接
    * @author qiuphp2
    * @since 2017-9-19
    */
    function web3_clientVersion()
    {
        $params = array();
        $data = $this->request(__FUNCTION__, $params);
        if ($data['result']) {
            return true;
        } else {
            return false;
        }
        //return $data['result'];
    }
    
    /**
    * 获取主账户
    * @author qiuphp2
    * @since 2017-9-19
    */
    function eth_coinbase()
    {
        $params = array();
        $data = $this->request(__FUNCTION__, $params);
        if ($data['result']) {
            return $data['result'];
        } else {
            return $data['error']['message'];
        }
        // return $data['result'];
    }
    
    /**
    * 获取区块数量
    * @author qiuphp2
    * @since 2017-9-19
    */
    function eth_blockNumber()
    {
        $params = array();
        $data = $this->request(__FUNCTION__, $params);
        if ($data['result']) {
            return $data['result'];
        } else {
            return $data['error']['message'];
        }
        // return $data['result'];
    }
    
    /**
    * 新建账号 有点耗时 最好给用户生成的之后,密码保存在数据库里面
    * @author qiuphp2
    * @since 2017-9-19
    */
    function personal_newAccount($password='')//一般用账户名作为加密密码
    {
        // $password = "123";//密码
        $params = array($password);
        $data = $this->request(__FUNCTION__, $params);
        if (empty($data['error']) && !empty($data['result'])) {
            return $data['result'];//新生成的账号公钥
        } else {
            return $data['error']['message'];
        }
    }


    
    /**
    * @author qiuphp2
    * @since 2017-9-21
    * @return float|int 返回eth数量 10进制
    */
    function eth_getBalance($account='')
    {
//      var_dump($account);
//      $account = $_REQUEST['account'];//获得账号公钥
        if ($account=='') {
            echo '请传入账号公钥';
            return false;
        }
        $params = [$account,"latest"];
        $data = $this->request(__FUNCTION__, $params);
        if (empty($data['error']) && !empty($data['result'])) {
            // return $this->fromWei($data['result']);//返回eth数量,自己做四舍五入处理
            return $data['result'];//返回eth数量,自己做四舍五入处理
        } else {
            return $data['error']['message'];
        }
    }

    /**
    * @author qiuphp2
    * @since 2017-9-21
    * @return float|int 返回eth数量 10进制
    */
    function eth_getBalancehex($account='')
    {
//      var_dump($account);
//      $account = $_REQUEST['account'];//获得账号公钥
        if ($account=='') {
            // echo '请传入账号公钥';
            return false;
        }
        $params = [$account,"latest"];
        $data = $this->request(eth_getBalance, $params);
        if (empty($data['error']) && !empty($data['result'])) {
            return $data['result'];//返回eth数量,自己做四舍五入处理
        } else {
            return $data['error']['message'];
        }
    }
    
    /**
    * 转账
    * @author qiuphp2
    * @since 2017-9-15
    */
    function eth_sendTransaction($from='',$to='',$password='',$value='',$data='')
    {
        if ($from=='' || $to=='' || $password=='' || $value=='') {
             // echo '传入参数缺失';
            return false;
        }

//        if (!ctype_xdigit($value)) {
//           $value = $this->toWei($value);//这里是发送10进制的方法
//        }


        $value = '0x'.$value;//转换成可识别格式
        $gas = $this->eth_estimateGas($from, $to, $value);//16进制 消耗的gas 0x5209
        $gasPrice = $this->eth_gasPrice();//价格 0x430e23400
        $status = $this->personal_unlockAccount($from, $password);//解锁
        if (!$status) {
             return '解锁失败';
            // return false;
        }
        $params = array(
            "from" => $from,
            "to" => $to,
            "gas" => $gas,//'0x5208',//$gas,//21000
            "gasPrice " => '0x‭C350‬‬‬‬‬',//$gasPrice,//18000000000//‭100000
            "value" => $value,//2441406250
            "data" => $data,
        );

        $data = $this->request(__FUNCTION__, [$params]);
        if (empty($data['error']) && !empty($data['result'])) {
            return $data['result'];//转账之后,生成HASH
            // return true;
        } else {
             return $data['error']['message'];
//            return false;
        }
    }
    
    function eth_sendTransactionraw($from='',$to='',$password='',$data='')
    {
        if($from=='' || $to=='' || $password=='' || $data==''){
            // return 'lost.';
            return false;
        }

        $status = $this->personal_unlockAccount($from, $password);//解锁
        if (!$status) {
             // return 'unlock fail';
            return false;
        }
        //"gas":"60000","gasPrice":"10000000000","gasUsed":"51522"
        $params = array(
            "from" => $from,
            "to" => $to,
//            "gas"=> "0x".dechex(2000),
//            "gasPrice"=> "0x".dechex(1000000000),
//            "gasUsed"=> "0X".dechex(51522),
//            "gasLimit"=>"0x".dechex(10000000000),
            "data" => $data,
        );
        $data = $this->request(eth_sendTransaction, [$params]);
        if (empty($data['error']) && !empty($data['result'])) {
            return $data['result'];//转账之后,生成HASH
            // return true;
        } else {
             return $data['error']['message'];
//            return false;
        }
    }
    
    /**
    * 转账详细信息
    * @author qiuphp2
    * @since 2017-9-20
    */
    function eth_getTransactionReceipt($transactionHash='')
    {
        //$transactionHash = "0x536135ef85aa8015b086e77ab8c47b8d40a3d00a975a5b0cc93b2a6345f538cd";
        if($transactionHash==''){
            echo '缺少交易hash';
            return false;
        }
        // 交易 hash
        $params = array(
            $transactionHash,
        );
        $data = $this->request(__FUNCTION__, $params);
        if (empty($data['error'])) {
            if (count($data['result']) == 0) {
                $result['status'] = 0;
                $result['data'] = '等待确认';
                // echo '等待确认';
            } else {
                $result['status'] = 1;
                $result['data'] = $data['result']['blockHash'];
                // return $data['result']['blockHash'];//返回blockhash值
                // return $data['result'];//转账成功了
            }
        } else {
            $result['status'] = 0;
            $result['data'] = $data['error']['message'];
            // return $data['error']['message'];
        }
         return $result;
    }

    /**
    * 获得消耗多少 GAS
    * @author qiuphp2
    * @since 2017-9-15
    */
    function eth_estimateGas($from, $to, $value)
    {
        $params = array(
            "from" => $from,
            "to" => $to,
            "value" => $value
        );
        $data = $this->request(__FUNCTION__, [$params]);
        return $data['result'];
    }
    
    /**
    * 获得当前 GAS 价格
    * @author qiuphp2
    * @since 2017-9-15
    */
    function eth_gasPrice()
    {
        $params = array();
        $data = $this->request(__FUNCTION__, $params);
        return $data['result'];
    }

    /**
    * 解锁账号 此函数可能比较耗时
    * @author qiuphp2
    * @since 2017-9-15
    */
    function personal_unlockAccount($account, $password)
    {
        $params = array($account,$password,100);
        $data = $this->request(__FUNCTION__, $params);
        if (!empty($data['error'])) {
            return $data['error']['message'];//解锁失败
        } else {
            return $data['result'];//成功返回true
        }
    }

    function personal_listAccounts(){
        $params = array();
        $data = $this->request(__FUNCTION__, $params);
        if (empty($data)) {
            return false;
        } else {
            return $data['result'];//成功返回true
        }
    }
}
?>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值