最近在學習以太坊,就把一點學習筆記記錄分享下來,希望對剛入門跟我一樣迷茫的人有點幫助。
首先,所有需要用到的指令都在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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!