狼愛上貍

          我胡漢三又回來了

          Ubuntu下geth搭建私有鏈+部署智能合約+與合約交互筆記

          最近在學習以太坊,就把一點學習筆記記錄分享下來,希望對剛入門跟我一樣迷茫的人有點幫助。
          首先,所有需要用到的指令都在https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console ,多記住一些方法方便使用
          第一步:按照官方文檔,安裝好Geth客戶端(https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum),這個比較簡單。
          第二步:搭建自己的私有鏈
          搭建私有鏈之前應該準備的東西:

              Custom Genesis File
              Custom Data Directory
              Custom NetworkID
              (Recommended) Disable Node Discovery


          Genesis file: 創世區塊是所有區塊的根,區塊鏈開始的地方--第一塊、區塊0、以及僅有的一塊沒有父區塊的區塊。協議保證了不會有其他節點根你的版本的區塊鏈達成一致,除非他們跟你有相同的創世區塊,因此,只要你想,你就可以創建任意多個私有測試區塊鏈。
          CustomGenesis.json
          {
          "nonce": "0x0000000000000042", "timestamp": "0x0",
          "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "extraData": "0x0", "gasLimit": "0x8000000", "difficulty": "0x400",
          "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "coinbase": "0x3333333333333333333333333333333333333333", "alloc": { }
          }
          稍后你將會用到這個文件:geth init /path/to/CustomGenesis.json

          用于私有網絡的命令行參數
          --nodiscover 使用這個參數,你的節點就不會被其他人發現,除非手動添加你的節點。否則,就只有一個被無意添加到一個陌生區塊鏈上的機會,那就是跟你有相同的genesis文件和networkID。
          --maxpeers 0 如果你不想有人連上你的測試鏈,就用maxpeers 0。或者,你可以調整參數,當你確切的知道有幾個節點要連接上來的時候。
          --rpc 允許RPC操作你的節點。這個參數在Geth上是默認的。
          --rpcapi "db,eth,net,web3" 這個命令指示了允許通過RPC訪問的命令。默認情況下,Geth允許web3。
          --rpcport "8080"
          --rpccorsdomain "http://chriseth.github.io/browser-solidity/"
          --datadir "/home/TestChain1" 私有鏈存放路徑(最好跟公有鏈路徑不同)
          --port "30303" 網絡監聽端口,用來和其他節點手動連接
          --identity “TestnetMainNode" 用來標識你的節點的,方便在一大群節點中識別出自己的節點

          了解完上面這幾個內容之后,就可以開始搭建自己的私有鏈了,用如下命令:
          geth --identity "MyNodeName" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir "/home/to/TestCahin1" --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 init /path/to/CustomGenesis.json
          上面這條命令就初始化了創世區塊,存放區塊鏈數據的路徑"/home/to/TestCahin1"根據自己需要修改一下。/path/to/CustomGenesis.json為存放CustomGenesis.json的地方。下面進入geth客戶端:
          geth --identity "MyNodeName" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir "/home/to/TestCahin1" --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 console
          現在就進入到了自己的私有鏈中,啟動成功之后會顯示如下圖:
          我的就存放在自己用戶目錄下的etherTest目錄下。如果覺得每次進入客戶端時要寫這么一大堆指令很麻煩,完全可以把它寫到一個文件中,給文件賦予可執行權限,就不必這么麻煩了。例如,我把這個指令寫在了gethLaunch文件下:
          #!/bin/bash
          geth --identity "asurily" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir ~/etherTest --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 console
          然后執行chmod +x gethLaunch
          這樣我就不必每次都都輸入那么一長串了,直接輸入gethLaunch就可以了。

          第三步、創建與部署智能合約
          1、首先得有一個有ether的賬戶
          私有鏈中,ether很容易獲得。用personal.newAccount("111")創建一個賬戶,111為密碼。然后可以用eth.accounts查看所有的賬戶。
          可以看見我創建成功,并且查看了有幾個賬戶。
          以太坊中默認第一個地址為今后的挖礦分配獎金的地址,當然可以修改這個地址。miner.setEtherbase(eth.accounts[1])進行地址更換;
          剛創建的賬戶中余額為0,可以用eth.getBalance("0xa65bf431f4f07a22296dc93a7e6f4fe57642bee6")查看余額。如果是第一個地址,啟用挖礦miner.start(),稍等一下就能有余額了。
          如果你不想進行挖礦,也有一個方法獲得ether,就是在CustomGenesis.jso文件中加入
          "alloc":
          {
          "<your account address e.g. 0x1fb891f92eb557f4d688463d0d7c560552263b5a>":
          { "balance": "20000000000000000000" }
          }
          然后再重新初始化,就能在你的賬戶中出現20個ether。

          2、創建和部署智能合約
          我就是部署的官網上的示例。
          1)編寫智能合約源代碼:source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
          2)編譯:contract = eth.compile.solidity(source).test。本來編譯之后得到的是一個map類型,test就是那個key,所以這樣就能得到相應的對象了。
          保存下其中的code和abiDefinition,后面會用上:
          code = contract.code
          abi = contract.info.abiDefinition
          3)創建智能合約對象:MyContract = eth.contract(abi)。
          4)部署合約。部署合約就是向以太坊上發送一個交易,目的地址不寫就是發送給區塊鏈。
          contract = MyContract.new(arg1, arg2, ..., {from: primaryAddress, data: evmByteCodeFromPreviousSection})
          例如:contract = MyContract.new({from:eth.accounts[0],data:code})
          此時,可能會提示你賬戶不可用,就是沒有解鎖,用personal.unlockAccount()解鎖即可。然后在部署,會得到如下所示:
          如上所示,此時的地址是undefined,因為交易才發送出去,沒有礦工挖礦,沒有寫進區塊鏈,所以還不知道。現在可以用txpool.status查看到
          啟動挖礦,把交易寫進區塊鏈。miner.start(),然后關閉挖礦miner.stop()
          挖礦之后,交易就寫進區塊鏈了。此時再查看contract就能看見有地址了:
          至此,合約成功部署在了以太坊上。

          5)與合約交互
          我們把合約部署到以太坊上不是目的,目的是能與部署在以太坊上的合約進行交互。
          與合約交互要用到兩個東西,abi和address。abi(應用程序二進制接口)用來創建合約對象;合約地址address用來定位在以太坊上的那個地址的合約。
          創建合約對象:Multiply7 = eth.contract(abi);
          定位在addres處的那個合約:myMultiply7 = Multiply7.at(address)
          調用合約中的方法,應該有兩種方式進行調用,一是call(),它直接返回結果,不會寫進區塊鏈;二是sendTransaction(),它是一筆交易,會寫到區塊鏈中,返回值是交易的哈希值。
          成功得到結果。

          第四步、再次調用部署好的合約
          之前一直沒有弄明白,既然合約都已經部署好了在區塊鏈上,那么下次肯定還會再次調用它,但是我一直都不知道怎么調用它。雖然現在也不怎么明白,好像有register之類的方法,還沒完全弄清楚。現在我的笨方法就是保存下來合約地址根合約的abi。既然調用合約時的兩個重要步驟就是用abi創建合約對象和定位區塊鏈中合約,所以就保存下來abi和address。
          退出私有鏈,然后重新進入,那么之前所有的變量都不存在了。
          記錄abi:
          記錄地址:
          然后就能成功調用address處的合約了。


          方法特別笨,手動保存了abi和address,肯定還有別的方法,再接再厲。
          ---------------------
          作者:yooliee
          來源:CSDN
          原文:https://blog.csdn.net/yooliee/article/details/72818932
          版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

          posted on 2019-05-10 10:39 狼愛上貍 閱讀(767) 評論(0)  編輯  收藏 所屬分類: LINUX

          主站蜘蛛池模板: 耒阳市| 阜城县| 兰州市| 洛川县| 司法| 二连浩特市| 三明市| 门源| 平遥县| 仁怀市| 海安县| 沁阳市| 泸西县| 且末县| 平遥县| 黄大仙区| 龙岩市| 邵东县| 永新县| 岳西县| 唐河县| 古田县| 阜南县| 黔东| 玛沁县| 大悟县| 黄梅县| 明光市| 渭源县| 滕州市| 手游| 南昌市| 中卫市| 郑州市| 西乌| 辉南县| 息烽县| 延庆县| 翁牛特旗| 精河县| 迁安市|