Cách tạo Blockchain của riêng bạn từ đầu
Ngày 12/07/2024 - 08:07Blockchain là gì ? Có khó để xây dựng một blockchain không? Bạn bắt đầu từ đâu? Tôi nên sử dụng ngôn ngữ lập trình nào?
Tôi thường nhận được những câu hỏi này khi gặp những người quan tâm đến công nghệ blockchain. Bạn cũng có thể là một trong số những người đó, nhưng đừng lo, tôi cũng vậy.
4 bước để tạo ra một Blockchain
- Tạo một khối.
- Thêm dữ liệu (tiêu đề và nội dung) vào khối.
- Băm khối.
- Ghép các khối lại với nhau.
Có rất nhiều tài nguyên blockchain trực tuyến, nhưng có thể rất khó hiểu và gây nản lòng đối với người mới bắt đầu tìm hiểu công nghệ đang bùng nổ này. Tuy nhiên, bài viết này hơi khác so với các tài nguyên khác.
Tôi sẽ cùng bạn tiếp cận chủ đề này từng bước một và hướng dẫn bạn các khái niệm cơ bản về blockchain và cách lập trình blockchain bằng Golang (Go) .
Về tốc độ, độ bền và bảo mật, hầu hết các công cụ cốt lõi của blockchain đều được xây dựng bằng C/C++ (Bitcoin, EOS, v.v.), Go (Hyperledger Fabric, Ethereum), Java (Ethereum), Rust , Haskell (Cardano) và/hoặc Ruby (Ethereum), sau đó cung cấp liên kết với các ngôn ngữ lập trình dễ sử dụng khác.
Ngoài ra, một số công cụ blockchain kết hợp nhiều ngôn ngữ lập trình để tăng tính mạnh mẽ và dễ sử dụng cho các nhà phát triển. Ethereum là ví dụ tốt nhất về điều này.
Tôi cần những điều kiện tiên quyết nào để tạo ra một Blockchain?
- Một mạng lưới.
- Mật mã học.
- Cấu trúc dữ liệu và thuật toán.
- Hệ thống phi tập trung.
- Kiến thức về Javascript, Go hoặc Python.
Bạn chỉ cần hiểu những khái niệm cơ bản để lập trình nguyên mẫu blockchain đầu tiên của mình, vậy hãy bắt đầu với một số lý thuyết.
Blockchain là gì?
Bạn không thể lập trình thứ mà bạn không hiểu, đúng không? Hãy cùng phân tích nhé. Blockchain không phải là Bitcoin. Blockchain không phải là tiền kỹ thuật số , Blockchain là một tập hợp các công nghệ khác nhau đã tồn tại trước khi nó được tạo ra.
Vậy, đây có phải là blockchain không?
Không, nhưng hãy kiên nhẫn với tôi.
Hãy đơn giản hóa vấn đề bằng một ví dụ và một số số liệu.
Hãy lấy một cơ sở dữ liệu MySQL lưu trữ một số thông tin trong các bảng khác nhau.
Với cơ sở dữ liệu trên, có một số hạn chế. Nó cho phép bạn thực hiện một số tác vụ, bao gồm:
- Các hoạt động tạo, truy xuất, cập nhật và xóa (CRUD).
- Lưu trữ cùng một thông tin hai lần.
Nhưng nó có nhiều hạn chế, bao gồm:
- Chúng ta có thể xóa toàn bộ cơ sở dữ liệu một cách vô tình hoặc cố ý.
- Chúng tôi không thể chia sẻ thông tin nhạy cảm với người khác.
- Nó được tập trung hóa, nghĩa là chỉ có một điểm lỗi và một vấn đề bảo mật.
- Không có cách nào để tin tưởng mọi thứ được lưu trữ trong đó.
- Những người có ý định xấu có thể xâm nhập vào cơ sở dữ liệu.
- Cơ sở dữ liệu cần một người quản lý.
- Người dùng không có quyền kiểm soát dữ liệu của chính họ
Chúng ta cần thứ gì đó khác biệt, minh bạch, đáng tin cậy và độc lập với con người. Thứ gì đó tự động, không thể thay đổi, phi tập trung và không thể phá hủy. Đó chính là lúc blockchain phát huy tác dụng.
Blockchain là một cơ sở dữ liệu và mạng lưới phi tập trung an toàn, đáng tin cậy, tất cả trong một.
Blockchain hoạt động như thế nào?
Nói cách khác, blockchain là một chuỗi các khối. Các khối này giống như các bảng trong cơ sở dữ liệu, nhưng chúng không thể bị xóa hoặc cập nhật. Các khối chứa thông tin như giao dịch, nonce, bit mục tiêu, độ khó, dấu thời gian, băm khối trước đó, băm khối hiện tại, cây Markle và ID khối, v.v. và các khối được xác minh bằng mật mã và được xâu chuỗi lại để tạo thành một chuỗi bất biến được gọi là blockchain hoặc sổ cái.
Chuỗi tương tự sau đó được phân phối tới tất cả các nút (máy tính hoặc thợ đào) trên toàn mạng thông qua mạng P2P.
Vì vậy, thay vì một cơ sở dữ liệu tập trung, tất cả các giao dịch (dữ liệu) được chia sẻ giữa các nút đều được chứa trong các khối , được liên kết với nhau để tạo thành sổ cái. Sổ cái này đại diện cho tất cả dữ liệu trong chuỗi khối. Tất cả dữ liệu trong sổ cái được bảo mật bằng băm mật mã và chữ ký số và được xác thực bằng thuật toán đồng thuận. Các nút trên mạng tham gia để đảm bảo rằng tất cả các bản sao của dữ liệu được phân phối trên toàn mạng đều giống nhau .
5 khái niệm chính trong hệ sinh thái Blockchain
- Băm mật mã và chữ ký số.
- Sổ cái không thể thay đổi.
- Mạng P2P.
- Thuật toán đồng thuận (PoW, PoS, PBFT, ETc…).
- Xác thực khối (Khai thác, Rèn, v.v.).
Tôi sẽ giải thích những khái niệm này chi tiết hơn khi chúng ta thực hiện.
Lợi ích của việc sử dụng Blockchain là gì?
Có một số lợi ích khi sử dụng blockchain , bao gồm:
- Loại bỏ các tổ chức trung gian.
- Một sổ cái không thể thay đổi
- Tính minh bạch
- Bảo vệ
- độ tin cậy
Khi nào bạn nên sử dụng Blockchain?
Blockchain không phải là giải pháp hoàn hảo, vì vậy, tốt nhất nên sử dụng nó khi:
- Dữ liệu được lưu trữ không thể sửa đổi (bằng chứng về sự tồn tại).
- Dữ liệu không thể bị chủ sở hữu phủ nhận (không thể chối bỏ).
- Bạn muốn phân quyền.
- Bạn muốn có một nguồn sự thật.
- Bạn muốn có tính bảo mật cao.
- Bạn không quan tâm đến tốc độ. Ví dụ, Bitcoin mất trung bình 10 phút để xác thực một khối giao dịch. Nhưng một số blockchain nhanh hơn vì chúng sử dụng các thuật toán đồng thuận khác ngoài PoW. Chúng ta sẽ nói về điều này sau.
Các trường hợp sử dụng Blockchain
Blockchain không chỉ giới hạn ở tiền điện tử và bitcoin. Nó có thể được sử dụng trong nhiều lĩnh vực khác nhau, bao gồm:
- Bất động sản : Quyền sở hữu đất đai.
- Chăm sóc sức khỏe : Ghi lại dữ liệu của bệnh nhân một cách an toàn.
- Tài chính : Giảm thuế và trung gian, chống rửa tiền và thanh toán xuyên biên giới.
- Chuỗi cung ứng : Theo dõi các mặt hàng từ nhà cung cấp đến khách hàng, bao gồm xác minh tính xác thực và tạo nội dung gốc.
- An ninh mạng : Tấn công DDOS.
- Trao lại quyền cho người dùng: Sở hữu dữ liệu của bạn và chia sẻ dữ liệu đó một cách an toàn với bất kỳ ai bạn muốn (DID).
- Tiền điện tử .
- Cơ chế bỏ phiếu .
Nền tảng và ứng dụng Blockchain cần biết
- Bitcoin
- Ethereum
- Vải Hyperledger
- Tiền điện tử
- Chuỗi liên kết
- Cardano
- Dogecoin (đồng tiền meme)
Các loại Blockchain
Có ba loại blockchain:
- Riêng tư: Chỉ sử dụng nội bộ và khi chúng tôi biết người dùng (ví dụ: Hyperledger Fabric).
- Công khai: Mọi người đều có thể thấy những gì đang diễn ra (Bitcoin, Ethereum).
- Kết hợp: Trong trường hợp bạn muốn kết hợp hai cách đầu tiên.
Tạo Blockchain của riêng bạn
Có hai cách để xây dựng một blockchain
- Cách dễ nhất là sử dụng blockchain mã nguồn mở được xây dựng sẵn như Ethereum (tạo các ứng dụng phân tán, altcoin , tài chính phi tập trung (DeFi) và mã thông báo không thể thay thế (NFT) , v.v.), Fabric (cấu hình blockchain riêng tư), EOS hoặc Cardano, v.v. để bạn không phải xử lý công cụ cốt lõi khó triển khai.
- Nếu điều đó không phù hợp với yêu cầu của bạn, thì bạn có thể xây dựng một cái từ đầu hoặc fork, sửa đổi và/hoặc cải thiện mã nguồn mở blockchain hiện có. Ví dụ, Litecoin và Bitcoin cash đã được fork từ Bitcoin. Phương pháp cuối cùng này khó hơn, tốn nhiều thời gian hơn và đòi hỏi nhiều công sức và một đội ngũ mạnh.
Trong bài viết này, chúng tôi sẽ xây dựng một nguyên mẫu blockchain từ đầu để bạn có thể hiểu rõ về máy trạng thái của blockchain.
Cách tạo Blockchain từ đầu trong Go
Chúng ta sẽ tạo blockchain con đầu tiên trong Go. Bạn cũng có thể học cách tạo blockchain này trong Python và JavaScript . Các nguyên mẫu này có thể giúp bạn hiểu các khái niệm mà chúng tôi đã mô tả trước đó. Chúng ta sẽ hoàn thành việc này trong bốn bước:
- Tạo một khối.
- Thêm dữ liệu (tiêu đề và nội dung) vào khối.
- Băm khối.
- Ghép các khối lại với nhau.
Một khối chứa thông tin đã đề cập trước đó, nhưng để đơn giản hóa mọi thứ, chúng ta sẽ xóa một số thông tin. Hãy cùng đi sâu vào chi tiết.
Nếu bạn chưa quen với Go, hãy thử làm quen với những kiến thức cơ bản , bao gồm các hàm, phương thức, kiểu dữ liệu, cấu trúc, kiểm soát luồng và lặp, v.v.
1. Tạo một khối
Chúng ta sẽ bắt đầu bằng cách tạo một thư mục có hai tập tin trong đó main.govàblock.go
Cấu trúc thư mục
go // the folder
main.go // file 1
block.go // file 2
Chính.go
// use the main package
package main
//import the fmt package
import (
"fmt"
)
func main(){
fmt.Println("I am building my first blockchain") // print this
CreateBlock("The hearder will be shown here", "the body will be shown here") // call the function that will create the block and pass some parameters in it.
}Nếu bạn chạy chương trình này, nó sẽ hiển thị lỗi vì CreateBlockhàm chưa được định nghĩa, vì vậy hãy tiếp tục và tạo nó trong block.go.
package main
import (
"fmt" // this will help us to print on the screen
)
func CreateBlock(Header, Body string){
fmt.Println(Header ,"\n", Body) // Show me the block content
}
2. Thêm dữ liệu vào khối của bạn.
Cái hay của Go là bạn không cần phải nhập hoặc xuất các hàm, chỉ cần khai báo chúng bằng chữ in hoa, và Go sẽ tìm chúng cho bạn. Bây giờ, hãy mở một terminal và di chuyển đến thư mục bạn đã tạo, sau run go buildđó chạy .\gotrên Windows hoặc ./gotrên Linux và Macbook.

Ảnh chụp màn hình chương trình Go gọi một hàm và truyền một chuỗi dữ liệu. | Ảnh chụp màn hình: Sinai Nday
Chúng tôi vừa tạo một chương trình Go đơn giản gọi một hàm và truyền một số dữ liệu chuỗi. Hãy thêm hai tệp nữa blockchain.govà structures.go. Bây giờ chúng ta có bốn tệp: main.go, block.go, structures.go, vàblockchain.go
3. Băm khối của bạn
Tôi sẽ thêm một số bình luận vào mỗi dòng mã để bạn hiểu những gì tôi đang làm.
Cấu trúc.go
package main //Import the main package
// Create the Block data structure
// A block contains this info:
type Block struct { Timestamp int64 // the time when the block was created PreviousBlockHash []byte // the hash of the previous block MyBlockHash []byte // the hash of the current block AllData []byte // the data or transactions (body info)
}
// Prepare the Blockchain data structure :
type Blockchain struct { Blocks []*Block // remember a blockchain is a series of blocks
}
Chặn.đi
package main
import ( // We will need these libraries: "bytes" // need to convert data into byte in order to be sent on the network, computer understands better the byte(8bits)language "crypto/sha256" //crypto library to hash the data "strconv" // for conversion "time" // the time for our timestamp
)
// Now let's create a method for generating a hash of the block
// We will just concatenate all the data and hash it to obtain the block hash
func (block *Block) SetHash() { timestamp := []byte(strconv.FormatInt(block.Timestamp, 10)) // get the time and convert it into a unique series of digits headers := bytes.Join([][]byte{timestamp, block.PreviousBlockHash, block.AllData}, []byte{}) // concatenate all the block data hash := sha256.Sum256(headers) // hash the whole thing block.MyBlockHash = hash[:] // now set the hash of the block
}
// Create a function for new block generation and return that block
func NewBlock(data string, prevBlockHash []byte) *Block { block := &Block{time.Now().Unix(), prevBlockHash, []byte{}, []byte(data)} // the block is received block.SetHash() // the block is hashed return block // the block is returned with all the information in it
}
/* let's now create the genesis block function that will return the first block. The genesis block is the first block on the chain */
func NewGenesisBlock() *Block { return NewBlock("Genesis Block", []byte{}) // the genesis block is made with some data in it
}
Blockchain.go
package main
// create the method that adds a new block to a blockchain
func (blockchain *Blockchain) AddBlock(data string) { PreviousBlock := blockchain.Blocks[len(blockchain.Blocks)-1] // the previous block is needed, so let's get it newBlock := NewBlock(data, PreviousBlock.MyBlockHash) // create a new block containing the data and the hash of the previous block blockchain.Blocks = append(blockchain.Blocks, newBlock) // add that block to the chain to create a chain of blocks
}
/* Create the function that returns the whole blockchain and add the genesis to it first. the genesis block is the first ever mined block, so let's create a function that will return it since it does not exist yet */
func NewBlockchain() *Blockchain { // the function is created return &Blockchain{[]*Block{NewGenesisBlock()}} // the genesis block is added first to the chain
}
Chính.go
//Time to put everything together and test
package main
import ( "fmt" // just for printing something on the screen
)
func main() { newblockchain := NewBlockchain() // Initialize the blockchain // create 2 blocks and add 2 transactions newblockchain.AddBlock("first transaction") // first block containing one tx newblockchain.AddBlock("Second transaction") // second block containing one tx // Now print all the blocks and their contents for _, block := range newblockchain.Blocks { // iterate on each block fmt.Printf("Hash of the block %x\n", block.MyBlockHash) // print the hash of the block fmt.Printf("Hash of the previous Block: %x\n", block.PreviousBlockHash) // print the hash of the previous block fmt.Printf("All the transactions: %s\n", block.AllData) // print the transactions } // our blockchain will be printed
}Bây giờ chúng ta chạy nó, sau đó tiến hành xây dựng.\go .

Kết quả. | Ảnh chụp màn hình: Sinai Nday
Vâng, dễ phải không?
4. Nối các khối lại với nhau
Ồ, các khối của chúng ta trong blockchain không có bất kỳ ID và dấu thời gian nào. Vì vậy, hãy thêm thông tin đó bằng cách sửa đổi tệp main.go, thêm hai dòng này vào for loop:
fmt.Printf("Block ID : %d \n", i) fmt.Printf("Timestamp : %d \n", block.Timestamp+int64(i))//Time to put everything together and test
package main
import ( "fmt" // just for printing something on the screen
)
func main() { newblockchain := NewBlockchain() // Initialize the blockchain // create 2 blocks and add 2 transactions newblockchain.AddBlock("first transaction") // first block containing one tx newblockchain.AddBlock("Second transaction") // second block containing one tx // Now print all the blocks and their contents for i, block := range newblockchain.Blocks { // iterate on each block fmt.Printf("Block ID : %d \n", i) // print the block ID fmt.Printf("Timestamp : %d \n", block.Timestamp+int64(i)) // print the timestamp of the block, to make them different, we just add a value i fmt.Printf("Hash of the block : %x\n", block.MyBlockHash) // print the hash of the block fmt.Printf("Hash of the previous Block : %x\n", block.PreviousBlockHash) // print the hash of the previous block fmt.Printf("All the transactions : %s\n", block.AllData) // print the transactions } // our blockchain will be printed
}Chúng ta hãy lưu mã và chạy lại, sau đó tiến hành xây dựng./go .

Kết quả cuối cùng của blockchain của bạn. | Ảnh: Sinai Nday
Như bạn có thể thấy, blockchain được cấu trúc tốt. Ngoại trừ khối genesis, mỗi khối đều chứa hàm băm của nó và hàm băm của khối trước đó, khiến nó không thể thay đổi. Nếu dữ liệu trong khối bị thay đổi, hàm băm sẽ tự động thay đổi và khối sẽ bị loại bỏ. Khối genesis không có bất kỳ hàm băm nào trước đó vì nó là khối đầu tiên. Không có khối trước đó.
Và thế là xong. Xin chúc mừng, bạn vừa tạo ra blockchain con đầu tiên của mình trong Go.
Chúng tôi sẽ dần dần đáp ứng các yêu cầu của blockchain. Blockchain là một kiệt tác cần được thiết kế theo đúng mục đích.
Trong blockchain, cũng có hai vai trò chung. Một kỹ sư blockchain và một nhà phát triển blockchain . Một kỹ sư blockchain là một chuyên gia hiểu rõ các nguyên tắc của blockchain, bảo mật và kỹ thuật phần mềm để thiết kế, phát triển, bảo trì, thử nghiệm và đánh giá các công cụ cốt lõi và phần mềm blockchain. Một nhà phát triển blockchain là một chuyên gia xây dựng phần mềm trên blockchain được gọi là các ứng dụng phi tập trung.
Hầu hết các nhà phát triển blockchain đều sử dụng nền tảng và khuôn khổ blockchain mở như Ethereum, hyperledger fabric, EOS, v.v. Bây giờ bạn đã có những kiến thức cơ bản, bạn hãy quyết định mình muốn theo đuổi nền tảng nào.










