Ethereum POA 架設
簡單記錄一下
Overview
Terminology
term | desc |
---|---|
ether | 以太幣本身 |
evm | 由各 nodes 組成的一台大型狀態管理機,每個 node 裡面都有實現 evm yellow papaer的程式對整體狀態管理 |
accounts | where ether is stored |
transactions | 由 account 發出的修改 EVM 狀態的訊息 |
smart contract | reusable snippets of code |
gas | 手續費,每次執行 contract 時須繳付 |
wei | 最小單位 |
Account
分成兩種類型
- External actor(EOA)
一般的 account,概念同 bitcoin 的 account,由 private key 控制,不能包含 EVM code(smart contract)
- Contract account
由 EVM code 控制,實際執行 contract 的 account
運算方式介紹
POW
已算力達成共識的方式,為主流方法,但難以擴展
挖礦叫做 mining
POS
以 stake 量達成共識的方式,跟資本主義滿像,誰有錢誰就有話語權
挖礦叫做 minting
POA
主動選擇被驗證的節點作為驗證者,意為以個人信譽為主,於有限節點的私有練較適合使用,跟當兵差不多,找幾個排長幫忙管理,容易擴展
挖礦叫做 sealing
架設 POA 環境
要架設 POA 至少要有 2 個節點,雖然可以用一個節點跑不過這樣就不帶有 POA 的意義
- install lib
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
- make nodes
mkdir node-a
# create account
geth --datadir node-a account new
# enter password then you will see something like below
####################################################################
# Your new key was generated
# Public address of the key: 0x5135f59f4De410eb731cEb901e611a1070dFD115
# Path of the secret key file: node-a/keystore/UTC--2021-01-26T03-31-40.300431739Z--5135f59f4de410eb731ceb901e611a1070dfd115
####################################################################
# save account & password
echo '5135f59f4de410eb731ceb901e611a1070dfd115' >> accounts.txt
echo 'password' >> node-a/password.txt
# make second node
mkdir node-b
geth --datadir node-b account new
# ...
echo 'node-b-account' >> accounts.txt
echo 'password' >> node-b/password.txt
- create genesis file
# use build-in interactive cli is more confortable
puppeth
# begin
Please specify a network name to administer (no spaces, hyphens or capital letters please)
> any-name
What would you like to do? (default = stats)
1. Show network stats
2. Configure new genesis
3. Track new remote server
4. Deploy network components
> 2
What would you like to do? (default = create)
1. Create new genesis from scratch
2. Import already existing genesis
> 1
Which consensus engine to use? (default = clique)
1. Ethash - proof-of-work
2. Clique - proof-of-authority
> 2
How many seconds should blocks take? (default = 15)
> 3 # mining time for each block
Which accounts are allowed to seal? (mandatory at least one)
> 0x5135f59f4de410eb731ceb901e611a1070dfd115
> 0x2eb60ab83554e73eb85ea2c218f2cd4cf75ca82d
> 0x
Which accounts should be pre-funded? (advisable at least one)
> 0x5135f59f4de410eb731ceb901e611a1070dfd115
> 0x2eb60ab83554e73eb85ea2c218f2cd4cf75ca82d
> 0x
Should the precompile-addresses (0x1 .. 0xff) be pre-funded with 1 wei? (advisable yes)
> y
Specify your chain/network ID if you want an explicit one (default = random)
> 42
What would you like to do? (default = stats)
1. Show network stats
2. Manage existing genesis
3. Track new remote server
4. Deploy network components
> 2
What would you like to do? (default = stats)
1. Show network stats
2. Manage existing genesis
3. Track new remote server
4. Deploy network components
> 2
1. Modify existing configurations
2. Export genesis configurations
3. Remove genesis configuration
> 2
Which folder to save the genesis specs into? (default = current)
Will create 42.json, 42-aleth.json, 42-harmony.json, 42-parity.json
>
# end
# then you can see genesis file
ls
# 42-harmony.json 42.json accounts.txt node-a node-b
- init nodes
geth --datadir node-a init 42.json
geth --datadir node-b init 42.json
- create bootnode nodes 間使用 bootnode 來找到彼此
bootnode -genkey boot.key
# start
bootnode -nodekey boot.key -verbosity 9 -addr :30310
# copy enode hash
# enode://22b3bc9b4d95b30f3e1ceea30738bea44876e8437e1b757a3127c56eef3efa6684f7356e5c45a4a49ae72a1bca7800aba5fac494da222d97e68a8db2b48fc99e@127.0.0.1:0?discport=30310
export BOOTNODE_HASH=enode://22b3bc9b4d95b30f3e1ceea30738bea44876e8437e1b757a3127c56eef3efa6684f7356e5c45a4a49ae72a1bca7800aba5fac494da222d97e68a8db2b48fc99e@127.0.0.1:0?discport=30310
- start nodes
# node-a with json RPC port enable
geth --datadir ./node-a --syncmode 'full' --http --http.addr '0.0.0.0' --http.port 8545 --http.api 'personal,eth,net,web3,txpool,miner' --networkid 42 --port 30303 --bootnodes $BOOTNODE_HASH --gasprice '20' -unlock '0x5135f59f4de410eb731ceb901e611a1070dfd115' --password ./node-a/password.txt --mine --allow-insecure-unlock
# node-b
geth --datadir ./node-b --syncmode 'full' --networkid 42 --port 30304 --bootnodes $BOOTNODE_HASH --gasprice '20' -unlock '0x2eb60ab83554e73eb85ea2c218f2cd4cf75ca82d' --password ./node-b/password.txt --mine --allow-insecure-unlock
# if you don't see "looking for peers" then success else go into geth and set node manually
geth attach node-a/geth.ipc
admin.addPeer('0x5135f59f4de410eb731ceb901e611a1070dfd115')
admin.peers # check
完成後就可以用任意 client 對他寫程式了
References
發佈時間
2021-1-26