Hướng dẫn tạo và cấu hình Ethereum Consortium Network trên Azure
Bài đăng này đã không được cập nhật trong 6 năm
1. Giới thiệu
1.1. Tổng quan
Giải pháp Ethereum Consortium Network từ Microsoft Azure cho phép triển khai nhanh chóng một mạng blockchain Ethereum trên nền dịch vụ đám mây của Azure, từ đó giúp nhà phát triển phần mềm có môi trường để phát triển ứng dụng phân tán trên nền Ethereum mà không phải quan tâm nhiều đến việc quản lý mạng lưới đằng sau nó.
1.2. Kiến trúc của Ethereum Consortium Network
Một Ethereum Consortium Network trên Azure bao gồm một tập các node mạng ngang hàng với nhau, lưu trữ bản sao của cùng một Ethereum blockchain và đồng thuận trên cơ chế proof-of-work. Các node này được chia ra làm 2 loại là mining node và transaction node. Mining node có nhiệm vụ đồng bộ các transaction từ transaction node và lưu trữ chúng vào blockchain thông qua việc đào. Còn transaction node là một full node có nhiệm vụ gửi các transaction lên network, cũng như cung cấp các endpoint để ứng dụng phân tán có thể kết nối và tương tác với network.
Các mining node liên kết với nhau trong 1 private subnet để tạo thành 1 mạng thành viên (member network), và các mạng thành viên liên kết với nhau để tạo thành một consortium. Trong mỗi mạng thành viên, node đầu tiên của mạng sẽ kiêm luôn chức năng bootstrap node để các node khác thông qua bootstrap node có thể tìm thấy nhau. Các mạng thành viên chia sẻ chung một nhóm các transaction node, và các transaction node này được public ra bên ngoài để ứng dụng có thể kết nối và tương tác với mạng lưới. Tất cả các node đều được cài Geth phiên bản mới nhất và sử dụng chung một account làm coinbase.
2. Cách tạo Ethereum Consortium Network trên Azure
- Đăng nhập vào Azure Portal.
- Click nút “Create a resource”.
- Click menu Blockchain và chọn Ethereum Proof-of-work Consortium
- Ở phần 1. Basics ta setup các thông tin cơ bản như sau:
Thông số | Ý nghĩa | Giá trị |
---|---|---|
Create a new network or join existing network? | Tạo mạng blockchain mới hay bổ sung vào mạng có sẵn | Create New |
Deploy a network that will be part of a consortium? | Tạo mạng riêng (standalone) hay mạng cho phép join thêm các mạng khác (consortium) | Standalone |
Resource Prefix | Tiền tố cho các resource thuộc resource group (từ 2 - 4 kí tự) | Tuỳ ý |
VM user name | Tên tài khoản admin cho tất cả các máy ảo thuộc mạng blockchain (từ 5 - 16 kí tự) | Tuỳ ý |
Authentication type | Phương pháp xác thực trên node máy ảo | Password |
Password | Mật khẩu tài khoản admin (ít nhất 12 kí tự) | Tuỳ ý |
Subscription | Gói cước Azure | Gói cước hiện tại của tài khoản Azure |
Resource Group | Resource group của mạng blockchain | Create New, đặt tên tuỳ ý |
Location | Khu vực địa lý của resource group | Southeast Asia |
- Ở phần 2. Deployment regions ta setup khu vực địa lý của mạng blockchain như sau:
Thông số | Ý nghĩa | Giá trị |
---|---|---|
Number of region(s) | Số khu vực mà mạng blockchain được triển khai | 1 |
First region | Khu vực được triển khai đầu tiên | Southeast Asia |
- Ở phần 3. Network size and performance ta setup số lượng và cấu hình các node trong mạng blockchain. Trong bài viết này ta sẽ tạo 1 mạng với chi phí rẻ nhất, gồm 2 mining node và 1 transaction node. Cả 3 node này đều sẽ dùng máy ảo (VM) loại F1 (tối ưu cho tính toán, gồm 1 VCPU, 2GB RAM và 16 GB SSD) với hiệu năng ổ cứng là Standard.
Thông số | Ý nghĩa | Giá trị |
---|---|---|
Number of mining nodes | Số lượng mining node | 2 |
Mining node storage performance | Hiệu năng lưu trữ của mining node | Standard |
Mining node virtual machine size | Loại VM cho mining node | Standard F1 |
Number of load balanced transaction nodes | Số lượng transaction node | 1 |
Transaction node storage performance | Hiệu năng lưu trữ của transaction node | Standard |
Transaction node virtual machine size | Loại VM cho transaction node | Standard F1 |
- Ở phần 4. Ethereum settings ta setup thông số của mạng Ethereum như sau:
Thông số | Ý nghĩa | Giá trị |
---|---|---|
Consortium Member ID | ID của mạng thành viên. Mỗi mạng thành viên trong consortium sẽ có một ID riêng (là số nguyên tứ 0 đến 255) để cấu hình IP tránh xung đột. | 0 (do mạng là Standalone) |
Ethereum Network ID | Network ID của mạng Ethereum. | Tuỳ ý (khác 1) |
Custom genesis block | Cấu hình genesis block cho mạng Ethereum | No |
Ethereum Account Password | Mật khẩu của default account của mạng Ethereum | Tuỳ ý |
Ethereum private key passphrase | Chuỗi kí tự dùng để generate private key cho default account | Tuỳ ý |
- Ở phần 5. Operations Management Suite ta setup thông số của OMS. OMS (Operation Management Suite) là một dịch vụ của Azure nhằm thu thập các metric và log của network, từ đó cho phép theo dõi trạng thái sức khoẻ của network. Dịch vụ này là tuỳ chọn và ta có thể cài đặt nó hoặc không.
Thông số | Ý nghĩa | Giá trị |
---|---|---|
Monitoring | Kích hoạt dịch vụ OMS | Enable |
Connect to existing OMS | Kết nối tới OMS instance có sẵn? | Create New |
OMS Workspace Location | Khu vực địa lý của OMS instance | Southeast Asia |
- Ở phần 6. Summary ta kiểm tra lại các thông số triển khai và click OK.
- Ở phần 7. Buy ta đồng ý với các điều khoản và click Create để triển khai mạng Ethereum.
3. Kết nối với Ethereum Consortium Network
3.1. Lấy thông số kết nối
- Sau khi mạng Ethereum được triển khai xong, truy cập vào Resource Group của mạng.
- Click vào menu Deployment, chọn item đầu tiên (microsoft-azure-blockchain.azure-blockchain-ether-yyyymmddhhmmss)
- Click vào menu Output, ta sẽ thấy được các thông số kết nối tới mạng Ethereum, trong đó có 3 thông số quan trọng sau:
Thông số | Ý nghĩa |
---|---|
ADMIN-SITE | URL trang admin của mạng Ethereum |
ETHEREUM-RPC-ENDPOINT | URL RPC của mạng Ethereum |
SSH-TO-FIRST-TX-NODE-REGION1 | Lệnh SSH dùng để kết nối tới transaction node đầu tiên |
3.2. Truy cập trang admin
Trang admin là một ứng dụng web được viết trên nền NodeJS, sử dụng module Express và Web3. Ứng dụng này được host trên transaction node đầu tiên và tương tác với mạng Ethereum thông qua giao thức IPC trên node.
Để truy cập vào trang admin, ta nhập URL copy từ thông số ADMIN-SITE lên trình duyệt. Trang này gồm có 2 chức năng:
- Hiển thị trạng thái hiện tại của mạng Ethereum, bao gồm
- Địa chỉ và số dư hiện tại của coinbase account.
- Trạng thái các node trong mạng: tên node, số peer và số block mới nhất được đồng bộ.
- Chuyển tiền từ coinbase account sang account khác trong mạng.
3.3. Kết nối với RPC endpoint bằng Geth
Để kết nối với RPC endpoint, ta cài Geth ở máy local và chạy lệnh:
geth attach RPC_Endpoint_URL
Trong đó RPC_Endpoint_URL ta thay bằng URL copy từ thông số ETHEREUM-RPC-ENDPOINT ở trên.
Mặc định các API được enable bởi RPC server bao gồm eth, net, rpc và web3. Với các API này thì ta có thể xem trạng thái của mạng cũng như số dư của các tài khoản nhưng không thể tạo và quản lý tài khoản, cũng như deploy smart contract. Do đó ta sẽ phải điều chỉnh tham số chạy Geth trên transaction node để enable thêm các API khác. Việc này sẽ được đề cập ở phần sau.
3.4. Kết nối SSH với transaction node
Để có thể quản lý và điều khiển transaction node, ta cần kết nối với nó thông qua giao thức SSH bằng cách chạy lệnh kết nối ở thông số SSH-TO-FIRST-TX-NODE-REGION1 trên terminal. Khi chương trình yêu cầu nhập password, ta nhập password đã cấu hình cho tài khoản admin ở phần 1. Basics khi tạo mạng Ethereum.
Sau khi kết nối thành công, chạy lệnh ls
, ta sẽ thấy có nhiều file và thư mục ở trong thư mục của tài khoản admin. Chức năng của một số file/thư mục trong đó là như sau:
File/Thư mục | Chức năng |
---|---|
configure-geth-azureuser.sh |
Cài đặt và thiết lập geth & admin site |
etheradmin |
Thư mục chứa ứng dụng admin site |
etheradmin.log |
Log file của ứng dụng admin site |
ethstat |
Thư mục chứa ứng dụng gửi log tới OMS |
genesis.json |
Cấu hình genesis block của Geth |
geth.cfg |
File cấu hình chạy geth |
geth.log |
Log file của geth |
start-private-blockchain.sh |
Script khởi chạy geth và admin site |
Để ngưng kết nối SSH, ta chạy lệnh exit
.
4. Cấu hình transaction node
4.1. Cài đặt swap file cho VM
Do VM của transaction node có dung lượng RAM hạn chế nên geth khi chạy dễ gặp lỗi Out of memory và crash, vì vậy ta nên cài thêm bộ nhớ ảo (swapfile) để khắc phục. Cách cài như sau:
- Kết nối với transaction node bằng SSH.
- Chạy lệnh
df -h
và xem dung lượng còn trống của phân vùng/dev/sdb1
(mount point là/mnt
). Ví dụ như hình dưới đây là còn trống 15 GB.
- Mở file
/etc/waagent.conf
bằngnano
hoặcvim
(nhớ chạy vớisudo
) và sửa các thông số như dưới đây:
ResourceDisk.Format=y
ResourceDisk.EnableSwap=y
ResourceDisk.SwapSizeMB=8192
Lưu ý: Thông số SwapSizeMB là kích thước của swapfile theo đơn vị MB.
- Khởi động lại WALinuxAgent service bằng cách chạy câu lệnh
service walinuxagent restart
(yêu cầu password). - Khởi động lại VM bằng cách chạy câu lệnh
sudo shutdown -r now
. - Kết nối lại với VM bằng SSH, sau đó chạy câu lệnh
cat /proc/swaps
để xác nhận swapfile đã được tạo.
4.2. Enable API cho RPC server
Như đã đề cập ở phần trước để có thể thực hiện các thao tác như tạo và quản lý account, ta cần enable thêm các nhóm API khác của Ethereum. Để thực hiện điều này, ta sẽ bổ sung tham số --rpcapi
vào câu lệnh chạy geth
trên transaction node để enable các API mà ta cần. Cách thực hiện như sau:
- Kết nối với transaction node bằng SSH.
- Mở file
start-private-blockchain.sh
bằngnano
hoặcvim
. Cuộn xuống gần cuối file để thấy dòng lệnh chạygeth
(khu vực với header comment là Start geth node).
- Bổ sung đoạn sau vào sau đoạn
--rpccorsdomain="*"
:
--rpcapi="admin,db,debug,eth,miner,net,personal,shh,txpool,web3"
-
Lưu lại file và khởi động lại transaction node bằng lệnh
sudo shutdown -r now
. -
Kết nối với transaction node bằng Geth để xác nhận các API đã được enable.
Cảnh báo: Với giá trị tham số --rpcapi
như trên thì tất các API của Ethereum đều được cho phép sử dụng. Việc này chứa đựng rủi ro về bảo mật, do đó ta nên chỉnh lại giá trị của tham số để chỉ enable các API cần thiết.
Tài liệu tham khảo
https://docs.microsoft.com/en-us/azure/blockchain-workbench/ethereum-deployment-guide
https://gallery.technet.microsoft.com/Bletchley-Ethereum-4bc7d80d
https://github.com/CatalystCode/ibera-ethereum-consortium-blockchain-network
All rights reserved