Trong bài trước, chúng ta đã cài đặt Geth trên hệ điều hành Ubuntu. Trong bài này, chúng ta sẽ xây dựng một hệ thống private blockchain.
Phân loại blockchain
Blockchain được chia ra làm 3 loại, bao gồm:
Main net, là hệ thống blockchain chính, các đồng tiền ảo trong network này có giá trị sử dụng và trao đổi thực tế.
Private net, là hệ thống do một một cá nhân hoặc tổ chức tạo ra, các đồng tiền ảo trong hệ thống này không có giá trị trao đổi trong thực tế.
Consortium có thể hiểu là một nhóm các tổ chức hợp tác với nhau để dựng nên một hệ thống private blockchain cho mình.
Trong hướng dẫn này, chúng ta sẽ cài đặt một hệ thống private blockchain.
Thiết lập genesis block
Trước tiên, chúng ta sẽ tạo một thư mục có tên là ethereum và làm việc trong thư mục này:
mkdir ethereum cd ethereum
Khổi nguyên thủy (genesis block) là khối đầu tiên của hệ thống, khối này sẽ định nghĩa các điều kiện và nguyên tắc của hệ thống cho các node và miner muốn tham gia vào.
Để cấu hình (thiết lập) genesis block, trong thư mục gốc của dự án, tạo một file có tên genesis.json, sau đó mở file và dán vào nội dung sau:
{ "nonce": "0x0000000000000042", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "difficulty": "0x400", "alloc": {}, "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x436861696e536b696c6c732047656e6573697320426c6f636b", "gasLimit": "0xffffffff", "config": { "chainId": 88, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }}
Trong đoạn code này, chúng ta chỉ cần chú ý vào các giá trị sau:
- difficulty: là độ khó để mã hóa một block, nếu chỉnh độ khó càng cao đồng nghĩa với tốc độ đào của miner càng chậm.
- chainId: cũng như một địa chỉ ip hay một port, chainId được dùng để khai báo id của hệ thống blockchain.
- Lưu ý là không được dùng các id sau, bởi vì các id này đã được sử dụng:
chainId | Network |
1 | Mainnet |
2 | Expanse – An alternative Ethereum implementation |
3 | Ropsten – Ethereum test network |
4 | Rinkeby – Ethereum test network |
42 | Kovan – Ethereum test network |
61 | Ethereum Classic Mainnet – Ethereum Classic main network |
62 | Morden – Ethereum Classic test network |
Tạo miner và tài khoản
Chúng ta tiếp tục tạo một thư mục để chứa dữ liệu của miner, tôi sẽ đặt tên là miner1.
Trong thư mục đang làm việc, mở terminal và nhập vào lệnh sau để khởi tạo miner từ file genesis:
geth --datadir miner1 init genesis.json
Khi thành công, terminal sẽ xuất ra các thông tin sau:
Để tạo tài khoản cho miner, nhập tiếp vào lệnh sau:
geth --datadir miner1 account new
Geth sẽ yêu cầu chúng ta nhập mật khẩu cho tài khoản.
Kiểm tra lại thư mục miner1, ta sẽ thấy xuất hiện 2 thư mục mới là keystore và geth.
Hình 10 – Thư mục sau khi cài đặt miner.
Khởi động miner và bắt đầu đào (mining):
Trong thư mục miner1, chúng ta sẽ tạo một shell script để khởi động miner, tạo một file có tên là startMiner.sh với nội dung như sau:
geth --identity "miner1" --networkid 88 --datadir "/home/trinh/Desktop/ethereum/miner1" --rpc --rpcapi "db,eth,net,web3,personal" --rpcport "8545" --unlock 0 --password /home/trinh/Desktop/ethereum/miner1/password.sec --ipcpath "~/.ethereum/geth.ipc"
Cũng trong thư mục miner1, tạo một file password.sec để lưu mật khẩu của tài khoản đã tạo, mục đích là để khi khởi động miner, thì geth sẽ dùng mật khẩu trong file này để tự động unlock tài khoản.
Sau đó, cấp quyền thực thi cho file script:
chmod +x startMiner.sh
Rồi nhập lệnh sau để khởi động miner:
sh startMiner.sh
Sau khi đã khởi động miner thành công, để điều khiển miner, ta mở một terminal mới và nhập lệnh:
geth attach
Để cho miner đào, chúng ta nhập lệnh:
miner.start()
Sau một khoảng thời gian đào, chúng ta nhập lệnh kiểm tra tiền (ETH) sẽ thấy số lượng tiền tăng lên:
web3.fromWei(eth.getBalance(eth.accounts[0]))
Để miner ngừng đào, chúng ta nhập lệnh:
miner.stop()
Vậy là xong phần hướng dẫn cài đặt geth và miner. Trong phần tiếp theo chúng ta sẽ kết nối các miner với nhau để đồng bộ dữ liệu.