Xây dựng ứng dụng Blockchain với Go - Phần 1

Blockchain là một trong những công nghệ mang tính cách mạng nhất của thế kỷ 21, blockchain vẫn đang phát triển và còn nhiều tiềm năng chưa được khai thác hết.


6 min read
Xây dựng ứng dụng Blockchain với Go - Phần 1

Blockchain là một trong những công nghệ mang tính cách mạng nhất của thế kỷ 21, blockchain vẫn đang phát triển và còn nhiều tiềm năng chưa được khai thác hết. Về bản chất mà nói, blockchain chỉ là một cơ sở dữ liệu phân tán chứa các bản ghi (records).

Nhưng điều làm cho nó trở nên độc đáo là một cơ sở dữ liệu công khai thay vì riêng tư, mọi người sử dụng đều sở hữu một phần or bản sao đầy đủ. Tất cả các bản sao này được cập nhật khi dữ liệu hoặc giao dịch mới được ghi vào blockchain thông qua sự đồng thuận của tất cả mọi người tham gia. Chính blockchain đã tạo ra tiền mã hóa (cryptocurrencies) và hợp đồng thông minh (smart contracts).

Photo by Benjamin Lambert / Unsplash

Trong loạt bài viết này, chúng ta sẽ cùng nhau xây dựng một loại tiền mã hóa đơn giản dựa trên việc triển khai chuỗi khối đơn giản.

Block

Hãy bắt đầu với "block". Trong blockchain, block này lưu trữ thông tin có giá trị. Ví dụ: các blocks của bitcoin lưu trữ các giao dịch (transactions), đó cũng là bản chất của bất kỳ loại tiền mã hóa nào. Bên cạnh đó, với mỗi block chứa một số thông tin kỹ thuật như: version, timestamp, và các hàm băm của block trước đó. ‌

Trong bài viết này, chúng ta sẽ không triển khai các blocks như trong tài liệu mô tả kỹ thuật của blockchain hoặc Bitcoin, thay vào đó sẽ sử dụng một phiên bản đơn giản hóa, chỉ chứa một số thông tin quan trọng:

Ví dụ:

type Block struct {
	Timestamp     int64
	Data          []byte
	PrevBlockHash []byte
	Hash          []byte
}

Timestamp là 1 kiểu dữ liệu thời gian, nhưng được biểu diễn dưới dạng 1 số nguyên (khi khối được tạo),Data là thông tin có giá trị thực tế có trong block, PrevBlockHash lưu trữ hàm băm của block trước đó và Hash là hàm băm của block. Trong mô tả kỹ thuật của Bitcoin Timestamp, PrevBlockHashHash là các block headers, tạo thành cấu trúc dữ liệu riêng biệt và các transactions (ở đây là Data) là một cấu trúc dữ liệu riêng biệt. Vì vậy, chúng ta gộp chúng cho đơn giản.

Vậy làm thế nào để chúng ta tính các giá trị hashes? Cách tính hashes là tính năng rất quan trọng của blockchain và chính tính năng này giúp blockchain an toàn. Vấn đề là tính toán hashes là một việc khó, phải tiêu tốn thời gian ngay cả trên các máy có sức tính toán nhanh (đó là lý do tại sao mọi người mua GPU để đào Bitcoin).

Đây là một thiết kế kiến ​​trúc có chủ ý khiến cho việc thêm các block mới trở nên khó khăn, do đó ngăn chặn sự sửa đổi sau khi chúng được thêm vào. Chúng ta sẽ thảo luận cơ chế này trong một bài viết khác.

Hiện tại, chúng ta sẽ chỉ lấy các trường block, ghép chúng và tính toán hàm băm SHA-256 dựa vào các giá trị: PrevBlockHash, Data, timestamp. Xem phương thức SetHashd dưới đây:

func (b *Block) SetHash() {
	timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
	headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})
	hash := sha256.Sum256(headers)

	b.Hash = hash[:]
}

Tiếp theo, chúng ta sẽ thực hiện việc tạo một block đơn gisản:

func NewBlock(data string, prevBlockHash []byte) *Block {
	block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}
	block.SetHash()
	return block
}

Blockchain

Bây giờ hãy cùng tạo một blockchain. Về bản chất mà nói, blockchain chỉ là một cơ sở dữ liệu với cấu trúc nhất định: đó là một danh sách liên kết ngược (back-linked list).  Xem hình dưới

back-linked list

Điều đó có nghĩa là các blocks được lưu trữ bằng cách chèn vào sau và mỗi block được liên kết với block trước đó. Cấu trúc này cho phép nhanh chóng lấy được block mới nhất trong chuỗi và để có được một block bằng hàm băm (hash) của nó.

Trong Golang, cấu trúc này có thể được thực hiện bằng cách sử dụng một mảng (array) và map, chúng ta sẽ chỉ sử dụng một mảng vì hiện tại không cần phải lấy khối bằng hash của chúng.

type Blockchain struct {
	blocks []*Block
}

Dưới đây là hàm để thêm mới các blocks:

func (bc *Blockchain) AddBlock(data string) {
	prevBlock := bc.blocks[len(bc.blocks)-1]
	newBlock := NewBlock(data, prevBlock.Hash)
	bc.blocks = append(bc.blocks, newBlock)
}

Để thêm một block mới cần phải có sẵn một block trước đó, trong bất kỳ blockchain nào cũng phải có ít nhất một block đầu tiên trong chuỗi, nó được gọi là genesis block.

Cách để tạo ra một genesis block:

func NewGenesisBlock() *Block {
	return NewBlock("Genesis Block", []byte{})
}

Bây giờ, chúng ta có thể thực hiện tạo ra một blockchain với block đầu tiên.

func NewBlockchain() *Blockchain {
	return &Blockchain{[]*Block{NewGenesisBlock()}}
}

Hãy kiểm tra xem blockchain có hoạt động chính xác không:

func main() {
	bc := NewBlockchain()

	bc.AddBlock("Send 1 BTC to Ivan")
	bc.AddBlock("Send 2 more BTC to Ivan")

	for _, block := range bc.blocks {
		fmt.Printf("Prev. hash: %x\n", block.PrevBlockHash)
		fmt.Printf("Data: %s\n", block.Data)
		fmt.Printf("Hash: %x\n", block.Hash)
		fmt.Println()
	}
}

Kết quả:

Prev. hash:
Data: Genesis Block
Hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168

Prev. hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168
Data: Send 1 BTC to Ivan
Hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1

Prev. hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1
Data: Send 2 more BTC to Ivan
Hash: 561237522bb7fcfbccbc6fe0e98bbbde7427ffe01c6fb223f7562288ca2295d1

Kết luận

Việc xây dựng một mô hình blockchain khá đơn giản: nó chỉ là một mảng các blocks, với mỗi block liên kết với block trước đó. Trong phiên bản blockchain đơn giản này, việc thêm các blocks mới rất dễ dàng và nhanh chóng, nhưng trong thực tế người ta phải thực hiện một số tính toán phức tap, khó khăn trước khi có quyền thêm block mới (tìm hiểu cơ chế Proof-of-Work).

Ngoài ra, blockchain là một cơ sở dữ liệu phân tán, không chỉ được quyết định bởi một người. Do đó, một block mới phải được xác nhận và phê duyệt bởi những người tham gia trong cùng mạng lưới (cơ chế này được gọi là sự đồng thuận hay consensus).

Trong bài viết sau chúng ta sẽ tìm hiểu & thực hiện một số giao dịch trong blockchain.

Hẹn gặp lại các bạn ở phần 2!

Related Articles

GO TOP

🎉 You've successfully subscribed to itplusX!
OK
]