【以太坊系列-004】從原始碼搭建etherum,solidity編譯環境
使用ubuntu1804(由ubuntu-18.04.1-server-amd64.iso安裝)環境
說明:
本文主要介紹基於ubuntu1804的環境,由原始碼構建etherum,以及solidity的編譯環境。
1, 安裝go
mkdir -p /home/001_code/001_golang/
cd /home/001_code/001_golang/
wget https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz
vi ~/.bashrc
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export GOPATH=$GOROOT/go
export PATH=$PATH:$GOBIN
2, 安裝 geth
mkdir -p /home/001_code/002_etherum
# git clone https://github.com/ethereum/go-ethereum
#cd go-ethereum
# apt install make
# apt install gcc
#make geth
vi ~/.bashrc
export PATH=$PATH:/home/001_code/002_etherum/go-ethereum/build/bin/
3, 安裝solidity
# 下載 solidity 0.4.25 版本
mkdir -p /home/001_code/003_solidity/solidity
git clone -b v0.4.25 https://github.com/ethereum/solidity.git
cd /home/001_code/003_solidity/solidity
chmod 777 scripts/* -R
安裝依賴
$ ./scripts/install_deps.sh
編譯
./scripts/build.sh
編譯生成的目標檔案:./build/solc/solc
4、編譯程式碼,並能看到指令
solc counter.sol --asm --bin > counter.txt
solc counter_extra.sol --asm --bin > counter_extra.txt
5、編譯出api資料
# solc counter.sol --abi
======= counter.sol:Counter =======
Contract JSON ABI
[{"constant":true,"inputs":[],"name":"getCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"increment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
6、僅編譯二進位制資料
solc counter.sol --bin
======= counter.sol:Counter =======
Binary:
608060405234801561001057600080fd5b506000808190555060cd806100266000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063a87d942c14604e578063d09de08a146076575b600080fd5b348015605957600080fd5b506060608a565b6040518082815260200191505060405180910390f35b348015608157600080fd5b5060886093565b005b60008054905090565b6001600054016000819055505600a165627a7a723058208cbce8efa256210b41902744a9725123f4ff260a16a0d99e87eb1d78b14a93720029
7、生成web3deploy程式碼
1) 程式碼結構
cd /home/001_code/004_contract
# tree
├── counter_extra.sol
├── counter_extra.txt
├── counter.sol
└── counter.txt
# cat counter.sol
pragma solidity ^0.4.20;
contract Counter {
uint count;
function Counter() public
{
count = 0;
}
function increment() public {
count = count + 1;
}
function getCount() constant returns (uint) {
return count;
}
}
2)生成abi資料
# solc counter.sol --abi
abi_data = [{"constant":true,"inputs":[],"name":"getCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"increment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
3) 生成二進位制資料
# solc counter.sol --bin
bin_data = '608060405234801561001057600080fd5b506000808190555060cd806100266000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063a87d942c14604e578063d09de08a146076575b600080fd5b348015605957600080fd5b506060608a565b6040518082815260200191505060405180910390f35b348015608157600080fd5b5060886093565b005b60008054905090565b6001600054016000819055505600a165627a7a723058208cbce8efa256210b41902744a9725123f4ff260a16a0d99e87eb1d78b14a93720029'
4) 計算gas
solc counter.sol --gas
======= counter.sol:Counter =======
Gas estimation:
construction:
5107 + 41000 = 46107
external:
getCount(): 402
increment(): 20375
好像部署合約的固定gas是 4700000
5) 組裝web3deploy程式碼
var counterContract = web3.eth.contract(abi_data);
var counter = counterContract.new(
{
from: web3.eth.accounts[0],
data: bin_data,
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
6) 拷貝 web3deploy中的程式碼,到geth控制檯
啟動並部署即可。
(其中 生成區塊鏈的操作可以參考:
https://blog.csdn.net/linshenyuan1213/article/details/83444898)