以太坊入門學習筆記
原文發佈於:區塊鏈項目導航:
首先預設安裝完成Ubuntu16.04環境。
註:需要獲得root使用者,按照以下步驟:
sudo passwd -u root
輸入密碼
sudo passwd root
設定root使用者密碼
安裝必要環境
git
sudo apt-get install git
跳出對話輸入:Y(下面類同)
安裝完成後查看git版本
git version
Curl
安裝Curl
sudo apt-get install curl
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash
NodeJS
安裝NodeJS
sudo apt-get install -y nodejs
安裝完成後查看NodeJS版本
nodejs -v
npm
安裝npm
sudo apt-get install npm
安裝完成後查看npm版本
npm -v
solc
安裝solc和solc-cli
sudo npm install -g solc solc-cli --save-dev
truffle
安裝truffle
sudo npm install -g truffle
安裝完成後查看版本
truffle version
testrpc
sudo npm install -g ethereumjs-testrpc
Geth
安裝Geth
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
安裝完成後查看版本資訊
geth version
go(可選)
安裝golang
wget https://storage.googleapis.com/golang/go1.10.1.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz
配置環境變數
cd ~ vi.bashrc
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
安裝完成查看版本
go env
go version
web3
安裝web3
npm install web3@^0.20.0
Ganache
安裝Ganache
wget https://github.com/trufflesuite/ganache/releases/download/v1.0.1/ganache-1.0.1-x86_64.AppImage
chmod -x ganache-1.0.1-x86_64.AppImage
./ganache-1.0.1-x86_64.AppImage
安裝完成後
配置啟動
初始化創世區塊
選擇目錄建立genesis.json檔案,編輯儲存。
{
"config": {
"chainId": xxxx(修改任一數字),
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000"(修改難度值,便於挖礦),
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
mixhash:和nonce配合用於挖礦。
nonce:和mixhash配合挖礦。
difficulty:設定當前區塊難度(這裡設定小點,便於挖礦)。
alloc:用於設定賬戶及帳號以太坊以太幣的數量。
coinbase:礦工帳號。
timestamp:時間戳記。
parentHash:上一個區塊的hash值,這裡是創世區塊所以為0.
extraData:附加資訊。
gasLimit:gasg消耗總量設定。
完成後運行命令初始化:
geth init 所在目錄/genesis.json
完成後輸出
啟動私人鏈
geth --identity "OneTestETH" --rpccorsdomain "*" --nodiscover --rpcapi "*" --cache=1024 --networkid 9999 console
說明各個參數作用:
nodiscover 使用這個命令可以確保你的節點不會被非手動添加你的人發現。否則,你的節點可能因為你與他有相同的創世檔案和網路ID而被陌生人的區塊鏈無意添加。
maxpeers 0 如果你不希望其他人串連到你的測試鏈,可以使用maxpeers 0。反之,如果你確切知道希望多少人串連到你的節點,你也可以通過調整數字來實現。
rpc 可啟用你節點的 rpc 服務。它在 geth 中通常被預設啟用。
rpcapi "db,eth,net,web3" 決定允許哪些 API 開放 rpc 服務。在預設情況下只啟用了 web3 api。
rpcport "8080" 將8000改變為你網路上開放的任何連接埠。Geth的預設設定是8080.
rpccorsdomain "https://xxxx.com" 這個可以指示什麼URL能串連到你的節點來執行RPC定製端任務。務必謹慎,輸入一個特定的URL而不是wildcard ( * ),後者會使所有的URL都能串連到你的RPC執行個體。
datadir "/home/TestChain1" 這是你的私人鏈資料所儲存在的資料目錄(在nubits下)。選擇一個與你以太坊公有鏈檔案夾分開的位置。
identity "TestnetMainNode" 這會為你的節點設定一個身份,使之更容易在端點列表中被辨認出來。這個例子說明了這些身份如何在網路上出現。
networkid 1999 數字類型,區分與其他的網路ID,以太坊公鏈的網路ID=1。必須區分,以放置錢包等誤認為是以太坊公鏈。 2=Morden (disused), 3=Ropsten, 4=Rinkeby,預設為1。
port 30303 P2P網路監聽連接埠,預設30303。
fast 這個命令是 Geth1.6.0之前的,只會被改成--syncmode=fast,但該命令繼續有效。配置此命令能夠快速的同步區塊。
cache=1024 程式內建的可用記憶體,單位MB。預設是16MB(最小值)。可以根據伺服器能力配置到56, 512, 1024 (1GB), or 2048 (2GB)。
建立解鎖賬戶
建立賬戶
personal.newAccount("jacky")
personal.newAccount("bill")
解鎖賬戶
personal.unlockAccount(eth.accounts[1],"jacky");
true
personal.unlockAccount(eth.accounts[2],"bill");
true
挖礦
開始挖礦
miner.start(1) 一個線程挖礦
停止挖礦
miner.stop()
普通轉賬
eth.sendTransaction({from: '寄件者', to: '接受者', value: web3.toWei(1, "ether")})
可能會遇到lock的情況,那麼把預設帳號解鎖
personal.unlockAccount("帳號", "密碼", 300)
常用命令:
查看賬戶:eth.accounts
查看餘額:web3.fromWei(eth.getBalance(帳號), "ether")
部署合約
http://remix.ethereum.org 在這裡左邊編輯代碼:
pragma solidity ^0.4.21;
contract hello {
string greeting;
function hello(string _greeting) public {
greeting = _greeting;
}
function say() constant public returns (string) {
return greeting; }
}
右邊Details產生部署代碼,對話方塊彈出,選擇WEB3DEPLOY-拷貝,粘貼到本地文字編輯器進行修改。
var _greeting = "hello ethereum" ;
var helloContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_greeting","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]);
var hello = helloContract.new(
_greeting,
{
from: web3.eth.accounts[2],
data: '0x608060405234801561001057600080fd5b506040516102a83803806102a8833981018060405281019080805182019291905050508060009080519060200190610049929190610050565b50506100f5565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061009157805160ff19168380011785556100bf565b828001600101855582156100bf579182015b828111156100be5782518255916020019190600101906100a3565b5b5090506100cc91906100d0565b5090565b6100f291905b808211156100ee5760008160009055506001016100d6565b5090565b90565b6101a4806101046000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063954ab4b214610046575b600080fd5b34801561005257600080fd5b5061005b6100d6565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561009b578082015181840152602081019050610080565b50505050905090810190601f1680156100c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b606060008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561016e5780601f106101435761010080835404028352916020019161016e565b820191906000526020600020905b81548152906001019060200180831161015157829003601f168201915b50505050509050905600a165627a7a723058206b801e5b597ecc38167442c7a44a761b128cd92cf19d6a153f7c0a2caab455ba0029',
gas: '1700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
修改後部署到本地以太坊環境。
沒有報錯的情況下,說明合約部署完成,那麼在console控制台中:
hello.say()
輸出:hello ethereum