1. 程式人生 > >web3通過testrpc訪問以太坊資料入門

web3通過testrpc訪問以太坊資料入門

一、安裝truffle+testrpc開發和測試環境。truffle是開發環境,testrpc是測試環境。

工作在64位linux,版本16.04上進行。

以下命令如果許可權不夠則使用sudo執行。

1、安裝環境時需要git,如果沒有可以用如下命令安裝

add-apt-repository ppa:git-core/ppa
apt-get update
apt-get install git

2、需要在nodejs環境,通過如下命令安裝
apt-get install nodejs
apt-get install npm

其中npm是nodejs的包管理器,之後truffle和testrpc都是nodejs的包,需要使用npm進行安裝。

如果nodejs版本過低,可以使用n進行升級

npm install -g n
n stable
n是nodejs的一個版本管理器,n stable命令讓nodejs升級到最新的穩定版

3、安裝truffle

npm install -g truffle

如果安裝成功,執行

truffle version
可以看到版本號。

4、安裝web3的testrpc

npm install -g ethereumjs-testrpc
安裝後,執行testrpc


如果看到上述內容,說明安裝成功。testrpc提供了一個最簡單的區塊鏈環境,裡面有10個預設使用者(給出了他們的地址和私鑰)

如果沒有出現,則說明還需要安裝其他依賴,請根據提示資訊安裝相關nodejs包,使用命令一般為:

npm install -g [依賴包名]


二、環境測試

truffle工程建立

1、開啟testrpc測試環境,看到testrpc提供的10個預設使用者。

2、另起一個終端(testrpc那個不要關),建立一個truffle工程資料夾並進入。

mkdir project
cd project

3、 下載truffle範例工程

truffle init webpack

注意:truffle init也能下載一個範例工程,但是當前版本這個範例有bug無法執行

4、 編譯並執行:

truffle compile
truffle migrate
npm run dev

此時範例工程已經搭建完畢搭載在

http://localhost:8080。用瀏覽器訪問可以看到範例裡的metacoin應用

備註:

修改工程資料夾裡的檔案後dev會自動重新編譯並掛載,非常智慧

想要清除區塊鏈裡的全部資料,需要關閉testrpc


三、開發

常用函式有:

資料上鍊:

web3.eth.sendTransaction(object)

傳送內容為一個object,裡面需要填寫傳送相關資訊。返回值為一個hex的Transaction地址。

Object內必填內容有:

from : String  //傳送方地址

to : String //接收方地址

資料下鏈:

web3.eth.getTransaction(hash)

輸入內容為Transaction的hash地址,返回值為Transaction的Object。

Transaction內的Data為Hex形式,建議傳輸資料前先轉一下。如果直接字串格式的Data直接傳送到Transaction中,自動轉的Hex會帶0x字首

web3.ToHex(String or Number)

相應的,接收後用

web3.toAscii(hexString)

解出原始地址。

一個簡單的例子:

//jsonIO.js 傳送和查詢Transaction
function jsonIO(){
var O_jsonIO=new Object;
O_jsonIO.write_json=function write_json(fromAddr,toAddr,jsonData){
	var jsonstr=JSON.stringify(jsonData);
	var jsonHex=web3.fromAscii(jsonstr);
	var trans={"from":fromAddr,
		"to":toAddr,
		"data":jsonHex
	};

	return web3.eth.sendTransaction(trans);
	}
O_jsonIO.read_json_from_address=function read_json_from_address(fromAddr,startBlock,endBlock){
  var jsonArr=new Array();
  if (startBlock==null) {
    console.log("default start from block 0");
    startBlock=0;
  }
  if (endBlock==null) {
    console.log("default end to block "+web3.eth.blockNumber);
    endBlock=web3.eth.blockNumber;
  }
  if (startBlock<0 || startBlock>endBlock || endBlock>web3.eth.blockNumber) {
    console.error("no such blocks")
    return null;
  }
  for (var i=0;i<=web3.eth.blockNumber;i++)
  	{
  	var Block=web3.eth.getBlock(i);
  	if (Block.transactions!=null && Block!=null)
  	{
  		Block.transactions.forEach(function (e)
  		{
  			var getT=web3.eth.getTransaction(e);
  			var Tdata=web3.toAscii(getT.input);
  			if (Tdata.charAt(0)=="{" && (getT.from==fromAddr || getT.to==fromAddr))
  			{
  				//console.log("find");
  				//console.log(Tdata);
  				var Obj=JSON.parse(Tdata);
  				jsonArr.push(Obj);
  			}
  		});
  	}
  	}
  return jsonArr;
};
return O_jsonIO;
}