Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

部署並執行以太坊智能合約

3,132 views

Published on

how to deploy and invoke smart contract on Ethereum blockchain using Ethereum client and wallet

Published in: Technology

部署並執行以太坊智能合約

  1. 1. 部署、執行智慧合約 林修平
  2. 2. 部署、執行方式
  3. 3. 部署、執行方式 • ethereum client • geth(https://github.com/ethereum/go-ethereum/wiki/Building- Ethereum) • ethereum wallet • mist(https://github.com/ethereum/mist/releases)
  4. 4. Ethereum client • 建立private chain • geth --datadir “some_directory" --rpc --rpcport port --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --autodag --networkid number init custom_genesis.json { "nonce": "0x0000000000000042", "timestamp": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x0", "gasLimit": "0x800000", "difficulty": "0x400", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": { } }
  5. 5. Ethereum client • 使用console • geth --datadir “some_directory" --rpc --rpcport port --port "30303" --nodiscover -- rpcapi "db,eth,net,web3" --autodag --networkid number console • --datadir:儲存private chain的資料 • --rpc:指定rpc相關設定 • --nodiscover:不公開自己的節點資訊 • --networkid:指定網路的識別碼 • --autodag:加速mining的初始化過程
  6. 6. Ethereum client • 建立帳號 • personal:和account相關 • personal.newAccount() • personal.unlockAccount(“address”)
  7. 7. Ethereum client • 主要操作 • eth • eth.accounts, eth.accounts[i]:列出本機所有的或指定的account address • eth.getBalance(“address”) • eth.sendTransaction({from: “address”, to: “address”, value: interger, data: “hex numbers”, gas: interger, gasPrice: interger}) • 注意:value和gasPrice的單位是Wei • eth.sendTransaction({from: eth.accounts[0], to: “0xe9e3320773e818a80ef69f08f29965b97f247b0c”, data: ”0x88e687ea”}) • eth.getTransaction(“hash”), eth.getTransactionReceipt(“hash”)
  8. 8. Ethereum client • 節點資訊 • admin.nodeInfo:自己的節點資訊
  9. 9. Ethereum client • 節點資訊 • admin.nodeInfo:自己的節點資訊 • admin.peers:列出已連接的節點資訊 • admin.addPeer("enode://blablabla@ip:port")
  10. 10. Ethereum client • 挖礦 • miner.start() • miner.stop() • geth --datadir “some_directory" --rpc --rpcport port --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --autodag --networkid number --mine • geth attach http://localhost:port
  11. 11. Ethereum client • 換算 • web3.toWei(0.005566,”ether") //“5566000000000000” • web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
  12. 12. Ethereum client • 部署合約 • 從online compiler右側資訊的Web3 deploy欄位複製(contructor如 果需要參數,其參數要記得給值) Interface 利用Interface 產生新合約實例
  13. 13. Ethereum client • 執行合約 • 利用剛剛Web3 deploy裡的bikerenting變數 • bikerenting.owner():顯示owner address • bikerenting.rent.call({from: eth.accounts[0], value: web3.toWei(3,”ether”)}) • 在本機模擬執行,會顯示return值 • bikerenting.rent.sendTransaction({from: eth.accounts[0], value: web3.toWei(3,”ether”)}) • 廣播transaction,最終會放到鏈上 • bikerenting.isInUse.sendTransaction(true, {from: eth.accounts[0], value: web3.toWei(3,”ether”)})
  14. 14. Ethereum client • 執行合約 • 如果不是用console部署合約(即沒有一個變數儲存合約) • 用var var_name = eth.contract(Interface).at(“address”) • var_name.owner()
  15. 15. Ethereum client • event • rentingRecord(address renter, uint rentTime, uint unitsOfTime); web3.sha3(“rentingRecord(address,uint256,uin256)”)
  16. 16. Ethereum client • event • listener • var rentEvent = bikerenting.rentingRecord({fromBlock:integer, toBlock:’latest’}); • rentEvent.watch(fucntion(err, result){…}); • rentEvent.get(function(err, logs){…}); • rentEvent.stopWatching();
  17. 17. Ethereum wallet
  18. 18. Ethereum wallet 建立新合約 觀察/操作已建立合約
  19. 19. Ethereum wallet 由哪個account 建立合約 可指定附帶多少ether 1.給solidity程式碼 2.直接給byte code
  20. 20. Ethereum wallet
  21. 21. Ethereum wallet 選擇要建立的合約並 給constructor執行所需要的 參數數值
  22. 22. Ethereum wallet 選擇手續費高低
  23. 23. Ethereum wallet 顯示從wallet執行的每個transaction 及每個transaction的目前confirmaiton數
  24. 24. Ethereum wallet 該transaction的hash值 要執行的function的名稱 的hash值的前四byte
  25. 25. Ethereum wallet 宣告成public的變數都會顯示在這 選擇function來執行
  26. 26. Ethereum wallet 給該function所需要的參數的值 選擇由哪個 account執行 附帶多少ether
  27. 27. Ethereum wallet 2a5dda47是function 名稱的hash值的前四byte 參數的值接在後面 ,一個值32byte
  28. 28. Ethereum Wallet • 無法知道transaction執行結果,除非真的執行成功並從參數看到預期的 變化 • 在console裡用eth.getTransactionReceipt(“hash”)查詢transaction 執行結果 • 還沒被放進鏈裡會顯示null • 執行失敗(throw)會吃掉所有gas
  29. 29. Ethereum client • 其他功能 • --rpccorsdomain “ip:port” • “*” :授權任何人使用rpc。危險 • 利用ipc將wallet接上client • ipcpath • mac : ~/Library/Ethereum/geth.ipc • linux : ~/.ethereum/geth.ipc • windows : ~/AppData/Roaming/Ethereum/geth.ipc • ipcapi:指定ipc可用哪些API • "admin,db,eth,debug,miner,net,shh,txpool,personal,web3"
  30. 30. • web3.js(https://github.com/ethereum/web3.js/) • Console Command Options • https://github.com/ethereum/go-ethereum/wiki/Command-Line- Options • Javascript API • https://github.com/ethereum/wiki/wiki/JavaScript-API

×