<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    狼愛上貍

    我胡漢三又回來了

    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 狼愛上貍 閱讀(763) 評論(0)  編輯  收藏 所屬分類: LINUX

    主站蜘蛛池模板: 亚洲AV综合色区无码一二三区| www免费黄色网| 亚洲成AⅤ人影院在线观看| 中文字幕在线免费看| 亚洲精品在线视频观看| 日韩午夜免费视频| a级毛片毛片免费观看永久| 亚洲理论片中文字幕电影| 国产成人在线免费观看| 今天免费中文字幕视频| 亚洲日韩久久综合中文字幕| 国产成人亚洲合集青青草原精品 | 可以免费观看的一级毛片| 在线人成免费视频69国产| 亚洲天堂2017无码中文| 久久亚洲国产精品123区| 一区二区无码免费视频网站| 国产精品1024在线永久免费| avtt天堂网手机版亚洲| 亚洲女久久久噜噜噜熟女| 久久久久国色AV免费观看性色| 国产无限免费观看黄网站| 亚洲最大无码中文字幕| 亚洲成色在线影院| 免费A级毛片无码视频| 在线观看亚洲专区| 亚洲国产电影在线观看| 亚洲熟妇无码八AV在线播放| 午夜寂寞在线一级观看免费| 91成人在线免费视频| 精品亚洲成A人无码成A在线观看 | 久久亚洲日韩精品一区二区三区| www亚洲精品少妇裸乳一区二区| 日韩欧毛片免费视频| a级在线免费观看| 黄色a三级免费看| 亚洲欧美日韩综合久久久| 亚洲成a人片7777| 亚洲日本精品一区二区| 亚洲一区二区三区偷拍女厕| 四虎影视免费永久在线观看|