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
此時範例工程已經搭建完畢搭載在
備註:
修改工程資料夾裡的檔案後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;
}