如何在 Avalanche 上建立跨鏈生態

雪崩的子區塊鏈架設實戰

MingJ Chang
BSOS Taiwan
31 min readApr 12, 2022

--

為了克服區塊鏈的「不可能三角」,Avalanche 設計出可擴充 Subnet 的架構,開發者可在 Avalanche 上建立自己的 Subnet,並根據需求選擇共識機制,從而擴充 Avalanche 生態。Subnet 被定義為多個 Validator 形成的集合,而這些 Validator 必須完成存在於 Subnet 中多條 Blockchain 的共識行為。

在平台架構中存在著一組較特別也是 Avalanche 初始的 Subnet,被稱之為 Primary network。成為 Primary network 的 Validator 才有資格加入其他延伸的 Subnet Validator 集群,並參與各 Subnet 中 Blockchain 的共識協議。Primary network 中目前主要運行著 3 條鏈分別為 P-chain、X-chain 及 C-chain,各自負責不同的任務。

  • P-chain為平台鏈 (platform chain) 的縮寫,負責管理 Subnet、Validator、Blockchain 之間的相互關係。
  • X-chain為交易鏈 (exchange chain) 的縮寫,主要處理數位資產的創建及交易行為,公共網絡中現行使用的資產為 AVAX,但也可以在鏈上自行創建全新的資產。
  • C-chain為合約鏈 (contract chain) 的縮寫,支應 EVM 相容的智能合約創建及移轉,供 DApps 使用。

目前 Avalanche 公共網絡發展都還集中於 Primary network,尚無法充分發揮 Subnet 架構的效益,Avalanche 官方也因此於 3 月推出拓建 Subnet 數量的激勵計劃 Multiverse,可見多元 Subnet 的發展將會成為之後 Avalanche 生態的重頭戲。

因此,跟進這樣的發展,在這裡貢獻給大家自建 Avalanche Blockchain 的實戰解說,希望對大家有所啟發。

整個過程會於 Avalanche 測試公共網絡(Fuji)上進行實作,從運行 Fuji 網絡節點開始,籌備所需質押及相關手續費,到最後創建 Subnet 及其中的 Blockchain。

運行 Avalanche 節點

Avalanche 節點執行檔來源有從官方 releases page 下載或是自行編譯兩種,這邊採用自行編譯的方式。而 Avalanche 的原始碼是採用 golang 語言開發,自行編譯前請先確認機器為已安裝 Go 的環境,版本需 ≥ 1.16.8。

首先下載 AvalancheGo 原始碼

git clone git@github.com:ava-labs/avalanchego.git

接著進到下載後的 avalanchego 目錄並執行編譯腳本

cd avalanchego./scripts/build.sh

編譯後的執行檔會產生於 build 目錄,如下運行執行檔以啟動節點

./build/avalanchego --network-id=fuji

附加的參數--network-id=fuji 用來設定此次運行為測試公開網絡(Fuji)節點

啟動過程中,會看到同步測試網絡的相關資訊

在資訊同步完成後,節點 API 服務便能夠正常運作,Avalanche 平台相關資訊取得及組件操作便可以透過 API 來進行,下列為 health check 範例。

curl -X POST --data '{  "jsonrpc": "2.0",  "id": 1,  "method": "health.health"}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/health

Response

{  "jsonrpc": "2.0",  "result": {    "checks": {      "C": {……},      "P": {……},      "X": {……},
.
.
.
"bootstrapped": {……}, "network": {……}, "router": {……}, } }, "healthy": true }, "id": 1}

如果平台資訊尚未同步完成,使用 API 時則會收到以下訊息。

最後為了後續各種類型的交易,創立節點帳號。

curl -X POST --data '{  "jsonrpc": "2.0",  "id": 1,  "method": "keystore.createUser",  "params": {    "username": "myUsername",    "password": "myPassword"  }}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/keystore

Response

{  "jsonrpc": "2.0",  "result": {"success": true},  "id":1}

籌備各鏈資產

Primary network上各類的交易都需消耗手續費,而 Subnet 及 Blockchain 的建置也屬於一種特殊的交易,這類的交易必須於 P-chain 上進行。但目前 P-chain 無法進行鏈內的 AVAX 移轉,於是藉由 X-chain 或 C-chain 跨鏈轉導的方式將 AVAX 導入 P-chain。

開始先產生 X-chain 地址

curl -X POST --data '{  "jsonrpc": "2.0",  "id": 1,  "method": "avm.createAddress",  "params": {    "username": "myUsername",    "password": "myPassword"  }}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/bc/X

Response

{  "jsonrpc": "2.0",  "id": 1,  "result": {    "address": "X-avax1xeaj0h9uy7c5jn6fxjp0rg4g39jeh0hl27vf75"  }}

接著於 X-chain 地址轉入 AVAX,Fuji 網絡為方便使用者進行測試,提供了 Fuji Faucet 網頁來配發 AVAX。

配發後確認地址內至少要有 2 AVAX。

curl -X POST --data '{  "jsonrpc": "2.0",  "id": 2,  "method": "avm.getBalance",  "params": {    "address": "X-avax1xeaj0h9uy7c5jn6fxjp0rg4g39jeh0hl27vf75",    "assetID": "AVAX"  }}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/bc/X

Response

{  "jsonrpc": "2.0",  "id": 2,  "result": {    "balance": 2000000000,    "utxoIDs": [{      "txID": "x6vR85YPNRf5phpLAEC7Sd6Tq2PXWRt3AAHAK4BpjxyjRyhtu",      "outputIndex": 0    }]  }}

再來產生 P-chain 地址,地址數量取決於之後建立的 Subnet 若要增加 Validator 時需要多少私鑰簽章而定,這邊將先產生 2 組。

第1組 P-chain 地址

curl -X POST --data '{  "jsonrpc": "2.0",  "method": "platform.createAddress",  "params": {    "username": "myUsername",    "password": "myPassword"  },  "id": 1}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P

Response

{  "jsonrpc": "2.0",  "result": {    "address": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg"  },  "id": 1}

第2組 P-chain 地址

curl -X POST --data '{  "jsonrpc": "2.0",  "method": "platform.createAddress",  "params": {    "username": "myUsername",    "password": "myPassword"  },  "id": 1}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P

Response

{  "jsonrpc": "2.0",  "result": {    "address": "P-avax1zg5uhuwfrf5tv852zazmvm9cqratre588qm24z"  },  "id": 1}

然後將 X-chain 地址中的 AVAX 轉導進 P-chain 一組地址。因 Fuji 網絡上節點要成為 Primary network Validator 參與共識至少需質押 1 AVAX,再加上 Subnet 及 Blockchain 相關建置的手續費至少需轉導 1.5 AVAX。

從 X-chain 地址導出 AVAX

curl -X POST --data '{  "jsonrpc": "2.0",  "id": 1,  "method": "avm.export",  "params": {    "to": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg",    "amount": 1500000000,    "assetID": "AVAX",    "from": ["X-avax1xeaj0h9uy7c5jn6fxjp0rg4g39jeh0hl27vf75"],    "changeAddr": "X-avax1xeaj0h9uy7c5jn6fxjp0rg4g39jeh0hl27vf75",    "username": "myUsername",    "password": "myPassword"  }}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/bc/X

Response

{  "jsonrpc": "2.0",  "result": {    "txID": "2Eu16yNaepP57XrrJgjKGpiEDandpiGWW8xbUm6wcTYny3fejj",    "changeAddr": "X-avax1turszjwn05lflpewurw96rfrd3h6x8flgs5uf8"  },  "id": 1}

將 AVAX 導入 P-chain 地址

curl -X POST --data '{  "jsonrpc": "2.0",  "method": "platform.importAVAX",  "params": {    "to": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg",    "changeAddr": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg",    "username": "myUsername",    "password": "myPassword"  },  "id": 1}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P

Response

{  "jsonrpc": "2.0",  "result": {    "txID": "P63NjowXaQJXt5cmspqdoD3VcuQdXUPM5eoZE2Vcg63aVEx8R",    "changeAddr": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg"  },  "id": 1}

最後確認 P-chain 地址中的餘額

curl -X POST --data '{  "jsonrpc": "2.0",  "id": 1,  "method": "platform.getBalance",  "params": {    "address": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg"  }}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/bc/P

Response

{  "jsonrpc": "2.0",  "result": {    "balance": "1499000000",    "unlocked": "1499000000",    "lockedStakeable": "0",    "lockedNotStakeable": "0",    "utxoIDs": [{      "txID": "P63NjowXaQJXt5cmspqdoD3VcuQdXUPM5eoZE2Vcg63aVEx8R",      "outputIndex": 0    }]  },  "id": 1}

架設 Subnet

前置作業皆已完成後,便可以直接於 P-chain 架設 Subnet。特別說明,下列 threshold 的參數值代表之後加入 Validator 時需要的私鑰簽章數量,需不能超過 controlKeys 清單中的地址數量。

curl -X POST --data '{  "jsonrpc": "2.0",  "method": "platform.createSubnet",  "params": {    "controlKeys": [      "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg",      "P-avax1zg5uhuwfrf5tv852zazmvm9cqratre588qm24z"    ],    "threshold": 2,    "username": "myUsername",    "password": "myPassword"  },  "id": 1}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P

Response

{  "jsonrpc": "2.0",  "result": {    "txID": "e3bRNJ2a8U6564jp7MjLvqTvYi2VWSaGgVaLSPUVx1WTUxVGX",    "changeAddr": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg"  },  "id": 1}

回傳結果中的 txID 就會成為新設定的 Subnet ID,透過取得 Subnet 清單的 API 來進行確認。

curl -X POST --data '{  "jsonrpc": "2.0",  "method": "platform.getSubnets",  "params": {    "subnetID": "e3bRNJ2a8U6564jp7MjLvqTvYi2VWSaGgVaLSPUVx1WTUxVGX"  },  "id": 1}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P

Response

{  "jsonrpc": "2.0",  "result": {    "subnets": [{      "id": "e3bRNJ2a8U6564jp7MjLvqTvYi2VWSaGgVaLSPUVx1WTUxVGX",      "controlKeys": [        "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg",        "P-avax1zg5uhuwfrf5tv852zazmvm9cqratre588qm24z"      ],      "threshold": "2"    }]  },  "id": 1}

Subnet 架設完成後,必須添加 Validator 才能為之後運行於 Subnet 的Blockchain 執行共識,而 Validator 同時也需為 Primary network 執行共識,所以接下來會先將節點加入Primary network Validator 群集,再讓其成為 Subnet Validator。

先取得節點 ID

curl -X POST --data '{  "jsonrpc": "2.0",  "method": "info.getNodeID",  "params": {},  "id": 1}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/info

Response

{  "jsonrpc": "2.0",  "result": {    "nodeID": "NodeID-7PtUynMPBUiTUMDpfXFAzZtG4MdcgYxew"  },  "id": 1}

將節點加入 Primary network Validator 群集。下列的 startTime 和 endTime 為 Unix time,linux 可由 date 指令取得, mac 則由 gdate 指令。

curl -X POST --data '{  "jsonrpc": "2.0",  "method": "platform.addValidator",  "params": {    "nodeID": "NodeID-7PtUynMPBUiTUMDpfXFAzZtG4MdcgYxew",    "startTime": '$(date --date="2 minutes" +%s)',    "endTime": '$(date --date="30 days" +%s)',    "stakeAmount": 1000000000,    "rewardAddress":"P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg",    "changeAddr":"P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg",    "delegationFeeRate": 2,    "username": "myUsername",    "password": "myPassword"  },  "id": 1}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P

Response

{  "jsonrpc": "2.0",  "result": {    "txID": "6pb3mthunogehapzqmubmx6n38ii3lzytvdrxumovwkqftzls",    "changeAddr": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg"  },  "id": 1}

接著將 Validator 加入先前架設好的 Subnet。這邊需注意 Subnet Validator 的 startTime 和 endTime 區間必須位於擔任 Primary network Validator 期間內。另外,Subnet 中所有的 Validator weight 值加總必須達到 Avalanche 平台參數 snow-sample-size 的設定值以上才能完成共識,現行是 20。

curl -X POST --data '{  "jsonrpc": "2.0",  "method": "platform.addSubnetValidator",  "params": {    "nodeID": "NodeID-7PtUynMPBUiTUMDpfXFAzZtG4MdcgYxew",    "subnetID": "e3bRNJ2a8U6564jp7MjLvqTvYi2VWSaGgVaLSPUVx1WTUxVGX",    "startTime": '$(date --date="2 minutes" +%s)',    "endTime": '$(date --date="28 days" +%s)',    "weight": 30,    "from": ["P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg"],    "changeAddr": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg",    "username": "myUsername",    "password": "myPassword"  },  "id": 1}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P

Response

{  "jsonrpc": "2.0",  "result": {    "txID": "2exafyvRNSE5ehwjhafBVt6CTntot7DFjsZNcZ54GSxBbVLcCm",    "changeAddr": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg"  },  "id": 1}

自建 EVM Blockchain

在 Subnet 建立 Blockchain 之前,要先配置好 Virtual Machine(VM) 的插件,以讓 Blockchain 在運行時有所依規,這邊將會採用 Subnet EVM 進行配置。

首先下載 Subnet EVM 原始碼並進到 subnet-evm 目錄

git clone git@github.com:ava-labs/subnet-evm.gitcd subnet-evm

接著執行編譯腳本,編譯後的執行檔會產生於build目錄,檔名需命名為VM ID。下述範例指令的 VM ID,其原始字串為 ”bsexevm”,製成方式為將字串轉為 byte 陣列並利用 zero-extended 擴為長度 32 byte 的陣列,最後以 CB58 格式編碼

./scripts/build.sh ./build/kMnygBdLccCWE1yfikevvdc2eKw27wBGRg2ygzktedyLEbKhN

將編譯後的執行檔放入如下指令的插件目錄位置

cp ./build/kMnygBdLccCWE1yfikevvdc2eKw27wBGRg2ygzktedyLEbKhN ../avalanchego/build/plugins/

然後重啟目前已為 Validator 的 Avalanche 節點,並為加入的 Subnet 工作

./build/avalanchego --network-id=fuji --public-ip=xxx.xxx.xxx.xxx --whitelisted-subnets=e3bRNJ2a8U6564jp7MjLvqTvYi2VWSaGgVaLSPUVx1WTUxVGX

附帶的2個參數說明:

--public-ip Validator 提供給其他外部節點同步資訊及健康檢查用

--whitelisted-subnets Validator 加入的 Subnet 白名單,若為多組可用逗號分隔

節點重啟並完成資料同步後,便可以藉由前述配置的 VM 插件中的 API 產生區塊鏈創世區塊資訊。

curl -X POST --data '{  "jsonrpc": "2.0",  "id": 1,  "method": "subnetevm.buildGenesis",  "params": {    "genesisData": {      "config": {        "chainID": 58582,        "homesteadBlock": 0,        "eip150Block": 0,        "eip150Hash":  "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0",        "eip155Block": 0,        "eip158Block": 0,        "byzantiumBlock": 0,        "constantinopleBlock": 0,        "petersburgBlock": 0,        "istanbulBlock": 0,        "muirGlacierBlock": 0,        "subnetEVMTimestamp": 0,        "feeConfig": {          "gasLimit": 8000000,          "targetBlockRate": 2,          "minBaseFee": 13000000000,          "targetGas": 15000000,          "baseFeeChangeDenominator": 36,          "minBlockGasCost": 0,          "maxBlockGasCost": 1000000,          "blockGasCostStep": 200000        },        "allowFeeRecipients": false,      },      "alloc": {        "8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC": {          "balance": "2000000000000000000000000000"        }      },      "timestamp": "0x0",      "gasLimit": "0x7A1200",      "difficulty": "0x0",      "mixHash":  "0x0000000000000000000000000000000000000000000000000000000000000000",      "coinbase": "0x0000000000000000000000000000000000000000",      "number": "0x0",      "gasUsed": "0x0",      "parentHash":  "0x0000000000000000000000000000000000000000000000000000000000000000"    }  }}' -H 'content-type:application/json;'  127.0.0.1:9650/ext/vm/kMnygBdLccCWE1yfikevvdc2eKw27wBGRg2ygzktedyLEbKhN/rpc

Response

{  "jsonrpc": "2.0",  "result": {    "genesisBytes":  "3BD9MaNNGhMYEhsmwVegjsMd5WGysnrEBpSNtTq4EwtZhjdea6LYHCR5z4LssVKMfEFZNyiRkDQuCsRxk48h9q36oBJHdjb7EFkKcXPhdfCg3J7afpkX9XcHgcnohT9m7QXAnBPkBvXfJhWFnRagWUya7Ust1xaBZNj5UCARtTW9G7XQkWRjyKefmwrrgn43vftFsvuwPh8BmpjryAcW88AHAMFCSBnRhLoZS8LM6KzKQVRi62fDQzFjEu45Q23Yi8eHvtQ33LE8KiYZqrQrgKjSnD5RzuAmGBbfNPdi7itqyXmzQaztdZE681dCcGWfJJDftrmTCSfRpemNisJXZDLiKPM1gvyFM3DnEFSMH9DqybBVrkazycjvzY19LyZtx6Gn8sM3TL7Cn13mAkhjCPNkUhLJFVQEWo35qU1EHxzEb2mVXipcGCRr8VBRKTitdwdeJg67SyVJEBhdegKfjLnpjYfti2FryJBWeXsLHpNve83dnUDJ7vRggUDQLQSynvovrr93YqtwcaWgTqL3RZg5Fu5BfRwsBcZMKVVHM8FCCVviL7bFxsy3jMKQBXBtqwFSZKuYE7KYYyzzQQYfzjWmxPh6doBvHddzrL4CMNqCtqXqJt64YK44VRnAKr623J9ZEP9dTHkECyVzXkmFfhHXYXNScLMKFqZg9zmPDM7YMTMRQXs47evWkYNMLs2cwYUDFJ12mNZoXdzTGDDfidqLw9fKGtKwL7ixDHkUEmntmB5kWjdBaoaAfrv4MpRdDzxGQ48deFinMtFNgJ7z1yuh3XMzfvB2KEzwcErGvJBHXov9tzXJu4uLBemBTLkqJNfiuevgzk3GmwrXu4mMTvhhtL2bvQeHhKhwCRik9tTGsDo8E5BeGkYirRYeM9MVjk2vtkUbhMWf6iSVUPhxT82CndK9Dajryk4akmWanRsL2gZJsWnp5qnCAC4bHoETnpiXJSo3FRs84r1uo6h9qCnJRstToiqhdeHdujj16vBkLrE27QR5GryaasYRy1kZ1UyQeZzK5txsNSvFpF4ruAE9nGnysmXGtYxkLYXPPpNz5ZmkzzKKd4cTnUNCrJa6wusLjRXUVJww3zj4u528d9DAfVa3XTDwSqsGcCLd5zoDwDLGphWFESo99Zv91cJtGR6ccJUvi9jZEsCAAg6qiP2RRksFAfvNGNi13Xs71cPTvwTcgkX8aaUiLc2aMKA73L8Hywn4BbHDJjYbiE2i6NXpf87SrEDso7qUCFbLd7rLsKshaVS9HFa9ZVAY9kBfv6sgXgH1xN1JtdB4pQpjqAgPtJt9QwCgCvhYRGceByn525Fn6RWnGyQGimaNiSdb4McbfgSnw4Jn8DhiGa4ffe6eDT5YXQJwy3RUAT5aRZugoN4zDpBiy6pGZnW6S9DGUvV1eg1TNPLsJu7PqEX1yw1mFDx8R4MgmnSBjsyoRxFBh2r8LSz7sHgjrCEL77xLvJUSLJvn9s6tmP7guJx4wbprkejRgTJAK1JUzsN35oQwSNpi4HGsRkNsnxHqpn1SPFRUf5NJcQSK4uDwezSkNx6sHjAZM5Ue8WbQBTyZMsxshDnBg9BUbRgKZQHZm9wB7ahxdqFswuNMoAEHmyCA2GAMeEYsSaFyi8neDqTehfFKX5o7G7BDUBsKbsXoKowi",    "encoding": "cb58"  },  "id": 1}

最後由產生出來的創世區塊資訊於 Subnet 中建立 Blockchain

curl -X POST --data '{  "jsonrpc": "2.0",  "method": "platform.createBlockchain",  "params": {    "subnetID": "e3bRNJ2a8U6564jp7MjLvqTvYi2VWSaGgVaLSPUVx1WTUxVGX",    "vmID": "kMnygBdLccCWE1yfikevvdc2eKw27wBGRg2ygzktedyLEbKhN",    "name": "bsex chain",    "genesisData":  "3BD9MaNNGhMYEhsmwVegjsMd5WGysnrEBpSNtTq4EwtZhjdea6LYHCR5z4LssVKMfEFZNyiRkDQuCsRxk48h9q36oBJHdjb7EFkKcXPhdfCg3J7afpkX9XcHgcnohT9m7QXAnBPkBvXfJhWFnRagWUya7Ust1xaBZNj5UCARtTW9G7XQkWRjyKefmwrrgn43vftFsvuwPh8BmpjryAcW88AHAMFCSBnRhLoZS8LM6KzKQVRi62fDQzFjEu45Q23Yi8eHvtQ33LE8KiYZqrQrgKjSnD5RzuAmGBbfNPdi7itqyXmzQaztdZE681dCcGWfJJDftrmTCSfRpemNisJXZDLiKPM1gvyFM3DnEFSMH9DqybBVrkazycjvzY19LyZtx6Gn8sM3TL7Cn13mAkhjCPNkUhLJFVQEWo35qU1EHxzEb2mVXipcGCRr8VBRKTitdwdeJg67SyVJEBhdegKfjLnpjYfti2FryJBWeXsLHpNve83dnUDJ7vRggUDQLQSynvovrr93YqtwcaWgTqL3RZg5Fu5BfRwsBcZMKVVHM8FCCVviL7bFxsy3jMKQBXBtqwFSZKuYE7KYYyzzQQYfzjWmxPh6doBvHddzrL4CMNqCtqXqJt64YK44VRnAKr623J9ZEP9dTHkECyVzXkmFfhHXYXNScLMKFqZg9zmPDM7YMTMRQXs47evWkYNMLs2cwYUDFJ12mNZoXdzTGDDfidqLw9fKGtKwL7ixDHkUEmntmB5kWjdBaoaAfrv4MpRdDzxGQ48deFinMtFNgJ7z1yuh3XMzfvB2KEzwcErGvJBHXov9tzXJu4uLBemBTLkqJNfiuevgzk3GmwrXu4mMTvhhtL2bvQeHhKhwCRik9tTGsDo8E5BeGkYirRYeM9MVjk2vtkUbhMWf6iSVUPhxT82CndK9Dajryk4akmWanRsL2gZJsWnp5qnCAC4bHoETnpiXJSo3FRs84r1uo6h9qCnJRstToiqhdeHdujj16vBkLrE27QR5GryaasYRy1kZ1UyQeZzK5txsNSvFpF4ruAE9nGnysmXGtYxkLYXPPpNz5ZmkzzKKd4cTnUNCrJa6wusLjRXUVJww3zj4u528d9DAfVa3XTDwSqsGcCLd5zoDwDLGphWFESo99Zv91cJtGR6ccJUvi9jZEsCAAg6qiP2RRksFAfvNGNi13Xs71cPTvwTcgkX8aaUiLc2aMKA73L8Hywn4BbHDJjYbiE2i6NXpf87SrEDso7qUCFbLd7rLsKshaVS9HFa9ZVAY9kBfv6sgXgH1xN1JtdB4pQpjqAgPtJt9QwCgCvhYRGceByn525Fn6RWnGyQGimaNiSdb4McbfgSnw4Jn8DhiGa4ffe6eDT5YXQJwy3RUAT5aRZugoN4zDpBiy6pGZnW6S9DGUvV1eg1TNPLsJu7PqEX1yw1mFDx8R4MgmnSBjsyoRxFBh2r8LSz7sHgjrCEL77xLvJUSLJvn9s6tmP7guJx4wbprkejRgTJAK1JUzsN35oQwSNpi4HGsRkNsnxHqpn1SPFRUf5NJcQSK4uDwezSkNx6sHjAZM5Ue8WbQBTyZMsxshDnBg9BUbRgKZQHZm9wB7ahxdqFswuNMoAEHmyCA2GAMeEYsSaFyi8neDqTehfFKX5o7G7BDUBsKbsXoKowi",    "username": "myUsername",    "password": "myPassword"  },  "id": 1}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P

Response

{  "jsonrpc": "2.0",  "result": {    "txID": "9XHnyhcted5jqBdJt4nBoKiZdwALTtALxy6KFuFECJZv2SWZR",    "changeAddr": "P-avax1spnextuw2kfzeucj0haf0e4e08jd4499gn0zwg"  },  "id": 1}

同 Subnet,回傳的 txID 就是區塊鏈的 ID,藉由取得 Blockchain 清單的 API 來進行確認。

curl -X POST --data '{  "jsonrpc": "2.0",  "id": 1,  "method": "platform.getBlockchains",  "params" :{}}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P

Response

{  "jsonrpc": "2.0",  "result": {    "blockchains": [{      "id": "9XHnyhcted5jqBdJt4nBoKiZdwALTtALxy6KFuFECJZv2SWZR",      "name": "bsex chain",      "subnetID":  "e3bRNJ2a8U6564jp7MjLvqTvYi2VWSaGgVaLSPUVx1WTUxVGX",      "vmID": "kMnygBdLccCWE1yfikevvdc2eKw27wBGRg2ygzktedyLEbKhN"    }]  },  "id": 1}

以上就完成在 Avalanche 測試網絡 (Fuji) 中建立 Subnet 與 Blockchain 的整個流程。

總結

Avalanche 雪崩協議是對開發者友好的、可定制化高性能公鏈,尤其是在公鏈百家爭鳴的時代,雪崩協議的共識機制、安全性、擴容性及易開發性,都展現了獨特的競爭力。筆者在這邊鼓勵想進一步了解 Avalanche 運作的技術開發人員,不仿動手實際架設 Subnet 測試鏈,並在上面嘗試部署智能合約,相信會更有感覺!

--

--