以太坊的程式設計介面
三種方式與區塊鏈互動:
- JavaScript Console:在geth控制檯與以太坊互動。
- JSON-RPC:一種無狀態的、輕量級的遠端過程呼叫協議,可以跨語言呼叫。
- web3.js:web3.js是以以太坊提供的一個javascript庫,它封裝了以太坊的JSON-RPC
API,提供了一系列與區塊鏈互動的javascript物件和函式。
- Web3.js API
1:建立web3.js
npm install --save web3.0.20.0;
2:建立wbe3例項
//要使用web3.js與區塊鏈互動,首先需要建立web3物件,然後連線到以太坊節點
var web3 = require("web3");
//建立web3物件
var wbe3 = new Web3();
//連線到以太坊節點
web3.setProvider(new Web3.providers.Httprovider("http://localhost:8545"));
- 賬戶相關API
// 檢視當前連線的以太坊節點所有的可用賬號:
// 列出所有的可用賬戶
var accounts = web3.eth.accounts;
console.info(accounts);
// 差看餘額
var balance_1 = web3.eth.getBalance(web3.eth.accounts[0])
console.info(balance_1.toString());
// 這裡返回的餘額是以wei單位來表示的,如果想要以ether為單位表示,可以
var balance_eth = web3.fromWei(balance_1,'ether');
- 交易相關API
1:賬戶之間轉賬交易
//估算轉賬大概需要消耗的gas
var estimate_gas = web3.eth.estimateGas({
from: web3.eth.accounts[0],
to: web3.eth.accounts[1],
value: web3.toWei(1, 'ether')
});
console.info(estimate_gas);
//一個交易通常由以下幾個部分組成:
1、from:交易傳送者的地址,這筆交易最後需要from的私鑰簽名
2、to:接受這筆交易轉賬的目的地址
3、value:這筆交易轉賬的金額,以wei為單位
4、gas:這筆交易中可使用的gas,未使用的gas會被退回。
5、gasPrice:這筆交易中的gas價格,為使用的gas會被退回
//交易物件構建完成後就可以通過web3.eth.sendTransaction向節點傳送交易請求了
//開始轉賬操作
var txId = web3.eth.sendTransaction({
from: web3.eth.accounts[0],
to: web3.eth.acounts[1],
value: web3.toWei(1, 'ether'),
gas: estimate_gas
});
//返回的交易hash
console.log(txId);
// 交易被髮送成功後返回一個交易Hash值,通過這個交易Hash值,進行以下兩步操作:
// 查詢轉賬交易詳情
var tx = web3.eth.getTransaction(txId);
console.log(tx)
//查詢交易收據詳情
var tx_receipt = web3.eth.getTeansactionReceipt(txId)
console.log(tx_receipt)
- 傳送一個已經簽名的轉賬交易
//如果我們自己有一個賬戶,並且這個賬號不儲存在我們連線的以太坊節點中,那麼我們怎麼通過web3提供的API去傳送交易呢?我們可以通過web3.eth.sendRawTransaction方法完成交易的簽名與傳送。
(1) 建立待傳送的交易
var address = "0xasd15d1as5d8adas5d415dasd";
var nonce = web3.eth.getTransactionCount(address, 'pending');
var amount = web3.toWei(1, 'ether');
var rawTx = {
from: address,
to: '0xasd15d1as5d8adas5d415dasd',
value: web3.toHex(amount),
nonce: web3.toHex(nonce),
gasLimit: web3.toHex('49674')
}
//rawTx中包含
-nonce: 記錄from賬號送出的交易數量,用來避免replay attack,每次傳送都要加1。可以用eth_getTransactionCount查詢目前賬戶的nonce。
-gasLimit:當前交易最大消耗gas數量,多餘的會在交易結束後返還。
-to:接受者地址
-value: 要送的ether數量,以wei為單位
(2) 給交易新增簽名
//要想給剛剛建立的交易rawTx加上簽名,需要使用另外一個庫,該庫通過npm命令安裝:
npm install --save ethereumjs-tx@1.3.3
//安裝成功後,開始給rawTx建立簽名;
// 引入包
var Tx = require('ethereumjs-tx');
//建立 raw transaction
var tx = new Tx(rawTx);
//from地址的私鑰
var privatekey = new Buffer('sadqwdqwdqw8d4814d5as4d8w14d5as4d8as1d51w4d5as1d5as4d5as', 'hex')
//使用私鑰給rawTx簽名
tx.sign(privateKey)
//簽名後的交易
var seializedTx = tx.serialize();
//控制檯輸出簽名後的交易資訊
console.log(seralizedTx.toString('hex'));
(3) 傳送已簽名交易
// 交易傳送成功後會返回一個交易的Hash值
webe.eth.sendRawTransaction('ox' + seializedTx.toString('hex'), function(err, hash){
if(!err){
console.lof(hash); //返回交易
} else {
console.log(err)
}
})
- 呼叫合約
pragma solidity ^0.4.20;
contract Storage {
uint256 storedData;
function set(uint256 data) {
storedData = data
}
function get() constant returns (uint256) {
return storedData;
}
}
// 合約部署完成後得到三個重要的東西:
1、合約地址:'0xasdd1sa5d5as4d1d15sad51d'
2、合約的介面地址檔案:
[{
"constant": false,
"inputs": [{
"name": "data",
"type": "uint256"
}],
"name": "set",
"outputs": [],
"payable": false,
"type": "function"
},{
"constant": true,
"inputs": [],
"name": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"type": "function"
}]
3、合約函式的簽名,合約函式的簽名獲取方式如下:
//將合約的get()方法先經過sha3計算後,取除後0x外的前面的8位
var get_func_sign = web3.sha3('gte()').substr(2,8);
//將合約的set(uint256)方法經過sha3計算後,取除了0x外的前面的8位
var set_func_sign = web3.sha3('set(uint256)').substr(2,8);
- 通過合約地址加被呼叫合約的函式簽名
// 首先建立一個呼叫get方法的交易
var tx_set = {
"from": "0xasd5asd151wd5as1d5sa4d55asd5wq4d5qwd",
"to": "0xas1d5sa1d54w15d1as5d1qw5da5s1d5as1d5as",
"gasLimit": web3.toHex('5000'),
"data": "0xasdasd210000000000000000000000000000001"
}
//tx_set中包含:
1、from: 交易傳送者的地址
2、to;合約地址
3、gasLimit: 這筆交易中允許消耗的最大gas數量
4、data: 傳給合約的引數
// 執行方法
var txId = web3.eth.sendTransaction(tx_set);//向以太坊網路傳送一個交易,返回交易hash
// 執行成功後,繼續呼叫get方法看返回的hash
var result = web3.eth.call(tx_get) //執行一個訊息呼叫交易
- 區塊相關的API
// 查詢最新的區塊
1)通過最新區塊編號查詢
//最新區塊編號
var blockNumber = web3.eth.blockNumber;
//根據最新區塊編號獲取區塊詳情
var last_block = web3.eth.getBlock(blockNumber);
console.log(last_block)
2)根據區塊編號或Hash查詢區塊
//根據區塊編號查詢區塊資訊
var block = web3.eth.getBlock(0);
// 根據區塊Hash查詢區塊資訊
var block = web3.eth.getBlock("0xas1dsad2as15das5d4wq5d45asd");
console.log(block)
相關文章
- 面向介面程式設計程式設計
- Java介面程式設計Java程式設計
- 以程式設計師的身份,教您使用API介面獲取蝦皮商品詳情程式設計師API
- 程式設計師,以職業安身,以技能立命程式設計師
- 你們以為的女程式設計師程式設計師
- 事件與介面程式設計事件程式設計
- 如果今天沒有API介面,今天的程式設計師如何程式設計?API程式設計師
- 面向介面的程式設計+MVC程式設計MVC
- (03)Flink 程式設計介面程式設計
- 面向介面程式設計把握不好程式設計
- 程式設計之路-介面美化 (轉)程式設計
- 以一當十的程式設計師不是傳說程式設計師
- 值得收藏的TCP套介面程式設計文章TCP程式設計
- 請教對介面程式設計的含義!程式設計
- 使用Microsoft Agent的COM介面程式設計(轉)ROS程式設計
- 以程式設計師的名義,分析 “人民的名義”程式設計師
- 【介面錦囊】免費好用的API介面,程式設計師必看API程式設計師
- java 介面,介面的特性,介面實現多型,面向介面程式設計Java多型程式設計
- 程式設計師之路:以Android證道程式設計師Android
- Spark開發-RDD介面程式設計Spark程式設計
- JS 中國象棋程式(0):介面設計JS
- OpenMP平行計算程式設計-n以內的完數的個數程式設計
- 全面剖析C#介面程式設計之定義介面C#程式設計
- ThreadLocal難以在非同步程式設計或Reactive程式設計中使用 - bsideupthread非同步程式設計ReactIDE
- Python GUI介面程式設計-初識PythonGUI程式設計
- 理解 TCP(六):網路程式設計介面TCP程式設計
- 【程式設計師介面百寶箱】免費常用API介面程式設計師API
- Promise-在Java中以同步的方式非同步程式設計PromiseJava非同步程式設計
- MEF實現設計上的“鬆耦合”(終結篇)面向介面程式設計程式設計
- 【介面功能設計】TopThink介面功能設計建議
- 【區塊鏈】實戰·以太坊智慧合約程式設計引導區塊鏈程式設計
- 如何理解以太坊ABI - 應用程式二進位制介面
- 程式設計師都在收藏的免費好用API介面程式設計師API
- 急求!!snmp簡單介面設計的程式(線上等)
- Linux下的GTK圖形介面程式設計(轉)Linux程式設計
- Linux下的OSS音訊介面程式設計(轉)Linux音訊程式設計
- 介面設計的那些事
- 【技能篇】程式設計師工作以後該如何提升?程式設計師