以太坊系列(二)---Ubuntu20.04安装以太坊开发环境并建立私有链
目錄
- 安裝版本說明
- 環(huán)境搭建
- 搭建以太坊
- 安裝Nodejs
- 安裝Solidity
- 安裝Truffle
- 以太坊開發(fā)
安裝版本說明
-
Ubuntu版本:20.04
-
Ethereum版本:1.10.1-stable
-
Nodejs版本:v10.19.0
-
Solidity版本:0.7.4
-
Truffle版本:v5.3.0 - a development framework for Ethereum
環(huán)境搭建
搭建以太坊
安裝命令:
sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install ethereum具體安裝過程如下:
使用如下命令查看以太坊版本:
geth version出現(xiàn)如下圖所示的內(nèi)容則說明安裝成功:
安裝Nodejs
安裝命令:
sudo apt-get install -y nodejs出現(xiàn)下圖內(nèi)容則說明已安裝過:
圖5 安裝Nodejs的過程使用如下命令查看Nodejs版本:
安裝Solidity
安裝命令:
sudo apt-get install npm sudo snap install solc安裝過程如下:
出現(xiàn)如下圖所示的內(nèi)容則說明安裝成功:
安裝Truffle
安裝命令:
sudo npm install -g truffle安裝過程比較長,出現(xiàn)如下圖所示的內(nèi)容則說明安裝成功:
以太坊開發(fā)
所需命令:
mkdir blockchain cd blockchain mkdir consortium_blockchain cd consortium_blockchain vim genesis.json創(chuàng)建過程比較簡單,故不附上截圖。
寫入內(nèi)容命令:
vim genesis.json將下面的內(nèi)容寫入genesis.json文件中:
{"config": {"chainId": 8434,"homesteadBlock": 1,"eip150Block": 2,"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000","eip155Block": 3,"eip158Block": 3,"byzantiumBlock": 4,"alien": {"period": 2,"epoch": 300,"maxSignersCount": 5,"minVoterBalance": 100000000000000000000,"genesisTimestamp": 1536136198,"signers": ["0x393faea80893ba357db03c03ee73ad3e31257469","0x30d342865deef24ac6b3ec2f3f8dba5109351571","0xd410f95ede1d2da66b1870ac671cc18b66a97778"]}},"nonce": "0x0","timestamp": "0x5b8f92c2","extraData": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","gasLimit": "0x47b760","difficulty": "0x1","mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000","coinbase": "0x0000000000000000000000000000000000000000","alloc": {"cbfc29c31a31c869f9eb59a084d9019965978a7e": {"balance": "0x31d450f18af132720000000"},"393faea80893ba357db03c03ee73ad3e31257469": {"balance": "0xd3c21bcecceda1000000"},"30d342865deef24ac6b3ec2f3f8dba5109351571": {"balance": "0xd3c21bcecceda1000000"},"d410f95ede1d2da66b1870ac671cc18b66a97778": {"balance": "0xd3c21bcecceda1000000"},"a25dc63609ea7ea999033e062f2ace42231c0b69": {"balance": "0xd3c21bcecceda1000000"}},"number": "0x0","gasUsed": "0x0","parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" }在終端輸入“:wq”保存并退出。
重要參數(shù)說明:
| chainID | 指定了獨(dú)立的區(qū)塊鏈網(wǎng)絡(luò) ID。網(wǎng)絡(luò) ID 在連接到其他節(jié)點(diǎn)的時(shí)候會用到,以太坊公網(wǎng)的網(wǎng)絡(luò) ID 是 1,為了不與公有鏈網(wǎng)絡(luò)沖突,運(yùn)行私有鏈節(jié)點(diǎn)的時(shí)候要指定自己的網(wǎng)絡(luò) ID。不同 ID 網(wǎng)絡(luò)的節(jié)點(diǎn)無法相互連接 |
| homesteadBlock | 取值為0表示正在使用homesteadBlock版本。以太坊的發(fā)展分成了四個(gè)階段:(每個(gè)階段進(jìn)步到下一個(gè)階段都是通過硬分叉的方式實(shí)現(xiàn)的)1.Frontier(前沿):2015年7月30日,以太坊發(fā)布了Frontier階段,此時(shí)的軟件還不太成熟,但可以進(jìn)行基本的挖礦測試去中心化應(yīng)用(Dapps),該階段參與者主要為開發(fā)者。 2.HomesteadBlock(家園):在2016年3月14日(圓周率節(jié)),以太坊發(fā)布了HomesteadBlock階段。以太坊開始平穩(wěn)運(yùn)行,提供了圖形界面的錢包,普通用戶也可以體驗(yàn)和使用以太坊。 3.Metropolis(大都會):Metropolis被分成了兩個(gè)階段:Byzantium(拜占庭)和Constantinople (居士坦丁堡)。 2017.10.16,以太坊拜占庭硬分叉成功,引入了包括:zk-SNARKs(簡明非交互零知識證明)、revert功能、return和抽象賬戶。 2019年2月底,以太坊區(qū)塊鏈的第7,080,000區(qū)塊作為激活點(diǎn)正式開啟君士坦丁堡硬分叉,點(diǎn)在于將以太坊的共識機(jī)制由PoW向PoW+PoS混合機(jī)制過渡,從而使整個(gè)以太坊網(wǎng)絡(luò)更加的輕盈、快捷與安全。按官方說法,具體在現(xiàn)有以太坊PoW主網(wǎng)上進(jìn)行升級的有以下5個(gè)方面:1).EIP 145:給EVM增加移位相關(guān)指令,包括左移SHL,邏輯右移SHR,算術(shù)右移SAR(2).EIP 1014:產(chǎn)生合約地址的一種新規(guī)則,與狀態(tài)通道有關(guān)。規(guī)則為keccak256( 0xff ++ address ++ salt ++ keccak256(init_code)))[12:](3).EIP 1052:為EVM增加EXTCODEHASH指令,這個(gè)指令可以獲得一個(gè)合約bytecode的keccak256的hash值;(4).EIP 1283:修改EVM的SSTORE指令gas計(jì)算方式,預(yù)計(jì)會減少許多合約的gas消耗,需要硬分叉支持;(5).EIP 1234:將是潛在最有爭議的提案,也需要硬分叉支持,它包括難度炸彈(Difficulty Bomb)協(xié)議推遲12個(gè)月和挖礦獎(jiǎng)勵(lì)調(diào)整,難度炸彈使挖礦難度隨時(shí)間推移越來越高,挖礦獎(jiǎng)勵(lì)調(diào)整將挖礦獎(jiǎng)勵(lì)從3個(gè)降低到2個(gè);4.Serenity(寧靜) |
| eip155Block | eip是ethereum improvement proposal的縮寫,你的鏈不會因?yàn)橐驗(yàn)檫@些提議分叉,故設(shè)置為“0”即可 |
| eip158Block | eip是ethereum improvement proposal的縮寫,你的鏈不會因?yàn)橐驗(yàn)檫@些提議分叉,故設(shè)置為“0”即可 |
| mixhash | 與nonce配合用于挖礦,由上一個(gè)區(qū)塊的一部分生成的hash。注意他和nonce的設(shè)置需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節(jié)所描述的條件。 |
| nonce | nonce就是一個(gè)64位隨機(jī)數(shù),用于挖礦,注意他和mixhash的設(shè)置需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節(jié)所描述的條件。 |
| difficulty | 設(shè)置當(dāng)前區(qū)塊的難度,如果難度過大,cpu挖礦就很難,這里設(shè)置較小難度 |
| alloc | 用來預(yù)置賬號以及賬號的以太幣數(shù)量,因?yàn)樗接墟溚诘V比較容易,所以我們不需要預(yù)置有幣的賬號,需要的時(shí)候自己創(chuàng)建即可以。 |
| coinbase | 礦工的賬號,隨便填 |
| timestamp | 設(shè)置創(chuàng)世塊的時(shí)間戳 |
| parentHash | 上一個(gè)區(qū)塊的hash值,因?yàn)槭莿?chuàng)世塊,所以這個(gè)值是0 |
| extraData | 附加信息,隨便填,可以填你的個(gè)性信息 |
| gasLimit | 該值設(shè)置對GAS的消耗總量限制,用來限制區(qū)塊能包含的交易信息總和,因?yàn)槲覀兪撬接墟?#xff0c;所以填最大。 |
執(zhí)行如下命令初始化創(chuàng)世區(qū)塊:
geth --datadir "./myblockchain" init genesis.json具體操作過程如下圖所示:
創(chuàng)建成功之后,當(dāng)前目錄會新增myblockchain文件夾,同時(shí)包含geth和keystore兩個(gè)文件夾。
geth保存的是這條區(qū)塊鏈上的區(qū)塊數(shù)據(jù);
keystore保存的是這條區(qū)塊鏈上的用戶信息
可通過下面的命令查看myblockchain文件夾的目錄結(jié)構(gòu):
sudo apt install tree tree myblockchain下圖分別是這兩條命令的執(zhí)行過程:
注意:命令行2的執(zhí)行需在myblockchain文件夾的上一級執(zhí)行。如下圖所示:
啟動(dòng)命令:
geth --identity "myethereum" --rpc --rpcaddr "127.0.0.1" --port 30304 --rpcport "7545" --rpccorsdomain "*" --datadir ./myblockchain --rpcapi "db,eth,net,web3,admin,personal" --networkid 5777 console --allow-insecure-unlock啟動(dòng)命令中的重要參數(shù)說明:
| identity | 區(qū)塊鏈的標(biāo)識,用于標(biāo)識目前網(wǎng)絡(luò)的名字 |
| rpc | 啟動(dòng)rpc通信 |
| rpcaddr | 連接rpc的地址,默認(rèn)為localhost,為了方便訪問建議使用本機(jī)IP地址 |
| port | 網(wǎng)絡(luò)監(jiān)聽端口,默認(rèn)30303 |
| rpcport | 連接rpc的端口,默認(rèn)為8545 |
| rpccorsdomain | 指定什么url能連接到你的節(jié)點(diǎn)執(zhí)行rpc定制端任務(wù),如果輸入是“*”,則任何url都可以連接到你的rpc實(shí)例。 |
| datadir | 當(dāng)前區(qū)塊鏈數(shù)據(jù)存放的位置 |
| rpcapi | 設(shè)置允許rpc的客戶端,一般為db,eth,net,web3 |
| networkid | 設(shè)置當(dāng)前區(qū)塊鏈的網(wǎng)絡(luò)ID,用于區(qū)分不同的網(wǎng)絡(luò),是一個(gè)數(shù)字,公鏈為1;這個(gè)和創(chuàng)世塊文件的chainid沒有直接關(guān)聯(lián) |
| console | 啟動(dòng)命令行模式,可以在geth中執(zhí)行命令 |
| init | 指定創(chuàng)世塊文件的位置,并創(chuàng)建創(chuàng)世塊 |
啟動(dòng)過程截圖:
為了方便使用,經(jīng)常要打開多個(gè)終端連接到同一個(gè)私鏈節(jié)點(diǎn),可以采用如下命令:
cd blockchain/consortium_blockchain/myblockchain geth attach geth.ipc運(yùn)行效果如下圖所示:
以太坊的javascript控制臺中內(nèi)置了一些以太坊對象,通過這些對象我們可以很方便的與以太坊交互:eth:提供了操作區(qū)塊鏈相關(guān)的方法
net:提供了查看p2p網(wǎng)絡(luò)狀態(tài)的方法
admin:提供了管理節(jié)點(diǎn)相關(guān)的方法
miner:提供啟動(dòng)和停止挖礦的方法
personal:提供了管理賬戶的方法
txpool:提供了查看交易內(nèi)存池的方法
web3:除了包含以上對象中有的方法,還包含了一些單位換算的方法
(1)創(chuàng)建賬戶
在geth終端就可以執(zhí)行啟動(dòng)挖礦、創(chuàng)建賬戶等操作,初始化后系統(tǒng)無賬號,需要?jiǎng)?chuàng)建新賬號,才能啟動(dòng)挖礦:
eth.accounts執(zhí)行效果截圖:
目前賬戶為空,故新建賬戶:
personal.newAccount("12345678");執(zhí)行效果截圖:
獲取該賬戶的余額:
eth.getBalance(eth.accounts[0])執(zhí)行結(jié)果圖:
(2)挖礦
挖礦所得的獎(jiǎng)勵(lì)會進(jìn)入礦工的賬戶,這個(gè)賬戶叫做coinbase,默認(rèn)情況下coinbase是本地賬戶中的第一個(gè)賬戶,如下圖所示:
現(xiàn)在的coinbase是user1,要想使挖礦獎(jiǎng)勵(lì)進(jìn)入其他賬戶,通過miner.setEtherbase()將其他賬戶設(shè)置成coinbase即可:
挖到區(qū)塊以后,user2里面應(yīng)該就有余額了:
getBalance()返回值的單位是wei,wei是以太幣的最小單位,1個(gè)以太幣=10的18次方個(gè)wei。
可以通過發(fā)送一筆交易,從user1轉(zhuǎn)移100個(gè)以太幣到user2:
圖21 要轉(zhuǎn)給他人的錢 圖22 轉(zhuǎn)賬失敗這里報(bào)錯(cuò)了,原因是賬戶每隔一段時(shí)間就會被鎖住,要發(fā)送交易,必須先解鎖賬戶,由于我們要從user1發(fā)送交易,所以要解鎖user1。輸入創(chuàng)建賬戶時(shí)設(shè)置的密碼,就可以成功解鎖賬戶:
然后再發(fā)送交易:
此時(shí),交易已被提交到交易池,可以通過查看txpool來驗(yàn)證:
pending表示已提交但還未被處理的交易,此處為0說明該交易已被處理。如果是1,則說明還未被處理,需要啟動(dòng)挖礦(miner.start(1))來進(jìn)行挖礦。
然后查看user2中的余額:
說明轉(zhuǎn)賬成功!
其中,挖礦過程如圖所示:
通過區(qū)塊號查看區(qū)塊:
通過區(qū)塊哈希查看區(qū)塊:
(3)停止挖礦
停止挖礦的命令:
miner.stop() 圖30 停止挖礦的操作總結(jié)
以上是生活随笔為你收集整理的以太坊系列(二)---Ubuntu20.04安装以太坊开发环境并建立私有链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地税局工资管理系统(论文+设计)新
- 下一篇: java 中vo、po、dto、bo、p