1. 程式人生 > >【以太坊系列-004】從原始碼搭建etherum,solidity編譯環境

【以太坊系列-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)