イーサー坊ネットワークの構築、契約のコンパイル、導入
7735 ワード
イーサー坊ネットワークの構築、契約のコンパイル、導入
ローカルにイーサー坊のプライベートチェーンを構築し、スマート契約の開発テストを行います.開発されたインテリジェント契約切替インタフェースは、エーテル坊公有チェーンに配備されています.
オープンソースツールのインストール install Go compiler go-ethereumコンパイルインストール 太坊インテリジェント契約言語solidityで をインストール
プライベートチェーンの構築プライベートチェーンデータ を格納するフォルダを作成する. gethを使用して をロードオープンノード コンソールを開き、いくつかのJSのインタラクションを実現します.この環境には、イーサー坊を操作するためのJavaScriptオブジェクトが内蔵されています.これらのオブジェクトを直接使用することができます.これらのオブジェクトは主に次のとおりです.アカウント を作成インテリジェント契約書作成 スマート契約バイトコードとABI を取得
バイトコード
abi
コードコピー先https://remix.ethereum.org、コンパイルし、バイトコードとABIをコピーします. bejsonでグラデーションABIを文字列に変換http://www.bejson.com abiによる契約オブジェクト の作成見積手数料 導入契約は、便宜上、コールバック関数 を設定する.契約メソッド を呼び出す
Ethernetプライベートネットワークによる複数のノードの作成
創世ブロックの初期化
マルチノード接続
創世ブロックによるブロックチェーンの初期化
genesis block file example創世ブロックJSONファイル を生成ブロックチェーンを初期化し、ブロックデータ を格納するフォルダを作成する.端末 を開く. minerのcoinbaseアカウント を設定する
ローカルにイーサー坊のプライベートチェーンを構築し、スマート契約の開発テストを行います.開発されたインテリジェント契約切替インタフェースは、エーテル坊公有チェーンに配備されています.
オープンソースツールのインストール
プライベートチェーンの構築
mkdir privateChain
cd privateChain
geth --networkid 123 --dev --datadir data1 --rpc --rpcaddr 192.168.11.243 --rpcport 8989 --port 3000
// --identity ID
// --networkid id, id
// --dev
// --datadir
// --rpc HTTP-RPC
// --rpcaddr HTTP-RPC ip
// --rpcport HTTP-RPC (default:8545)
// --port (default:30303)
// --nodiscover ,
cd /home/jianhuaixie/blockchain/privateChain/data1
geth attach ipc:geth.ipc
- eth:
- net: p2p
- admin:
- miner: &
- personal:
- txpool:
- web3: ,
personal.listAccounts //
personal.newAccount("jianhuaixie") //
eth.coinbase // 0
eth.getBalance(eth.coinbase) // coinbase
miner.start(); // ,Block sealing failed err="waiting for transactions" ,Geth , , ,
miner.stop(); //
user1=eth.accounts[0]
user2=eth.accounts[1]
eth.blockNumber //
personal.unlockAccount(user1) // , user1,
eth.sendTransaction({from:user1,to:user2,value:web3.toWei(3,"ether")}) //
eth.blockNumber
miner.setEtherbase(eth.accounts[1]) //
pragma solidity ^0.4.21;
contract WiairRouteToken {
function multiply(uint a) constant returns(uint d){
return a*7;
}
}
バイトコード
{
"linkReferences": {},
"object": "6060604052341561000f57600080fd5b60b18061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a7230582072d602b915fc4c683527b7f04dbf273e779da8101cb0bcfbe7894b9664c139fb0029",
"opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH2 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xB1 DUP1 PUSH2 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3F JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0xC6888FA1 EQ PUSH1 0x44 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE ISZERO PUSH1 0x4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x62 PUSH1 0x4 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP2 SWAP1 POP POP PUSH1 0x78 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH1 0x7 DUP3 MUL SWAP1 POP SWAP2 SWAP1 POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH19 0xD602B915FC4C683527B7F04DBF273E779DA810 SHR 0xb0 0xbc CREATE2 0xe7 DUP10 0x4b SWAP7 PUSH5 0xC139FB0029 ",
"sourceMap": "26:114:0:-;;;;;;;;;;;;;;;;;"
}
abi
[
{
"constant": true,
"inputs": [
{
"name": "a",
"type": "uint256"
}
],
"name": "multiply",
"outputs": [
{
"name": "d",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]
コードコピー先https://remix.ethereum.org、コンパイルし、バイトコードとABIをコピーします.
[{\"constant\":true,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"multiply\",\"outputs\":[{\"name\":\"d\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]
> var abi = JSON.parse('[{\"constant\":true,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"multiply\",\"outputs\":[{\"name\":\"d\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]')
> var myContract = web3.eth.contract(abi)
> var bytecode = "0x " //0x 16 ,
// gas , , gas
> web3.eth.estimateGas({data:bytecode})
> personal.unlockAccount(user1)
> var contractInstance = myContract.new({data:bytecode gas:1000000,from:user1},
function(e,contract){
if(!e){
if(!contract.address){
console.log("Contract transaction send:Transation Hash:"+contract.transactionHash+" waiting to be mined...");
}else{
console.log("Contract mined Address:"+contract.address);
console.log(contract);
}
}else{
console.log(e)
}
}
)
> miner.start();
> contractInstance.multiply(6)
Ethernetプライベートネットワークによる複数のノードの作成
創世ブロックの初期化
geth --networkid 123 --datadir data1 --rpc --rpcaddr 192.168.11.243 --rpcport 8989 --port 3000 console
// , rpcaddr
// , rpcport port datadir
マルチノード接続
> admin.nodeInfo.enode
// Enode url id
> web3.net.peerCount //
> admin.peers //
> admin.addPeer("enode://...")
創世ブロックによるブロックチェーンの初期化
genesis block file example
{
"config":{
"chainId":15,
"homesteadBlock":0,
"eip155Block":0,
"eip158Block":0
},
"difficulty":"4",
"gasLimit":"2100000",
"alloc":{
"0xd8fac16ffe306a7e0006eb1e3817cc7039796e48":{
"balance":"300000"
},
"0xdc59af2a8c245af2f526fabef80514291bb8b937":{
"balance":"400000"
}
}
}
cat > genesis.json // genesis file
geth init genesis.json --datadir blockchainData
geth --networkid 123 --datadir blockchainData console
miner.setEtherbase("0xd8fac16ffe306a7e0006eb1e3817cc7039796e48")