以太坊建置與實作

加密貨幣

利用 Geth

創世區塊 (Genesis block)

{
  "config": {
    "chainId": 46723,
    "homesteadBlock": 1,
    "eip150Block": 2,
    "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "eip155Block": 3,
    "eip158Block": 3,
    "clique": {
      "period": 10,
      "epoch": 30000
    }
  },
  "nonce": "0x0",
  "timestamp": "0x594561a5",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000255eb6d4d37bfc66b565e6159948f829b67674f50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  "gasLimit": "0x47b760",
  "difficulty": "0x1",
  "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "alloc": {
    "0000000000000000000000000000000000000000": {
      "balance": "0x1"
    },
    "0000000000000000000000000000000000000001": {
      "balance": "0x1"
    },
    ...
  }
}
  • config 設定檔
    • chainId 這個 private net 的 ID
    • homesteadBlock
    • eip150Block
    • eip150Hash
    • eip155Block
    • eip158Block
    • clique
      • period
      • epoch
  • nonce 是一個64位隨機數,這次 hash 為了完成 difficulties 所要加的鹽 注意他和mixhash的設置需要滿足以太坊的 Yellow paper
  • timestamp 設置創世塊的時間戳
  • parentHash 上一個區塊的hash值,因為是創世塊,所以這個值是0
  • extraData 附加信息
  • gasLimit 該值設置對 GAS 的消耗總量限制,用來限制區塊能包含的交易信息總和
  • difficulty 困難度,主要是 hash 的規範,到底要 hash 到多少數字以下才成立
  • mixHash 與 nonce 配合用於挖礦,由上一個區塊的一部分生成的 hash
  • coinbase 礦工的帳號
  • alloc 用來預置帳號以及帳號的以太幣數量

如何產生 Genesis block

  • 手寫 XD
  • 利用 puppeth 互動 console
    • puppeth
    • 對你的創世塊命名
    • 選擇操作 2 來設定創世塊
    • PoA 選擇 2 / PoW 選擇 1
    • 設定多久可以挖到一塊 block (difficulties)
    • 指定一個 Account address 作為創世區塊的授權打包角色
    • 指定要不要事先給一些 ether
    • Network Id (Chain Id),直接用 default(random)
    • 沒什麼需要特別加入 genesis 的
    • 選 2 存檔
    • ctrl+c 離開 => 產生 .json 檔

啟動 Genesis block

  • 初始化
    • geth --datadir "/root/chain" init genesis.json
    • 將 node 連到 Genesis block
  • 啟動私鍊
    • geth --identity "phoenix" --rpc --rpccorsdomain "*" --datadir "/root/chain" --port "30303" --rpcapi "db,eth,net,web3" --networkid 98888 console
      • identity:區塊鏈的標示,隨便填寫,用於標示目前網絡的名字
      • init:指定創世塊文件的位置,並創建初始塊
      • datadir:設置當前區塊鏈網絡數據存放的位置
      • port:網絡監聽埠,默認是8080
      • rpc:啟動rpc通信,可以進行智能合約的部署和調試。它在geth中通常被默認激活。
      • rpcapi: 設置允許連接的rpc的客戶端,一般為db,eth,net,web3
      • networkid: 設置當前區塊鏈的網絡ID,用於區分不同的網絡,是一個數字
      • console:啟動命令行模式,可以在Geth中執行命令
      • nodiscover: 使用這個命令可以確保你的節點不會被非手動添加你的人發現。否則,你的節點可能被陌生人的區塊鏈無意添加,如果他和你有相同的初始文件和網絡ID。
      • maxpeers: 如果你不希望其他人連接到你的測試鏈,可以使用maxpeers 0。反之,如果你確切知道希望多少人連接到你的節點,你也可以通過調整數字來實現。
      • rpcapi: 這個命令可以決定允許什麼API通過RPC進入。在默認情況下,geth可以在RPC激活web3介面。請注意在RPC/IPC介面提供API,會使每個可以進入這個介面(例如dapp’s)的人都有權限訪問這個API。注意你激活的是哪個API。Geth會默認激活IPC介面上所有的API,以及RPC介面上的db,eth,net和web3 API。
      • rpccorsdomain: 這個可以指示什麼URL能連接到你的節點來執行RPC定製端任務。務必謹慎,輸入一個特定的URL而不是wildcard ( * ),後者會使所有的URL都能連接到你的RPC實例。
  • 如果想將Ubuntu作為永久區塊鏈節點使用,當使用nohup命令時,Geth啟動參數console必須去掉,否則Geth會自動停止
  • geth command
    • net.listening:查看網絡是否在監聽;
    • admin.peers: 查看當前連接的節點。 目前還是空的。
    • admin.nodeInfo:查看當前節點的信息。

參考

Ethereum 如何交易

GAS

  • 手續費
  • 區塊技術需要礦工幫忙做交易驗證,因此需要付費給驗證工人
  • gasLimit
  • 即時監控資訊:https://ethstats.net/

傳送交易

web3.eth.sendTransaction({
    from: acct1,
    to: acct2,
    value: web3.toWei(1, "ether"),
    gasLimit: 21000,
    gasPrice: 2000000000
})
  • from: 傳送者的 account
  • to: 接受者的 account
  • value: 交易金額
  • gasLimit:
  • gasPrice: 礦工獲得的手續費
    • gasPrice 越低,就有機會越晚被拿來驗證
    • 手續費太低,沒人想驗證

Web3JS

module 介紹

  • ethereumjs-accounts

Ethereum Swarm

什麼事 Swarm

Swarm 是基於區塊鏈上分散式的點對點儲存空間,將檔案以 P2P 的方式切割分散儲存在每個節點上,可提供上傳、下載的功能

安裝

  • 安裝 golang
    • sudo add-apt-repository ppa:evarlast/golang-1.8
    • sudo apt update
    • sudo apt install golang
    • mkdir -p ~/go # GOPATH
    • mkdir -p ~/go/bin
  • 安裝 geth, swarm
    • mkdir -p $GOPATH/src/github.com/ethereum
    • cd $GOPATH/src/github.com/ethereum
    • git clone https://github.com/ethereum/go-ethereum
    • cd go-ethereum
    • git checkout master
    • go get github.com/ethereum/go-ethereum
    • make geth
    • make swarm
    • 之後在 ~/go/src/github.com/ethereum/go-ethereum/build/bin/swarm 就可以直接用了,可以考慮放到 PATH 或把這個資料夾放進 PATH

啟動

  • 要有一個 ethereum account
    • geth account new

閃電網路/支付通道

Ethereum 區塊鏈支付通道

GHOST 演算法

On Slow and Fast Block Times

comments powered by Disqus

Related