成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識(shí)庫 > 詳解php與ethereum客戶端交互

詳解php與ethereum客戶端交互

熱門標(biāo)簽:遼寧ai電銷機(jī)器人價(jià)格 上海做外呼線路的通信公司 四川保險(xiǎn)智能外呼系統(tǒng)供應(yīng)商 電話機(jī)器人銷售主要負(fù)責(zé)什么 福建銀行智能外呼系統(tǒng)價(jià)格 寧波外呼營(yíng)銷系統(tǒng) 長(zhǎng)沙做地圖標(biāo)注公司 地圖標(biāo)注專員怎么樣 房產(chǎn)中介用的是什么外呼系統(tǒng)

php與ethereum rpc server通信

一、Json RPC

Json RPC就是基于json的遠(yuǎn)程過程調(diào)用,這么解釋比較抽象。簡(jiǎn)單來說,就是post一個(gè)json格式的數(shù)據(jù)調(diào)用rpc server中的方法. 而這個(gè)json格式是固定的, 總的來說有這么幾項(xiàng):

{
  "method": "",
  "params": [],
  "id": idNumber
}
  • method: 方法名
  • params: 參數(shù)列表
  • id: 對(duì)過程調(diào)用的唯一標(biāo)識(shí)號(hào)

二、構(gòu)建一個(gè)Json RPC客戶端

?php

class jsonRPCClient {
  
  /**
   * Debug state
   *
   * @var boolean
   */
  private $debug;
  
  /**
   * The server URL
   *
   * @var string
   */
  private $url;
  /**
   * The request id
   *
   * @var integer
   */
  private $id;
  /**
   * If true, notifications are performed instead of requests
   *
   * @var boolean
   */
  private $notification = false;
  
  /**
   * Takes the connection parameters
   *
   * @param string $url
   * @param boolean $debug
   */
  public function __construct($url,$debug = false) {
    // server URL
    $this->url = $url;
    // proxy
    empty($proxy) ? $this->proxy = '' : $this->proxy = $proxy;
    // debug state
    empty($debug) ? $this->debug = false : $this->debug = true;
    // message id
    $this->id = 1;
  }
  
  /**
   * Sets the notification state of the object. In this state, notifications are performed, instead of requests.
   *
   * @param boolean $notification
   */
  public function setRPCNotification($notification) {
    empty($notification) ?
              $this->notification = false
              :
              $this->notification = true;
  }
  
  /**
   * Performs a jsonRCP request and gets the results as an array
   *
   * @param string $method
   * @param array $params
   * @return array
   */
  public function __call($method,$params) {
    
    // check
    if (!is_scalar($method)) {
      throw new Exception('Method name has no scalar value');
    }
    
    // check
    if (is_array($params)) {
      // no keys
      $params = $params[0];
    } else {
      throw new Exception('Params must be given as array');
    }
    
    // sets notification or request task
    if ($this->notification) {
      $currentId = NULL;
    } else {
      $currentId = $this->id;
    }
    
    // prepares the request
    $request = array(
            'method' => $method,
            'params' => $params,
            'id' => $currentId
            );
    $request = json_encode($request);
    $this->debug  $this->debug.='***** Request *****'."\n".$request."\n".'***** End Of request *****'."\n\n";

    // performs the HTTP POST
    $opts = array ('http' => array (
              'method' => 'POST',
              'header' => 'Content-type: application/json',
              'content' => $request
              ));
    $context = stream_context_create($opts);
    if ($fp = fopen($this->url, 'r', false, $context)) {
      $response = '';
      while($row = fgets($fp)) {
        $response.= trim($row)."\n";
      }
      $this->debug  $this->debug.='***** Server response *****'."\n".$response.'***** End of server response *****'."\n";
      $response = json_decode($response,true);
    } else {
      throw new Exception('Unable to connect to '.$this->url);
    }
    
    // debug output
    if ($this->debug) {
      echo nl2br($debug);
    }
    
    // final checks and return
    if (!$this->notification) {
      // check
      if ($response['id'] != $currentId) {
        throw new Exception('Incorrect response id (request id: '.$currentId.', response id: '.$response['id'].')');
      }
      if (!is_null($response['error'])) {
        throw new Exception('Request error: '. var_export($response['error'], true));
      }
      
      return $response['result'];
      
    } else {
      return true;
    }
  }
}
?>

比較簡(jiǎn)單的代碼,如果比較懶,拿過去用就行了。也可以上packagist.org自己找一個(gè)rpc client.

三、調(diào)用RPC的兩類方法

有兩類方法需要調(diào)用. 一類是RPC server自帶方法,另一類就是合約方法.

RPC server方法調(diào)用json格式

{
  "method": "eth_accounts",
  "params": [],
  "id": 1
}

RPC Server自帶方法的列表

調(diào)用自帶方法比較簡(jiǎn)單,參考上述鏈接,大部分都有示例.

合約方法調(diào)用json格式

調(diào)用合約方法必須使用自帶方法中的eth_call. 而合約方法名稱和合約方法參數(shù)列表則使用params進(jìn)行體現(xiàn), 比如: 我們要調(diào)用合約中的balanceOf方法, 則json數(shù)據(jù)應(yīng)該如何構(gòu)造呢?

首先看看getBalanace的函數(shù)實(shí)現(xiàn):

function balanceOf(address _owner) public view returns (uint256 balance)

提煉出函數(shù)原型:

balanceOf(address)

在geth控制臺(tái)下運(yùn)行命令:

web3.sha3("balanceOf(address)").substring(0, 10)

得到函數(shù)hash "0x70a08231"

假設(shè)待查詢的地址 address _owner = "0x38aabef4cd283ccd5091298dedc88d27c5ec5750", 則去掉前面的"0x", 并在左邊補(bǔ)24個(gè)零(一般地址長(zhǎng)度為42位, 去掉'0x'后為40位),構(gòu)成64位十六進(jìn)制參數(shù).

最終得到的參數(shù)為 "0x70a0823100000000000000000000000038aabef4cd283ccd5091298dedc88d27c5ec5750"

假設(shè)我們的合約地址為 "0xaeab4084194B2a425096fb583Fbcd67385210ac3".

則得到最終的json數(shù)據(jù)為:

{
  "method": "eth_call",
  "params": [{"from": "0x38aabef4cd283ccd5091298dedc88d27c5ec5750", "to": "0xaeab4084194B2a425096fb583Fbcd67385210ac3", "data": "0x70a0823100000000000000000000000038aabef4cd283ccd5091298dedc88d27c5ec5750"}, "latest"],
  "id": 1
}

把以上json數(shù)據(jù)以post方式發(fā)送給服務(wù)器,就可以調(diào)用合約方法"balanceOf", 查詢給定的地址中的代幣余額.

調(diào)用合約中的其他方法也要新遵循上面的方式, 我們?cè)俜治鲆幌聇ransfer方法, 加深印象:

首先, 看看代碼中的函數(shù)實(shí)現(xiàn):

function transfer(address _to, uint256 _value) public returns (bool)

其次, 提煉出函數(shù)原型:

transfer(address,uint256) //注意逗號(hào)后面不能有空格

再次, 在控制臺(tái)運(yùn)行sha3函數(shù):

web3.sha3("transfer(address,uint256)").substring(0, 10)

得到函數(shù)hash "0xa9059cbb"

第一個(gè)參數(shù)假設(shè) address _to = "0x38aabef4cd283ccd5091298dedc88d27c5ec5750", 則去"0x", 補(bǔ)零到64位.

第二個(gè)參數(shù)假設(shè) uint256 _value = 43776, 則化為十六進(jìn)制"0xab00"后, 去"0x", 補(bǔ)零到64位.

連接起來

"0xa9059cbb00000000000000000000000038aabef4cd283ccd5091298dedc88d27c5ec5750000000000000000000000000000000000000000000000000000000000000ab00"

構(gòu)建json數(shù)據(jù):

{
  "method": "eth_call",
  "params": [{"from": "0x38aabef4cd283ccd5091298dedc88d27c5ec5750", "to": "0xaeab4084194B2a425096fb583Fbcd67385210ac3", "data": "0xa9059cbb00000000000000000000000038aabef4cd283ccd5091298dedc88d27c5ec5750000000000000000000000000000000000000000000000000000000000000ab00"}, "latest"],
  "id": 1
}
  • from 轉(zhuǎn)出者地址
  • to 合約地址
  • data 上述操作得到的十六進(jìn)制數(shù)

把以上的步驟轉(zhuǎn)化為代碼.

構(gòu)建一個(gè)以太坊RPC client

?php 

require './jsonRPCClient.php';

//php自帶的dechex無法把大整型轉(zhuǎn)換為十六進(jìn)制
function bc_dechex($decimal)
{
  $result = [];

  while ($decimal != 0) {
    $mod = $decimal % 16;
    $decimal = floor($decimal / 16);
    array_push($result, dechex($mod));    
  }

  return join(array_reverse($result));
}

class EthereumRPCClient
{
  public static $client = null;
  
  //布署合約的賬戶地址
  const COINBASE = '0x38aabef4cd283ccd5091298dedc88d27c5ec5750';
  
  //合約地址
  const CONTRACT = '0xaeab4084194B2a425096fb583Fbcd67385210ac3';

  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, 2), 64, '0', STR_PAD_LEFT);  
    $method_param2_hex = str_pad(strval(bc_dechex($value)), 64, '0', STR_PAD_LEFT);

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

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

  }

}

代碼比較簡(jiǎn)單, 要注意幾點(diǎn):

  • transfer函數(shù)的value單位很小, 是 10 ^ -18, 所以如果你想轉(zhuǎn)1000個(gè),其實(shí)是要乘于 10的18次方, 這里的18是decimals.
  • 由于第1點(diǎn), 應(yīng)該使用bcpow代替pow函數(shù).
  • 不能使用php自帶的dechex函數(shù). 因?yàn)閐echex要求整型不能大于 PHP_INT_MAX, 而這個(gè)數(shù)在32位機(jī)上為4294967295。由于第1 點(diǎn), 所有的數(shù)都要乘于10的18次方, 所以得到的數(shù)要遠(yuǎn)遠(yuǎn)大于PHP_INT_MAX. 建議自己實(shí)現(xiàn)10進(jìn)制轉(zhuǎn)16進(jìn)制,如果你不知道如何實(shí)現(xiàn),參考上述代碼。
  • 在運(yùn)行某些合約方法, 比如transfer時(shí), 要先unlock用戶.
  • 發(fā)送交易之后, 一定要在服務(wù)器端啟動(dòng)挖礦, 這樣交易才會(huì)真的寫入到區(qū)塊, 比如你調(diào)用transfer之后,卻發(fā)現(xiàn)對(duì)方?jīng)]有到賬,先別吃驚,啟動(dòng)挖礦試試。如果想啟用自動(dòng)挖碼, 在geth --rpc ...最后加上 --mine.

測(cè)試:

?php 
var_dump(EthereumRPCClient::personal_newAccount(['password']));
var_dump(EthereumRPCClient::personal_unlockAccount([EthereumRPCClient::COINBASE, "password", 3600]);
var_dump(EthereumRPCClient::getBalance("0x...."));

您可能感興趣的文章:
  • AngularJS與后端php的數(shù)據(jù)交互方法
  • vue.js過濾器+ajax實(shí)現(xiàn)事件監(jiān)聽及后臺(tái)php數(shù)據(jù)交互實(shí)例
  • 淺析PHP與Python進(jìn)行數(shù)據(jù)交互
  • PHP MYSQL簡(jiǎn)易交互式站點(diǎn)開發(fā)
  • php微信公眾平臺(tái)交互與接口詳解
  • 利用php做服務(wù)器和web前端的界面進(jìn)行交互
  • PHP與服務(wù)器文件系統(tǒng)的簡(jiǎn)單交互
  • PHP與以太坊交互詳解

標(biāo)簽:深圳 澳門 佛山 工商登記 宜春 宿遷 延安 常德

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解php與ethereum客戶端交互》,本文關(guān)鍵詞  詳解,php,與,ethereum,客戶端,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解php與ethereum客戶端交互》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解php與ethereum客戶端交互的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美日韩国产二区| 国产精品美女在线观看直播| 亚洲精品久久久久国产| 中文字幕制服丝袜| 成人亚洲精品久久久久软件| 波多野结衣在线观看一区二区| 一卡二卡三卡四卡| 在线观看中文字幕亚洲| 国产麻豆一区二区三区精品| 北条麻妃一区二区三区中文字幕| 色噜噜在线网| 亚洲最大的av网站| 成人动漫h在线观看| 欧美一级特黄aaa| 久久婷婷久久一区二区三区| 欧美在线se| 免费在线不卡av| 国产麻豆欧美日韩一区| caopo在线| 亚洲欧美在线观看视频| 亚洲色图欧美色| 视频二区欧美| 一区二区欧美激情| 久久黄色小视频| 色老太综合网| 黄色大片免费看| 久久99国产精品久久99大师| 色综合天天综合网中文字幕| 91久久精品日日躁夜夜躁国产| 牛人盗摄一区二区三区视频| 北条麻妃一区二区三区在线| 欧美区在线观看| 一区二区三区麻豆| www.se五月| 欧美日韩不卡一区二区| 理论片播放午夜国外| 加勒比成人在线| 中文字幕少妇| 波多一区二区| 欧美粗大gay| 国产精品久久久久7777按摩| 制服丝袜在线播放| 亚洲素人在线| 成人黄页毛片网站| 久久99国产精品免费网站| 国语自产偷拍精品视频偷| 成 人免费视频播放| 国产精品最新在线观看| 99视频在线免费播放| 国产一区二区不卡老阿姨| 免费一级欧美在线大片| 免费观看中文字幕| 300部国产真实乱| 18激情网站| www.黄色片| 国产一区精品视频| jizz在线免费播放| 亚洲人成人一区二区在线观看| 奇米影视狠狠狠| 综合图区亚洲白拍在线| 男女污污视频在线观看| 亚洲少妇中文在线| 欧美激情自拍| 2023国产精品| 国产精品嫩草影院一区二区| 亚洲欧洲美洲一区二区三区| 日本一道高清亚洲日美韩| 欧美成人免费高清视频| www黄色在线观看视频| 中文字幕在线2018| av网站在线不卡| 日韩成人av电影| 天天综合网 天天综合色| 日韩欧美猛交xxxxx无码| 亚洲成人免费观看| 91精品国产色综合久久ai换脸| 一级日本黄色片| 成av人免费青青久| 中文字幕在线观看不卡视频| 国产精品xxx在线观看| 日本国产一区二区| 欧美一区高清| 男人天堂网在线观看| 色佬视频在线观看| 日韩精品丝袜美腿| 精品福利视频一区二区三区| 在线观看亚洲精品| 日韩一级片播放| 久久成人久久爱| 亚洲免费视频一区二区| 欧美精品少妇| 久久成年人网站| 在线观看xxxx| 国产日韩欧美一区二区三区在线观看| 国产亚洲欧洲| 国产婷婷在线视频| 麻豆精品一区二区三区| 成人爽a毛片一区二区| 污的网站在线观看| 羞羞视频在线观看| 九九热免费在线观看| 欧美手机在线视频| 看欧美ab黄色大片视频免费| 国产麻豆午夜三级精品| 国产三级伦理片| 羞羞的视频在线观看| 欧美人与动xxxxz0oz| 一区二区不卡免费视频| 97视频在线播放| 成人动漫免费在线观看| 欧美极品在线播放| 亚洲av无码一区二区三区在线| 色综合久久网女同蕾丝边| 欧美一区二区私人影院日本| 国产黄色成人av| 伊人精品综合| 欧美成人激情在线| 久久精品国产精品亚洲红杏| 欧美xxxhd| 在线观看v片| 国产欧美日韩在线视频| 精品国产一区久久久| 色偷偷偷在线视频播放| 欧洲视频一区二区| 国产精品扒开腿做爽爽爽视频| 91精品人妻一区二区三区果冻| 欧美日韩视频免费看| 亚洲人成网站在线播放2019| 国产精品一级片| 色偷偷亚洲男人天堂| 国产不卡一区二区三区在线观看| 毛片在线视频| 产国精品偷在线| 国产成人av一区二区三区在线观看| yourporn在线观看中文站| 最新亚洲精品国自产在线观看| 日韩欧美国产一区二区| 亚洲春色h网| 九色蝌蚪在线视频| 国产亚洲第一区| 久久综合久久综合九色| 日韩精品视频网| 91文字幕巨乱亚洲香蕉| 午夜精品福利一区二区三区蜜桃| 久久久久在线视频| 91视频在线看| 国产精品久久久久99| 精品街拍一区二区| 国产亚洲亚洲| 中文字幕在线二区| 欧美日韩国产精品一区二区三区| 蜜桃av免费在线观看| 青青草观看免费视频在线| 亚洲精品美女在线观看| bl在线肉h视频大尺度| 欧美成人片在线| 成人三级av在线| 欧美精品一区二区三区四区| 久久不射热爱视频精品| 一区二区三区四区视频在线| www色aa色aawww| 亚洲精品在线视频免费观看| 男女视频网站免费观看| 99热在线看| 国产成人精品影视| 免费在线一级视频| 精品午夜福利在线观看| 国产精品入口日韩视频大尺度| 好男人www社区| 日韩精品你懂的| 美女毛片一区二区三区四区最新中文字幕亚洲| 日韩精品高清不卡| 日韩欧美亚洲在线| 欧美日韩在线影院| 小说区亚洲自拍另类图片专区| 成人信息集中地欧美| 欧美福利网址| 精品在线视频一区二区| 国产精品一区二区三区免费视频| 亚洲色图偷窥| 黄页免费在线观看视频| 五月婷婷中文字幕| 色悠久久久久综合网小说| 777影院狠狠色| 在线播放性xxx欧美| 午夜欧美在线| 国产v片在线观看| 性少妇xx生活| 777视频在线观看| 亚洲精品中文综合第一页| 久久99成人| 尤物tv国产一区| 日本一二区免费| 希岛爱理一区二区三区| 精品福利av| 亚洲日本欧美天堂| 国产99亚洲| 欧美成人中文字幕| 日韩福利在线播放| 欧美二区三区91| 一级在线免费观看| 日韩最新av| 欧美激情www| 成人一二三区| 精彩视频一区二区| 日本三级免费观看| 亚洲天堂免费电影| 成人欧美一区二区三区黑人免费| 亚洲欧洲日本精品| 亚洲精品v亚洲精品v日韩精品| 国产福利热线视频| 亚洲一区二区三区四区不卡| 久久中文字幕国产| 久久久久欧美精品| 国产日韩欧美视频| 老鸭窝91久久精品色噜噜导演| 私拍精品福利视频在线一区| 97视频com| 日韩欧美国产综合在线一区二区三区| 一本一道久久综合狠狠老精东影业| 国产成人久久久精品一区| 精品国产免费无码久久久| 波多野结衣一区二区三区在线观看| 最近中文字幕免费观看| 老司机午夜性大片| 国产精品欧美一区二区三区奶水| 免费精品国产自产拍在| 国产成人拍精品视频午夜网站| 在线看片日韩| 成人在线二区| 欧美精品在线一区| 精品高清在线| 日本久久综合| xxxx在线免费观看| 国产女主播喷水视频在线观看| 中文字幕国产高清| 波多野结衣久久久久| 国产精品久久久久一区二区三区共| 另类综合日韩欧美亚洲| 欧美日韩中文字幕一区二区三区| 欧美激情偷拍| 成人精品久久一区二区三区| 欧美中文字幕一区| 国产高清一区二区三区视频| 动漫3d精品一区二区三区乱码| 亚洲欧洲精品一区二区| 国产中文字幕二区| 国产中文字幕一区二区| 91精品国产自产精品男人的天堂| 91香蕉视频免费在线观看| chinesegaysextube| 亚洲波多野结衣| 国产一精品一av一免费爽爽| 国产精品国产精品国产| 欧美人与牲动交xxxxbbbb| 欧美18—20岁hd第一次| 国产va免费精品高清在线| 中文乱码免费一区二区三区下载| 国产伦精品一区二区三区四区视频| 极品粉嫩饱满一线天在线| 少妇伦子伦精品无吗| 性刺激的欧美三级视频| 国产精品免费麻豆入口| 少妇人妻偷人精品一区二区| 中文字幕乱码人妻综合二区三区| 日本少妇做爰全过程毛片| 日本人妻一区二区三区| 97精品久久久午夜一区二区三区| 国产乱码精品一区二三赶尸艳谈| 中文字幕亚洲一区二区va在线| 久久亚洲国产精品日日av夜夜| 日韩高清在线观看| 香蕉久久视频| 韩日电影在线观看| 2024国产精品视频| 国产精品一区二区三区毛片淫片| 亚洲成人精品视频在线观看| 久久久久9999亚洲精品| 成人3d动漫网站| 欧美18一12sex性处hd| 精品日韩美女| 影音先锋男人看片资源| 亚洲专区欧美专区| 日韩国产一区二| 在线天堂一区av电影| 91免费观看视频在线| 一区二区三区四区激情| 在线视频不卡一区二区三区| 成人免费毛片男人用品| 五月综合激情婷婷六月色窝| 国产精品丝袜久久久久久app| 色综合网色综合| 国产精品亚洲成在人线| 色呦呦日韩精品| 91精品国产乱码久久久张津瑜| 国模无码大尺度一区二区三区| 亚洲区 欧美区| 91禁在线看| 亚洲成人最新网站| 国产在线播放一区| 欧美一级高清大全免费观看| 91成人精品在线| 亚洲欧洲精品一区二区三区不卡| 久草热久草热线频97精品| 夜色福利资源站www国产在线视频| 国产视频精品久久久| 污污视频免费看| 国产精品国产三级国产在线观看| 欧美精品一区二区三区精品| 国产精品三级av在线播放| 午夜国产视频| 四虎精品成人a在线观看| 日韩高清一二三区| 国产99精品在线观看| 欧美日韩精品免费看| 在线观看免费国产小视频| 日本www视频| 国产精品高清一区二区| 精品国产av 无码一区二区三区| 涩涩视频在线| 1234区在线观看视频免费| 成人免费毛片嘿嘿连载视频…| 亚洲福利精品| 天堂在线精品视频| 在线视频1区| 久久久久久97三级| 青青久久av北条麻妃黑人| aaa毛片在线观看|