以太坊代幣轉賬eth_sendTransaction (舉例: eth/usd),開發語言 php

需要:
1. 以太坊節點服務器
2. jsonrpc 接口 eth_call,eth_sendTransaction ,personal_unlockAccount,personal_lockAccount
3. 代幣類型的合約地址 以太坊代幣(usdt)的合約地址
4. 組裝jsonrpc 發送請求數據 (1:解鎖賬戶, 2:查看餘額, 3:發起交易 ,4: 鎖定賬戶) 步驟2 可省略, 但是會有個問題,轉賬發起地址,賬戶沒有usdt, 能發起交易成功,但是節點確認時會失敗,所以最好加上檢查賬戶餘額
5. 發送請求

一,節點服務器

地址: http://localhost
端口:8545
節點服務器搭建請看 : 以太坊代幣usdt節點搭建.

二, jsonrpc接口使用 接口參數如下

eth_sendTransaction 發起轉賬

from: DATA, 20字節 - 發送交易的源地址
to: DATA, 20字節 - 交易的目標地址,當創建新合約時可選
gas:QUANTITY - 交易執行可用gas量,可選整數,默認值90000,未用gas將返還。
gasPrice: QUANTITY -gas價格,可選,默認值:待定(To-Be-Determined)
value: QUANTITY - 交易發送的金額,可選整數
data:DATA - 合約的編譯帶啊或被調用方法的簽名及編碼參數
nonce: QUANTITY - nonce,可選。可以使用同一個nonce來實現掛起的交易的重寫

eth_call 查詢以太坊代幣餘額

from: DATA, 20 Bytes - 發送交易的原地址,可選
to: DATA, 20 Bytes - 交易目標地址
data: DATA - 方法簽名和編碼參數的哈希,可選
QUANTITY|TAG - 整數塊編號,或字符串"latest"、“earliest"或"pending”

personal_unlockAccount 解鎖賬戶

QUANTITY -解鎖地址
QUANTITY -解鎖地址密碼

personal_lockAccount 鎖定賬戶

QUANTITY -鎖定地址

三,usdt代幣的合約地址 (0xdac17f958d2ee523a2206206994597c13d831ec7),查詢方法

查看地址.

下方圖片爲查詢頁面
紅色標記指的就是usd代幣的合約地址

四,組裝jsonrpc發送數據

jsonprc 公用參數

$opts = [
            'jsonrpc' => '2.0',
            'method' => '',
            'params' => [],
            'id' => time()
        ];

curl post 請求

    /**
     * @param $url  節點url 地址   "http://localhost:8845"
     * @param $post_data  發起請求post數據  $opts
     * @return array
     */
    function curlPost( $url, $post_data )
    {
        $curl = curl_init();
        $jsonStringData = json_encode( $post_data );
        $options = [
            CURLOPT_URL => $url,
            CURLOPT_POST => true,
            CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0",
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_TIMEOUT => 20,
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json',
                'Content-Length: ' . strlen( $jsonStringData )
            ],
        ];
        curl_setopt_array( $curl, $options );
        //設置post數據
        curl_setopt( $curl, CURLOPT_POSTFIELDS, $jsonStringData );
        //執行命令
        $data = curl_exec( $curl );
        //關閉URL請求
        if ( $data ) {
            curl_close( $curl );

            $res_data = json_decode( $data, true );

            return ['status' => true, 'data' => $res_data];
        } else {
            $error = curl_errno( $curl );
            curl_close( $curl );
            return ['status' => false, 'data' => '', 'msg' => $error];
        }
    }

先解鎖賬戶

$opts = [
            'jsonrpc' => '2.0',
            'method' => 'personal_unlockAccount',	//解鎖賬戶接口
            'params' => [
				'0xb60e8dd61c5d32be8058bb8eb970870f07233155',	//解鎖賬戶地址
				'123456'	//賬戶密碼
			],
            'id' => time()
        ];

解鎖賬戶常見錯誤

  1. 節點裏面有沒有導入需要解鎖的地址, 解鎖失敗
  2. 地址的密碼錯誤,解鎖失敗

查詢賬戶餘額

$opts = [
            'jsonrpc' => '2.0',
            'method' => 'eth_call', //查詢以太坊代幣的jsonrpc接口
            'params' => [
				0=>[
		            'from' =>'0xb60e8dd61c5d32be8058bb8eb970870f07233155',//查詢地址
		            'to' => '0xdac17f958d2ee523a2206206994597c13d831ec7',    //usdt 智能合約地址
		            'data' => '0x70a08231000000000000000000000000' . substr( '0xb60e8dd61c5d32be8058bb8eb970870f07233155', 2), 
		            //0x70a08231000000000000000000000000 爲固定用法, 後面加上去掉0x的from
		        ],
		        1=>'latest'	//”latest”, “earliest” or “pending”
				
			],
            'id' => time()
        ];

查詢賬戶常見錯誤

  1. 地址有誤
  2. data數據組裝有問題

查詢結果

array(2) {
  ["status"] => bool(true)
  ["data"] => array(3) {
    ["jsonrpc"] => string(3) "2.0"
    ["id"] => int(1574131996)
    ["result"] => string(66) "0x000000000000000000000000000000000000000000000000000037685d904d55"
  }
}

餘額爲: 把 result字段的0x去掉, 轉成十進制 ,在除 1000000  (小數尾數爲6)
$account = hexdec( substr( ['data']['result'], 2 ) ) / 1000000;

發起交易

$opts = [
            'jsonrpc' => '2.0',
            'method' => 'eth_sendTransaction', //轉賬接口
            'params' => [
				0=>[
		            'from' =>'0xb60e8dd61c5d32be8058bb8eb970870f07233155',//轉賬地址
		            'to' => '0xdac17f958d2ee523a2206206994597c13d831ec7',    //usdt 智能合約地址
		            'value'=>'0x', //合約交易, value爲0
		            'gas'=>'0x' . dechex( '1000000' ),  // 1000000 可根據自己修改, 少的話,交易失敗率高
		            'gasPrice'=>'0x' . dechex( '1000000000' ), //同 gas
		            'data' => '0xa9059cbb000000000000000000000000b60e8dd61c5d32be8058bb8eb970870f0723315500000000000000000000000000000000000000000000000000000000000f4240' 
		            //data參數: '0xa9059cbb'.處理的接收地址 . 處理的交易金額
		            //處理的接收地址: 地址去掉0x , 然後在前補0到64位
		            //處理的交易金額: 交易金額轉成16進制,如果帶0x 去掉0x,不帶0x忽略, 然後在前方補0到64位   
		        ],
				
			],
            'id' => time()
        ];

轉賬結果

array(2) {
  ["status"] => bool(true)
  ["data"] => array(3) {
    ["jsonrpc"] => string(3) "2.0"
    ["id"] => int(1574131996)
    ["result"] => string(66) "0xa284222543831e4ad0c363c0c6eadd94f25f829150e0fbb37680c54c6ccacc6c"
  }
}
// result 爲交易hash

轉賬常見錯誤

  1. 賬戶沒有eth, 不夠支付礦工費
  2. data數據組裝錯誤
  3. params 參數格式有誤

鎖定賬戶

$opts = [
            'jsonrpc' => '2.0',
            'method' => 'personal_lockAccount',	//鎖定賬戶接口
            'params' => [
				'0xb60e8dd61c5d32be8058bb8eb970870f07233155'	//鎖定賬戶地址
			],
            'id' => time()
        ];

交易結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章