eosio 編譯與部署

1. 名詞解釋

  1. 創世節點(BIOS) 用於建立初始區塊,加載基礎合約,供其它節點同步鏈接。
  2. 礦工節點(BP) 主要用於生產同步區塊,計算合約產生的費用歸礦工帳號全部。
  3. 查詢節點 不產生區塊,同步區塊信息,提供區塊信息查詢功能。
  4. 私鑰 用來進行簽名操做,私鑰能夠生成惟一對應公鑰。
  5. 公鑰 用來對私鑰的簽名進行驗證。
  6. 錢包 生成和保存私鑰的地方,當須要進行簽名操做時,會從錢包讀取私鑰列表,進行簽名。
  7. 帶寬 帶寬分爲cpu帶寬和net帶寬兩種,每次執行合約都會消耗必定的帶寬(從帳號中扣取)。
  8. 合約 一段在鏈上可執行代碼,綁定在帳號上,每一個帳號只能綁定一份合約。
  9. 帳號 存儲用戶信息,包括餘額、帶寬、合約(若是有)等。
  10. 總票數 總票數=總髮行的貨幣數量。
  11. 投票 投票者抵押貨幣投票給礦工,當礦工投票數大於總票數的15%時創世節點中止產生區塊,轉由礦工生產區塊。node

    所謂的礦工節點與查詢節點,只是爲了區分是否生產區塊的不一樣配置。ios

2. 節點代碼編譯、程序安裝

注意:後面編譯依賴GIT,因此務必保證代碼根目錄的.git完整,以及系統安裝有git。
如下以ubuntu系統爲例,其它系統步驟相似。git

  1. 先安裝GIT,若是已經安裝則忽略這一步github

    sudo apt update && sudo apt install git -y
  2. 從GIT上克隆最新代碼mongodb

    git clone https://github.com/eosio/eos --recursive --depth 1
  3. 使用eosio_build.sh自動編譯json

    腳本會檢查系統依賴庫,並自動安裝,請注意管理員權限提示,若是下載依賴庫時中斷請檢查網絡狀態,而後再次執行。ubuntu

    cd eosio
    export LOCAL_CMAKE_FLAGS="-DEOSIO_ROOT_KEY=EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV -DCORE_SYMBOL_NAME=EOS"
    ./script/eosio_build.sh

    正式環境可使用LOCAL_CMAKE_FLAGS環境變量指定根公鑰EOSIO_ROOT_KEY和系統貨幣符號CORE_SYMBOL_NAMEwindows

  4. 打包和安裝api

    編譯成功會出現'EOSIO'的ASCII圖樣提示,請執行如下操做,把程序安裝到系統,若是出現編譯錯誤,請提交錯誤提示給相關人員查看解決。安全

    cd build/packages
     bash ./generate_package.sh [brew|deb|rpm]
     ls
    
     #ubuntu
     sudo dpkg -i eosio-v1.7.3.deb
    
     #redhat
     sudo yum install eosio-v1.7.3.rpm
     #或者
     sudo rpm -ivh eosio-v1.7.3.rpm

    參數說明:

    • brew mac系統
    • deb ubuntu繫系統
    • rpm redhat繫系統
  5. 從新編譯
    若是有修改代碼,或者進行版本更新,請先關閉當前運行的錢包和節點程序,以及清除安裝到系統的想着程序,再編譯。

    pkill -2 keosd nodeos
    #ubuntu
    sudo apt remove eosio
    #redhat
    sudo yum remove eosio

3. 默認配置文件所在目錄

Linux: ~/.local/share/eosio/nodeos/config
Mac: ~/Library/Application Support/eosio/nodeos/config

4. 建立默認錢包和公私鑰

  1. 啓動錢包服務

    keosd --unlock-timeout 3600 # 3600秒後錢包從新鎖定
  2. 建立錢包

    請保存輸出的錢包密碼,下次打開錢包時用的到。

    cleos wallet create -n default
    
    #打開錢包
    cleos wallet open -n default
  3. 建立公私鑰

    cleos create key
  4. 把上步生成的私鑰導入錢包

    cleos wallet import -n default --private-key [private key]

5. 通用配置

參數名 示例 說明
agent-name p2p網絡中標識本身的節點的名字 "eosio bios"
producer-name 礦工的帳號名 "eosio"
signature-provider 礦工的公鑰私鑰,用於簽名 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
p2p-server-address p2p服務監聽地址,默認監聽0.0.0.0:9876 "0.0.0.0:9876"
http-server-address http服務器監聽地址,若是不想提供http服務,能夠把地址留空,則不http服務不啓動。注意不填寫會使用默認地址127.0.0.1:8888 "127.0.0.1:8888"
enable-stale-production 啓動後當即開始生產塊。若是不是BIOS節點,這裏填false。 true
p2p-peer-address 其它節點的p2p同步地址,用於同步數據,此參數能夠有多個,即鏈接到多個節點。 "192.168.0.2:9876"

6. 創世節點配置

6.1. 啓動參數配置

  1. 建立eosio系統帳號的公私鑰,參見4. 建立錢包和公私鑰
  2. 修改genesis.json的initial_key爲上一步生成的公鑰
  3. 啓動節點,注意填寫第1步生成的公私鑰

    nodeos --agent-name "eosio bios" --producer-name "eosio" \
         --signature-provider [public key]=KEY:[private key] \
         --plugin eosio::chain_plugin --plugin eosio::chain_api_plugin \
         --p2p-server-address "0.0.0.0:9876" --http-server-address "127.0.0.1:8888" --enable-stale-production

6.2. 部署系統合約

  1. 下載編譯合約編譯器

    git clone https://github.com/eosio/eosio.cdt.git --recursive --depth 1
     cd eosio.cdt
     ./build.sh
     sudo ./install.sh
  2. 下載編譯合約

    git clone https://github.com/eosio/eosio.contracts.git --depth 1
     cd eosio.contracts
     ./build.sh
  3. 建立系統帳號

    OwnerKey與ActiveKey相同,參見6.1生成的公鑰

    cleos create account eosio eosio.token [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.msig [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.bpay [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.names [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.ram [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.ramfee [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.saving [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.stake [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.vpay [OwnerKey] [ActiveKey] -p eosio

    若是使用LOCAL_CMAKE_FLAGS參數指定了根公鑰,則這裏必須相同。

  4. 部署貨幣合約,請確認在合約代碼根目錄執行,參見6.2.2下載編譯合約

    cleos set contract eosio.token build/eosio.token -p eosio.token
    cleos set contract eosio.msig build/eosio.msig -p eosio.msig
  5. 建立貨幣

    cleos push action eosio.token create '["eosio", "1000000000000.0000 EOS", 0, 0, 0]' -p eosio.token
    cleos push action eosio.token issue '["eosio", "1000000000000.0000 EOS", "issue"]' -p eosio

    若是使用LOCAL_CMAKE_FLAGS參數指定了系統貨幣符號,則這裏必須相同。

  6. 部署系統合約,請確認在合約代碼根目錄執行,參見6.2.2下載編譯合約

    cleos set contract eosio build/eosio.system -p eosio
    cleos push action eosio init '[0, "4,EOS"]' -p eosio@active
    cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio@active

7. 礦工節點配置

1. 註冊礦工帳號

  1. 建立礦工帳號的公私鑰,參見4. 建立錢包和公私鑰
  2. 建立礦工帳號

    cleos system newaccount --stake-net [quantity] --stake-cpu [quantity] --buy-ram-kbytes 8192 \
        [creater] [name] [OwnerKey] [ActiveKey] -p [creater]
    # 參數說明
    # creater 礦工帳號的建立者帳號。
    # name 礦工帳號的名字。
    # quantity 購買帶寬的資源,從建立者帳號扣取。
    # OwnerKey與ActiveKey相同,礦工帳號的公鑰,即上步生成的公鑰。
    
    # 示例
    cleos system newaccount --stake-net "50.0000 EOS" --stake-cpu "50.0000 EOS" --buy-ram-kbytes 8888888 eosio eosnewbpa \
    EOS7n1U9Z2NQeVEvQZYjHCedNXRVWshmmuGH2j3r6bD4c8fH4U8QL EOS7n1U9Z2NQeVEvQZYjHCedNXRVWshmmuGH2j3r6bD4c8fH4U8QL -p eosio
  3. 轉帳給礦工帳號

    cleos transfer [from] [recipient] [amount] [momo]
    # 參數說明
    # from 轉帳帳號
    # recipient 接收轉帳帳號
    # amount 金額
    # momo 註釋
    
    # 示例
    cleos transfer eosio eosnewbpa "9000000000.0000 EOS" "trans to eosnewbpa"
  4. 註冊成礦工

    cleos system regproducer [name] [ActiveKey] [url]
    # 參數說明
    # name 礦工帳號
    # ActiveKey 礦工帳號的公鑰
    # url 礦工的網站
    
    #示例
    cleos system regproducer eosnewbpa  EOS7n1U9Z2NQeVEvQZYjHCedNXRVWshmmuGH2j3r6bD4c8fH4U8QL https://192.168.0.57:8888
  5. 抵押相應的資源

    cleos system delegatebw [name] [name] [stake_net_quantity] [stake_cpu_quantity]
    # 參數說明
    # name 礦工帳號
    # stake_net_quantity 抵押的網絡帶寬資源
    # stake_cpu_quantity 抵押的CPU帶寬資源
    
    # 示例
    cleos system delegatebw eosnewbpa eosnewbpa '4400000000.0000 EOS' '4400000000.0000 EOS'
  6. 投票給本身

    cleos system voteproducer prods [voter] [producers] -p [voter]
    # 參數說明
    # voter 礦工帳號
    # producers 抵押的網絡帶寬資源
    
    #示例
    cleos system voteproducer prods eosnewbpa eosnewbpa

2. 啓動參數配置

  1. 建立eosio系統帳號的公私鑰,參見建立錢包和公私鑰
  2. 修改genesis.json的initial_key爲創世節點(BIOS)生成的公鑰
  3. 啓動節點,注意填寫第1步生成的公私鑰

    假設已知bios節點192.168.0.56:9876,BP節點192.168.0.58:9876。

    nodeos --agent-name "eosnewbpa" --producer-name "eosnewbpa" \
        --signature-provider [public key]=KEY:[private key] \
        --p2p-server-address "0.0.0.0:9876" --http-server-address "127.0.0.1:8888" \
        --p2p-peer-address "192.168.0.56:9876" --p2p-peer-address "192.168.0.58:9876"

8. 查詢節點配置

查詢節點配置與礦工節點配置相似,只是不註冊成礦工,查詢節點經常使用來數據查詢。建議開啓mongo_db_plugin插件。
mongo_db_plugin是保存區塊交易信息到mongodb的插件。

假設已知bios節點192.168.0.56:9876,BP節點192.168.0.57:987六、192.168.0.58:9876,而且這三個節點都開啓了mongo_db_plugin插件。

nodeos --agent-name "eosnewbpb" --producer-name "eosnewbpb" \
  --signature-provider [public key]=KEY:[private key] \
  --p2p-server-address "0.0.0.0:9876" --http-server-address "127.0.0.1:8888" \
  --p2p-peer-address "192.168.0.56:9876" --p2p-peer-address "192.168.0.57:9876" --p2p-peer-address "192.168.0.58:9876" \
  --plugin eosio::mongo_db_plugin --mongodb-uri mongodb://127.0.0.1:27017/EOSIO

9. 建議

  1. 從安全角度來講,不要私鑰泄露給他人,知道帳戶私鑰後,能夠隨意操縱帳戶。
  2. 若是使用助記詞生成的私鑰,請使用複雜度較高的助記詞。
  3. 上面傳入不少參數都是演示用的,若是正式部署,建議使用配置文件的方式。
  4. 建議使用SIGINT信號來關閉節點,防止程序產生髒數據。

    pkill -2 keosd nodeos
  5. 若是有髒數據產生,請使用--replay-blockchain參數或者--delete-all-blocks參數啓動節點,從新同步數據。
  6. 節點啓動前,請確認時間及時區正確,時間有偏移會影響區塊數據驗證。

    sudo mv /etc/localtime  /etc/localtime.bak
    sudo ln -s /usr/share/zoneinfo/UTC /etc/localtime
    # 使用 ntpdate 更新系統時間
    sudo apt install ntpdate ntp -y # yum install ntpdate ntp -y
    sudo timedatectl set-timezone UTC
    sudo ntpdate -u time.windows.com
    sudo hwclock --systohc # 寫入硬件
    # 啓動ntpd服務
    sudo systemctl enable ntp # systemctl enable ntpd
    sudo systemctl start ntp # systemctl start ntpd
相關文章
相關標籤/搜索