Cài đặt mạng Ethereum với thuật toán đồng thuận PoA bằng Geth

Tram Ho

Xin chào tất cả các bạn, hôm nay mình muốn hướng dẫn mọi người cài đặt mạng Proof of Authority với clique của Geth (phát triển lên từ Go của Ethereum protocole). Cụ thể thì chúng ta sẽ tạo mạng ngang hàng (Peer-to-Peer) trên máy tính cá nhân, ngoài ra còn bootnode (discovery service) cũng được cài đặt.
Trước tiên, chúng ta phải cài đặt được Geth, các bạn có thể xem hướng dẫn tại đây. Đây là phiên bản cài đặt Geth trong máy mình

1. Bắt đầu

  • Ta tạo folder làm việc cho bài này cũng với đó là 1 folder con cho mỗi nút trong mạng, ví dụ dev và node1, node2

1.2 Tạo tài khoản

  • Mỗi tài khoản (hay 1 ví) sẽ có 1 cặp khóa gồm public key và private key, khóa public sẽ dùng để tương tác với bất kỳ nút mạng nào trong Blockchain, và khóa private sẽ dùng để tạo chữ ký cho các giao dịch trong mạng. Do đó, chúng ta phải cần ít nhất 2 tài khoản. Ta đi vào founder dev và chạy các lệnh sau

  • Việc này sẽ tạo folder keystore trong mỗi folder node1, node2. Trong keystore sẽ có file in ra địa chỉ tài khoản trùng với phần địa chỉ trong màn hình terminal bên trên.
  • Chúng ta có thể lưu địa chỉ của 2 nút trên vào 1 file txt trong thư mục dev, và lưu mỗi mật khẩu của 2 nút vào file password.txt trong mỗi founder

1.2 Tạo file genesis

  • File genesis này được sử dụng để tạo mạng Blockchain. Geth đi kèm với nhiều exception như puppeth hoặc bootnode. Bắt đầu với puppeth:

1.3 Khởi tạo các nút

  • Bây giờ chúng ta đã có file genesis.json, ta sẽ tạo 1 file giống genesis cho mỗi nút.

1.4 Tạo bootnode

  • Mục đích của bootnode là giúp các nút mạng liên hệ được với nhau. Các nút có ip động, có thể thay đổi tắt hoặc bật lại, nhưng bootnode thì có ip tĩnh, do đó 1 nút có thể tìm 1 nút khác thông qua bootnode.

  • Điều này sẽ tạo ra 1 mã encode duy nhất và được lưu trữ trong file boot.key
  • Ta sẽ hiển thị xem có những gì rồi:

  • Chúng ta sẽ có kết quả sau:

2. Thao tác với bootnode

2.1 Bắt đầu với bootnode service

2.2 Bắt đầu với các nút

  • Với nút 1, ta mở màn hình terminal mới và thực hiện:

  • Giải thích qua 1 chút:
  • –syncmode ‘full’giúp ngăn chặn lỗi loan truyền những khối độc hại.
  • –port 30311là cổng enode cho node1 và phải khác với cổng bootnode (đó là 30310). Trên một mạng thực (mỗi máy là 1 nút), sẽ sử dụng cùng một cổng.
  • –rpcapicho phép các mô-đun đã liệt kê được sử dụng qua các cuộc gọi RPC.
  • –bootnodescho biết nút của bạn tại địa chỉ nào để tìm bootnode của bạn. Thay thế bằng IP bootnode.
  • –networkIdnhư được định nghĩa trong devnet.json tập tin.
  • –unlock –password –mine báo cho nút để mở khóa tài khoản này, với mật khẩu trong tệp đó và bắt đầu thực hiện.
  • Tương tự với nút 2, mở màn hình terminal mới và thực hiện:

  • Lúc này, bootnode của bạn sẽ truyền các kết nối đến từ nút1 (cổng 30311) và nút2 (cổng 30312) như được hiển thị trong cửa sổ đầu cuối phía trên. Node1 (thiết bị đầu cuối giữa) và nút2 (thiết bị đầu cuối thấp hơn) nên vui vẻ khai thác và ký kết các khối.

2.2 Cập nhật tệp genesis

  • Chắc chắn khi xây dựng file genesis ta muốn sửa lại nó 1 lần nữa, mở file đó lên:

  • Trong phần code trên, ta đã xóa những địa chỉ trong mà puppeth đã tạo, và tạo thêm địa chỉ thứ 3 mà genesis được tạo sau đã hỗ trợ. Sau đó, thay đổi period từ 15s thành 1s để các block được thực hiện nhanh hơn. Tăng gasLimit để cho phép các giao dịch được thực hiện nhiều hơn.
  • Tiếp theo ta vào 2 thư mục node1 và node2 để xóa thư mục geth trong 2 thư mục này. Thực hiện như sau để tạo lại 2 thư mục geth:

3. Tương tác giữa các nút

3.1 Mở Javascript Geth Console

3.1.1 Thông qua ipc

  • IPC chỉ hoạt động trên máy chúng ta, mở 1 màn hình terminal:

  • Ta có ngay file geth.rpc khi nút này đang chạy, khi nút tắt thì sẽ không có file này nữa.
  • RPC cung cấp quyền truy cập mà không hạn chế đối với tất cả các mô-đun được liệt kê trong terminal: admin: 1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

3.1.2 Thông qua rpc

  • RPC ( Remote Procedure Call ) hoạt động qua internet dưới dạng các yêu cầu HTTP. Do đó, thông tin trên máy tính chúng ta có thể bị lộ ra bên ngoài qua internet.
  • Kết nối với nút 1 bằng rpc:

3.1.3 Sử dụng Javascript Geth Console

  • Dưới đây là 1 ví dụ:

3.2 Sử dụng MIST

  • Mist cung cấp 1 giao diện đồ họa cho phép chúng ta tương tác với smart contract và quản lý các tài khoản (ví).
  • Kết nối mist với mạng cục bộ rpc: /dev$ mist --rpc node1/geth.ipc và trên mist --rpc 'http://localhost:8501' (rpc phải được bật trước)
  • Ngoài mist chúng ta cũng có thể dùng Ethereum Wallet để quản lý tài khoản

Thực hiện cuộc gọi RPC

  • Trong phẩn 3.1, chúng ta đã tương tác với Geth API bằng tay, bây giờ chúng ta có thể làm với rpc 1 cách tự động.
  • Chúng ta có thể gửi các request JSON RPC đến các nút thông qua thư viện javascript web3.js, hoặc bằng java thông qua web3.j hoặc bằng pythong thông qua web3.py.
  • Dưới đây là 1 ví dụ về request Geth API gửi đến 1 nút:

  • Về phương thức geth_transactionCount chúng ta có thể đọc tài liệu tại đây

3.4 Triển khai và deploy smart contract với Truffle trong mạng của mình

  • Truffle là 1 công cụ tốt giúp phát triển smart contract. Trước khi thực hiên bất cứ điều gì với truffle, ta phải khởi tạo trước:

  • Nó tạo 1 loạt các thư mục và tệp, chúng ta sẽ chỉnh sửa tệp truffle.js như sau:

  • Sau đó: $ truffle deploy --network devnet để deploy smart contract (ví dụ bạn có file solidity là X.sol) được định nghĩa trong migrations/X_deploy.js. Và chúng ta kiểm tra với $ truffle test --network devnet.
  • Thông thường công cụ giả lập Ethereum Blockchain Ganache là khá tốt để chúng ta phảt triển smart contract nhưng việc xây dựng 1 mạng riêng để deploy smart contract cũng tốt không kém. Ngoài ra, genache chỉ thích hợp với lớp trừu tượng lớn, không cần thiết vì nó khá phức tạp.

Nguồn Geth, Proof-of-Authority, Truffle

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo