1. 程式人生 > >以太坊與節點的互動 JSON RPC API 和Web3.js

以太坊與節點的互動 JSON RPC API 和Web3.js

Go-ethereum客戶端搭建,完成之後,我們可以通過各種方式與節點進行互動(JavaScript Console、JSON-RPC 、web3等)。不止是以太坊,區塊鏈的節點一般會提供一些介面,而且是JSON RPC的介面,大部分都是通過JSON RPC和節點進行互動。通過JSON RPC調功能、傳資料。
實際上去call了它的一些方式。通過暴露出一些JSON RPC的協議,然後去call一些介面,所以本質上是這樣來完成資料的讀取和存取。JSON RPC只是一個傳輸通道,以太坊還有IPC的介面。把以太坊的節點跑起來之後會建立一個程序間通訊的管道,通過管道來做事情。不會耦合,只是把http的管道換成了Unix的管道。
在某些應用場景下,為了接入以太坊區塊鏈,業務系統需要呼叫以太坊客戶端的api,將使用者的交易資料傳送給以太坊平臺。以太坊客戶端已經為外部系統提供了RPC和IPC兩種api呼叫方式。

以RPC方式為例,使用curl命令請求的格式如下:
呼叫客戶端命令:
假設我們要呼叫客戶端命令eth.getBalance(),查詢地址為0x407的賬號的餘額,命令如下:

curl --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407", "latest"],"id":1}' localhost:8123

其中:jsonrpc欄位指定JSON-RPC版本號,method欄位指定需要呼叫的api方法名,params欄位為傳送的引數,id為訊息標識欄位;

呼叫合約方法:
假設目前有部署的智慧合約,地址為0x6ff93,我們要呼叫的合約方法簽名為multiply(uint256),傳入的引數值為6,那麼呼叫命令的格式如下:

curl --data
{
"jsonrpc":“2.0”,
"method":“eth_sendtransaction”,
"params"[{
    "from":"0xeb85a5",
    "to":"0x6ff93",
    "data":"0xcddddd"
}]
"id":8}
localhost:8123

其中,from為扣除GAS的賬戶地址,to為智慧合約部署的地址,data為呼叫方法的簽名和傳入引數,編碼方式為:

“0x”+sha3(“multiply(uint256)”).substring(0,8)+to_32bit_Hex_str(6)

to_32bit_Hex_str()方法的實現會依據不同的變數型別而有不同,具體規則可以參考Ethereum Contract ABI 文件(HERE)。

從上面的示例可以看出,從外部對智慧合約的呼叫需要進行復雜的編碼。萬幸,目前以太坊官方提供了使用javascript語言實現的web3.js模組,對RPC和IPC兩種呼叫方式都進行了封裝,對外提供了簡潔的介面,使用非常方便。

下面本文將使用web3.js模組在nodejs環境下實現對智慧合約的呼叫,並向外提供RESTful的api。詳情如下:
系統環境:
Ubuntu14.04.4+Node V5.1.1;
需要引入的Node模組
express、web3、net,可以使用npm命令安裝依賴;
主要程式碼片段

引入模組依賴

var express =require('express');
var Web3=require('  Web3');
var net=require('net');

設定RPC和IPC連線物件
具體檢視這裡寫連結內容
呼叫以太坊客戶端方法,查詢指定賬戶的餘額

新建以太坊賬戶,該方法必須使用IPC api的呼叫方式

新建合約物件,其中contractData為合約程式碼編譯後的16進位制字串

呼叫智慧合約方法

開啟http server

最後使用node啟動服務,看到“Example app listening at http://:::9090”服務就啟動成功了。這樣使用者便可通過RESTful的http請求來與以太坊客戶端進行互動,並呼叫智慧合約。

計算programming?應用的計算實際上分為了兩種,1.在evm上執行的計算,也是以太坊的核心目標。這些高階語言使用剛才所說的如solidity來寫,寫出來就是一個合約或說是程式。一個合約等價於一個class的概念,裡面可有很多function等價於class裡面很多的method。合約寫完後可以呼叫JSON RPC的介面,把它編譯成evm上的opcodes,然後部署到以太坊的網路上,這樣以太坊就可以進行這個合約,跑起來這個程式。2.用JS或者傳統方法寫的東西,因一個程式裡不是所有的都需要放在區塊鏈上,可能只有你最關心的業務邏輯如轉賬需放在區塊鏈上來保證它的公開透明可執行。其他的如顯示賬戶裡的金額,可以通過JSON RPC另外的介面給節點發請求,告訴我這個地址上賬戶裡餘額多少。這樣收到的response就會包含這個資訊,就會顯示在介面上。如果自己寫了些邏輯在區塊鏈上,類比成資料庫的話有點像procedure,trigger,實際上去call這個儲存過程,它做了些運算,然後把結果放在資料庫上面。有兩類計算,並不是所有的計算都交給區塊鏈的。所以假設我有一個普通的網站,後面有server,背後既有資料庫又有blockchain。有些東西存在資料庫,有些存在blockchain,也沒有問題,因為滿足不同的需求。所以只需要證明在blockchain上不能更改的一些重要的東西,一些和內部業務相關的,一些不那麼重要但經常讀取的就可以放在資料庫裡。所以對於開發人員來講是多了一個武器。
智慧合約的外部呼叫