Bài viết này cung cấp một cái nhìn sâu sắc về Chain Specification (Đặc tả Chuỗi) trong Polkadot SDK. Bạn sẽ học cách định nghĩa, tùy chỉnh và tạo ra các chain spec khác nhau để xây dựng mạng lưới blockchain của riêng bạn. Chúng ta sẽ khám phá cách tùy chỉnh cấu hình genesis và node settings để đảm bảo hiệu suất và bảo mật tối ưu cho blockchain của bạn. Tìm hiểu tại sao chain specification lại quan trọng trong việc khởi động một node và cách nó xác định mạng lưới mà node sẽ kết nối.
Chain specification thu thập thông tin mô tả một mạng lưới dựa trên Polkadot SDK. Đây là một tham số quan trọng khi khởi động một node, cung cấp các cấu hình genesis, bootnode và các tham số khác liên quan đến mạng lưới cụ thể đó. Nó xác định mạng lưới mà một node blockchain kết nối đến, các node khác mà nó giao tiếp ban đầu và trạng thái ban đầu mà các node phải đồng ý để tạo ra các block. Hiểu rõ về **chain specification Polkadot** là bước quan trọng để triển khai một blockchain thành công.
Chain Specification được định nghĩa bằng cấu trúc ChainSpec
. Cấu trúc này chia thông tin cần thiết cho một chuỗi thành hai phần:
Đối với node, chain specification kiểm soát các thông tin như:
Bạn có thể tùy chỉnh chain specification để bao gồm thêm thông tin. Ví dụ: bạn có thể cấu hình node để kết nối đến các block cụ thể ở các chiều cao cụ thể để ngăn chặn các cuộc tấn công tầm xa khi đồng bộ hóa một node mới từ genesis. Lưu ý rằng bạn có thể tùy chỉnh cài đặt node sau genesis. Tuy nhiên, các node chỉ thêm các peer sử dụng cùng một protocolId
.
Tất cả các node trong mạng lưới phải đồng ý về trạng thái genesis trước khi chúng có thể đồng ý về bất kỳ block nào tiếp theo. Thông tin được cấu hình trong phần genesis của chain specification được sử dụng để tạo ra một genesis block. Khi bạn khởi động node đầu tiên, nó có hiệu lực và không thể bị ghi đè bằng các tùy chọn dòng lệnh. Tuy nhiên, bạn có thể cấu hình một số thông tin trong phần genesis của chain specification. Ví dụ: bạn có thể tùy chỉnh nó để bao gồm thông tin như:
sudo
.Các node cũng yêu cầu Wasm đã được biên dịch để thực thi logic runtime trên chuỗi, vì vậy runtime ban đầu cũng phải được cung cấp trong chain specification. Để có cái nhìn chi tiết hơn về việc tùy chỉnh genesis chain specification, hãy xem tài liệu Polkadot SDK.
Một runtime thường yêu cầu một số mục lưu trữ được cấu hình tại genesis. Điều này bao gồm trạng thái ban đầu cho các pallet, ví dụ: số dư mà các tài khoản cụ thể có, hoặc tài khoản nào sẽ có quyền sudo. Các giá trị lưu trữ này được cấu hình trong phần genesis của chain specification. Bạn có thể tạo một file patch
và đưa nó vào bằng tiện ích chain-spec-builder
, như được giải thích trong phần Tạo Chain Specification Tùy Chỉnh.
Người dùng thường làm việc với định dạng JSON của chain specification. Bên trong, chain specification được nhúng trong cấu trúc GenericChainSpec
, với các thuộc tính cụ thể có thể truy cập thông qua cấu trúc ChainSpec
. Chain specification bao gồm các key sau:
name
: Tên có thể đọc được cho mạng lưới.id
: Mã định danh có thể đọc được cho máy cho mạng lưới.chainType
: Loại chuỗi để khởi động.bootNodes
: Danh sách các multiaddress thuộc về bootnode của chuỗi.telemetryEndpoints
: Danh sách tùy chọn các multiaddress cho các điểm cuối telemetry với các mức độ chi tiết khác nhau từ 0 đến 9 (0 là mức độ chi tiết thấp nhất).protocolId
: Mã định danh giao thức tùy chọn cho mạng lưới.forkId
: ID fork tùy chọn, thường nên để trống; nó có thể được sử dụng để báo hiệu một fork ở cấp độ mạng lưới khi hai chuỗi chia sẻ cùng một genesis hash.properties
: Các thuộc tính tùy chỉnh được cung cấp dưới dạng một đối tượng JSON key-value.codeSubstitutes
: Một ánh xạ tùy chọn của số block đến mã Wasm.genesis
: Cấu hình genesis cho chuỗi.Ví dụ, JSON sau đây cho thấy một file chain specification cơ bản:
{
"name": "chainName",
"id": "chainId",
"chainType": "Local",
"bootNodes": [],
"telemetryEndpoints": null,
"protocolId": null,
"properties": null,
"codeSubstitutes": {},
"genesis": {
"code": "0x..."
}
}
Để tạo một chain specification tùy chỉnh, bạn có thể sử dụng công cụ chain-spec-builder
. Đây là một công cụ CLI được sử dụng để tạo chain specification từ runtime của một node. Để cài đặt công cụ, hãy chạy lệnh sau:
cargo install --git https://github.com/paritytech/polkadot-sdk --force staging-chain-spec-builder
Để xác minh cài đặt, hãy chạy lệnh sau:
chain-spec-builder --help
Để tạo một chain specification plain, trước tiên hãy đảm bảo rằng runtime đã được biên dịch và có sẵn tại đường dẫn được chỉ định. Tiếp theo, bạn có thể sử dụng tiện ích sau trong dự án của mình:
chain-spec-builder create -r INSERT_RUNTIME_WASM_PATH INSERT_COMMAND
Thay thế INSERT_RUNTIME_WASM_PATH
bằng đường dẫn đến file runtime Wasm và INSERT_COMMAND
bằng lệnh để chèn runtime vào chain specification.
Các lệnh có sẵn là:
patch
: Ghi đè cấu hình genesis mặc định của runtime bằng patch được cung cấp.full
: Xây dựng cấu hình genesis cho runtime bằng file JSON. Không có giá trị mặc định nào sẽ được sử dụng.default
: Lấy cấu hình genesis mặc định cho runtime và sử dụng nó trong ChainSpec
. Lưu ý rằng cấu hình genesis mặc định có thể không hợp lệ.named-preset
: Sử dụng preset có tên được cung cấp bởi runtime để xây dựng chain specification.Với các bản nâng cấp runtime, runtime của blockchain có thể được nâng cấp với logic kinh doanh mới hơn. Chain specification chứa thông tin được cấu trúc theo cách mà runtime của node có thể hiểu được. Ví dụ, xem xét đoạn trích này của một mục phổ biến cho chain specification:
"sudo": {
"key": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"
}
Trong file JSON chain specification plain, các key và các giá trị liên quan có định dạng dễ đọc, có thể được sử dụng để khởi tạo genesis storage. Khi chain specification được tải, runtime chuyển đổi các giá trị có thể đọc được này thành các mục lưu trữ trong trie. Tuy nhiên, đối với các mạng lưới tồn tại lâu dài như testnet hoặc chuỗi production, sử dụng định dạng raw để khởi tạo storage được ưu tiên hơn. Điều này tránh sự cần thiết phải chuyển đổi bởi runtime và đảm bảo rằng các mục lưu trữ vẫn nhất quán, ngay cả khi có các bản nâng cấp runtime.
Để cho phép một node với một runtime đã nâng cấp đồng bộ hóa với một chuỗi từ genesis, chain specification plain được mã hóa ở định dạng raw. Định dạng raw cho phép phân phối các chain specification mà tất cả các node có thể sử dụng để đồng bộ hóa chuỗi ngay cả sau khi nâng cấp runtime.
Để chuyển đổi chain specification plain sang chain specification raw, bạn có thể sử dụng tiện ích sau:
chain-spec-builder convert-to-raw chain_spec.json
Sau khi chuyển đổi sang định dạng raw, đoạn code sudo key
trông như sau:
"0x50a63a871aced22e88ee6466fe5aa5d9": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"
Chain specification raw có thể được sử dụng để khởi tạo genesis storage cho một node.
Bài viết liên quan