Xây dựng Blockchain từ đầu với Go (Phần 3) – Monolithic Event vs Transaction

Tram Ho

Giới thiệu

Ở phần trước, chúng ta đã tìm hiểu cơ bản về Transaction & DB State. Bạn nào chưa tìm hiểu thì có thể xem lại nhé.

Github: https://github.com/lequocbinh04/the-simple-blockchain

Tiếp tục câu chuyện

Tuesday evening, March 26.

Vào một buổi tối lạnh lẽo khi John đang vui vẻ xã stress với tựa game yêu thích của mình, John vô tình đã gõ nhầm rm -rf /., mọi thứ trên máy tính đã biến mất sạch sẽ, kể cả genesis.jsonstate.json cũng đã bị bay màu.

John, một senior developer, anh ấy vô cùng bực tức và chửi phụ huynh của chiếc máy tính, nhưng anh ấy ko hoảng sợ khi không có backup cho máy tính của mình, vì anh ấy đã có một thứ tốt hơn: mảnh giấy ghi lại toàn bộ giao dịch. Bây giờ việc của anh ấy cần làm là thực hiện lại những transactions và db của anh ấy sẽ được khôi phục.

Anh ấy vô cùng thích thú với phương án này, nên anh ấy quyết định sẽ phát triển MVP database của mình: Với mỗi hoạt động của quán bar (VD: thanh toán tiền nước), nó phải được ghi lại bên trong cơ sở dữ liệu của blockchain.

Mỗi khách hàng được ghi trong DB là một kiểu dữ liệu Account:

Mỗi Transaction (TX – sự thay đổi dữ liệu trong DB) sẽ có 4 attributes: from, to, value và data. Thuộc tính data là một giá trị là data của tx đó (vd: “reward” biểu thị cho transaction đó là phần thưởng cho John vì đã phát minh ra TBB và làm tăng tổng cung ban đầu của TBB).

Genesis DB vẫn là một file json:

Và mọi giao dịch, trước kia được viết vào giấy, giờ anh ấy đã viết vào file tx.db (mỗi dòng 1 file json là chi tiết của tx)

Và phần quan trọng nhất, chứa toàn bộ business login sẽ là State

State sẽ lưu lại toàn bộ số dư của người dùng, lịch sử giao dịch, ai chuyển TBB token cho ai. State bắt đầu bằng cách đọc dữ liệu init từ genesis.json

Sau khi load thành công số dư ban đầu của người dùng từ genesis.json chúng ta sẽ tuần tự thực hiện lại toàn bộ giao dịch trong tx.db

State component chịu trách nhiệm:

  • Thêm mới một transaction vào Mempool
  • Xác thực transaction (check số dư người dùng)
  • Thay đổi state
  • Persist state vào file
  • Tính toán lại toàn bộ giao dịch bắt đầu từ genesis

Thêm mới một transaction vào Mempool:

Persist state vào file

Xác thực transaction (check số dư người dùng)

Build một Command-Line-Interface (CLI)

Tuesday evening, March 26

John muốn có một cách để thêm transaction vào DB dễ dàng hơn và dễ dàng lấy ra số dư của user trên hệ thống. Vì go có thể build ra binary file nên John quyết định dựng một CLI để dễ dàng thao tác.

Cách dễ dàng để build 1 CLI với go là sử dụng thư viện github.com/spf13/cobra. Tiếp theo anh ấy tạo mới file cmd/tbb/main.go

Sau đó anh ấy tiến hành cài đặt CLI

Go sẽ tự động cài nó vào $GOPATH/bin và bạn có thể chạy trực tiếp lệnh tbb ở terminal, nhưng tất nhiên là hiện tại sẽ chưa có gì cả do hàm run ở file main.go đang rỗng.

Đầu tiên John sẽ thực hiện tạo version cho nó, cùng thư mục với main.go ta tạo version.go

Compile và run

Nuột!

Tương tự anh ấy tạo file balances.go

Lệnh balance sẽ in số dư của user ra màn hình

Tiếp theo John test lệnh balance

Ngon lành! tiếp theo John sẽ làm lệnh để tương tác với transaction, anh ấy tạo tiếp file ./cmd/tbb/tx.go

tbb tx add để thêm mới một tx vào db

Lệnh tbb tx add sẽ có 3 flag bắt buộc--from, --to--value. CLI đã hoàn thiện!

John lần lượt thực hiện add những tx anh ấy đã ghi trên tờ giấy

Get balance

Dữ liệu đã được ghi thành công!

Mempool

Mempool trong series này được thiết kế tác giả một cách rất rất đơn giản, nhằm mục đích giáo dục. Để biết rõ hơn về mempool trong các dự án thực tế các bạn có thể tự mình tìm hiểu tại code của go-ethereum

Tổng kết

[🔑] Block chain là một cơ sở dữ liệu.

Tổng cung của token, số dư ban đầu của user, và các setting của blockchain sẽ được đặt ở Genesis file. Số dư, trạng thái ban đầu của blockchain được ghi ở genesis file là không bao giờ thay đổi.

Các thay đổi lên cơ sở dữ liệu gọi là giao dịch (Transaction | TX). Giao dịch là các sự kiện cho các hành động trong hệ thống

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo