#Web3 Get Node
判斷目前使用者所連接是那種型態的Ethereum節點,Testrpc、Geth或Metamsak…等。
web3.version.getNode(function(error, result){
if(error){
// error handle
} else {
// do something
};
});
#Web3 Syncing
判斷使用者所連接的Ethereum節點是否正在做同步的動作。正在同步為True,否則為False。
web3.eth.getSyncing(function(error, result) {
if(error) {
// error handle
} else {
// do something
}
});
#Web3 Coinbase
查看連接Ethereum節點的coinbase address。coinbase是專門存放挖礦所獲得獎勵的read only帳戶。
在Geth Node環境下可以使用Geth console下指令web3.miner.setEtherbase()去修改coinbase address。
web3.eth.getCoinbase(function(error, result) {
if(error) {
// error handle
} else {
// do something
}
});
#Web3 Default Account
查看目前連接Ethereum節點的deault account address。deault account是read/write only。
當我們在進行某些操作例如sendTransaction時,若沒有特別指定要從哪一個帳戶發出,
則默認就是使用deault account。因為每個Ethereum節點實作的方式不同,default account不一定有定義,使用前最好檢查一下。
web3.eth.defaultAccount// 為了避免default account undefined的話, 可以改寫成下面的Code
var defaultAccount = web3.eth.defaultAccount;
if(!defaultAccount) {
web3.eth.defaultAccount = web3.eth.accounts[0];
defaultAccont = web3.eth.accounts[0];
}
#Web3 Get Balance
取得帳戶裡的餘額。分成同步和非同步兩種。
使用web3.eth.getBalance()所獲得餘額的單位是Wei。
web3.fromWei()就是把Wei轉成其他單位,下面範例則是轉成Ether。
toFixed()是我們只取到小數點後兩位數。
getBalance()的第二個參數可以指定要從那個Block讀取資料。
web3.eth.defaultBlock默認是latest,意思就是從最新的Block讀取該帳戶的餘額。
/* Get Balance Sync */
var balance = web3.fromWei(web3.eth.getBalance(web3.eth.accounts[0]), 'ether').toFixed(2);/* Get Balance Async */
web3.eth.getBalance(web3.eth.accounts[0],web3.eth.defaultBlock,function(error,result){
if(error){
// error handle
} esle {
var balance = web3.fromWei(result,'ether').toFixed(2);
}
});
#Web3 Lock/Unlock Account
上鎖和解鎖帳戶。
對於某些特定的操作必須先把帳戶先unlock才能進行,例如sendTransaction()相關操作。
web3.personal.unlockAccount()的第三個參數duration可以設定要解鎖多久。
若使用者連接的Etherum節點是Testrpc或Metamask,可以不須作lock/unlock動作。
若是在Geth環境下,則在sentd transaction前必須先unlock帳戶。
/* Lock Account */
web3.personal.lockAccount(account, passwd, function(error, result){
if(error) {
// error handle
} else {
// do something
}
});
/* Unlock Account */
web3.personal.unlockAccount(account, passwd, duration,function(error, result){
if(error) {
// error handle
} else {
// do something
}
});
#Web3 Send Transaction
傳送交易。
web3.eth.sendTransaction()的第一個參數txnObject是一個JSON format的物件。
txnObject可以指定這次transaction的資訊。
=>from是指從哪個帳戶送出,若無指定默認是default account。
=>to是送到那個帳戶。
=>value則是要傳送的金額。
其他還有像是gas、 gasPrice、data、nonce…等參數可以指定。
傳送完後可以得到transaction hash,使用web3.eth.getTransactionReceipt(hash)去查詢transaction的狀態。
var txnObject = {
"from": fromAccount,
"to": toAccount,
"value": web3.toWei(1, 'ether'),
// "gas": 21000, // (optional)
// "gasPrice": 4500000, // (optional)
// "data": 'For testing', // (optional)
// "nonce": 10 // (optional)
};
web3.eth.sendTransaction(txnObject, function(error, result){
if(error) {
// error handle
} else {
var txn_hash = result; //Get transaction hash
}
});
#Web3 Deploy Contract
Deploy contract有兩種方式,
一種是使用Web3.js contract的new(),另一種是使用sendTransaction()的方式。
這裡只列出contract new()的方式,sendTransaction()方式可以從Web3ApIScript的範例中看到。
在deploy contract之前我們需要先complie contract的sol檔來獲得abi和bytecode。
利用abiDefinition建立contractInstance並將bytecode放入data欄位中。constructor_param則是contract 初始化所使用的參數。
使用contract new()來進行佈署。執行完new()之後,callback function一共會被呼叫兩次。
第一次回傳transaction hash,第二次則是contract address。
var contractInstance = web3.eth.contract(abi);
var params = {
from: fromAccount,
data: bytecode,
gas: gas
};
var constructor_param = 10;
//contract init
paramcontractInstance.new(constructor_param, params, function(error, result){
if(error) {
// error handle
} else {
if(result.address){
var contractAddress = result.address;
} else {
var txhash = result.transactionHash;
}
}
});
Web3 Interact Contract
與smart contract互動的方式主要分成,取得contract資料的call和改變contract資料的send。
使用call只是單純取得contarct資料,並不會改變contract的狀態,所以不會花費任何費用。
呼叫call()時要有contract abi和contract address。contract.METHOD.call()的METHOD是放contract中所定義的function名稱,以下面的例子就是getNum。
var contract = web3.eth.contract(abi);
var contractInstance = contract.at(address);
/* contractInstance.METHOD.call, METHOD=getNum is the function of contract*/
contractInstance.getNum.call(function(error, result) {
if (error) {
// error handle
} else {
// result is string
// do something
}
});
若想要改變contract中的資料就必須使用send。這裡的send指的是send transaction。
因為會改變contract中的資料,需要繳交手續費給礦工幫忙把資料紀錄在block中。
改變的資料一樣會存放在block中,等同於發起了一筆transaction。使用contract.METHOD.sendTransaction()來改變contract資料。
回傳該transaction的hash。METHOD一樣是指contract所定義的function名稱,下面例子就是setNum。parameterValue則是要賦予contract的新值。
var contract = web3.eth.contract(abi);
var contractInstance = contract.at(address);
var txnObject = {
from: fromAccount,
gas: estimatedGas
};// contractInstance.METHOD.sendTransaction, METHOD=setNum is the function of contract
var parameterValue = 5 ;
contractInstance.setNum.sendTransaction(parameterValue, txnObject,function(error, result){
if(error){
// error handle
} else {
// do something
}
});
沒有留言:
張貼留言