Giờ đây ai cũng nói về tiền mã hóa - nhờ cơn sốt quanh Bitcoin. Thay vì tranh luận có bong bóng Bitcoin hay không, điều thú vị hơn là công nghệ này thực sự vận hành ra sao và có thể làm được gì. Câu chuyện Bitcoin bắt đầu với bản whitepaper mang tên "Bitcoin: A Peer-to-Peer Electronic Cash System" năm 2008. Trong tài liệu này, tác giả dùng bút danh Satoshi Nakamoto (đến nay vẫn còn nhiều tranh cãi về danh tính thật của Satoshi) giới thiệu một công nghệ và ý tưởng mang tính cách mạng: một đồng tiền điện tử phi tập trung chạy trên thứ gọi là blockchain. Từ đây, ý tưởng đã lan rộng và hiện có thể áp dụng cho nhiều lĩnh vực khác.
Tôi lần đầu được giới thiệu về blockchain tại một buổi họp của BlockchainSociety ở Oxford. Ai nấy đều tỏ ra rất hào hứng với tiềm năng của công nghệ mới này. Quả thực, nghe rất hấp dẫn: Một cơ sở dữ liệu phi tập trung, không thể bị can thiệp, lưu trữ giao dịch tiền tệ, hợp đồng hay bất cứ thứ gì bạn muốn (ví dụ như máy bỏ phiếu không thể bị hack). Lời hứa của blockchain với cộng đồng crypto là sẽ làm thay đổi cả ngành công nghiệp bằng cách cách mạng hóa niềm tin, đến mức chúng ta không còn cần các bên thứ ba như ngân hàng hay luật sư nữa - chỉ cần sức mạnh của mật mã học.
Mặc dù ý tưởng cơ bản khá trực quan, câu hỏi về cách blockchain hoạt động ở mức kỹ thuật lại khó nắm bắt hơn. Tuần trước, tôi bắt gặp một bài trên R-bloggers, nơi BigData Doc xây dựng một blockchain hoàn toàn bằng R. Blockchain viết bằng R có thể không phải là thứ hiệu quả và thực tiễn nhất, nhưng là cách tuyệt vời để hiểu các nguyên lý lập trình và mật mã đằng sau nó. Tôi cũng muốn hiểu rõ, nên đã triển khai một phiên bản nhỏ gọn của blockchain trong R: "Nếu bạn có thể code nó, bạn chắc chắn hiểu nó".
Blockchain là gì?
Giả sử mục tiêu của bạn là lưu trữ một số dữ liệu theo cách an toàn. Để làm vậy, trước tiên bạn lưu dữ liệu vào một vùng chứa - gọi là một khối (block). Trong trường hợp của Bitcoin, mỗi khối chứa một số giao dịch tài chính. Khi có giao dịch mới (hoặc có dữ liệu mới), một khối mới sẽ được tạo và được thêm cùng các khối trước đó để tạo thành một chuỗi - blockchain.
Hãy xem blockchain tận dụng mật mã học như thế nào để gần như không thể bị hack.
1. Các khối
block_example <-list(index =1,
timestamp ="2018-01-05 17.00 MST",
data ="some data",
previous_hash =0,
proof =9,
new_hash =NULL)Được hỗ trợ bởi
Trước khi bắt đầu xây dựng blockchain - tức là xâu chuỗi các vùng chứa dữ liệu lại với nhau - bạn cần biết thêm hai khái niệm: Băm (hashing) và Thuật toán Bằng chứng công việc (Proof-of-Work).
2. Hàm băm (Hash)
Hàm băm giúp đảm bảo tính toàn vẹn của một khối bằng cách liên kết nó với các khối khác trong chuỗi. Một hàm băm nhận đầu vào bất kỳ và cho ra kết quả đầu ra duy nhất đã được mã hóa. Ví dụ như sau: Bạn đưa cho bạn mình một câu đố "Chương trình thống kê nào tốt hơn: Stata hay R?" và đưa kèm giá trị băm của đáp án đúng: "71ec0b920622cf4358bbc21d6a8b41f903584808db53ec07a8aa79119304ce86". Giờ cô ấy có thể tự kiểm tra xem mình có câu trả lời đúng không chỉ bằng cách đưa câu trả lời vào hàm băm (trong trường hợp này là thuật toán SHA256):
library("digest")digest("Stata","sha256") # first tryĐược hỗ trợ bởi
## [1]"3ac273f00d52dc9caf89cbd71e73e5915229a588117ca3441630089409ddb7bc"Được hỗ trợ bởi
## [1]"71ec0b920622cf4358bbc21d6a8b41f903584808db53ec07a8aa79119304ce86"Được hỗ trợ bởi
Điều này giúp ích gì cho bạn?
Trong trường hợp này, bạn không chỉ đưa thông tin về khối (index, timestamp, data) vào hàm băm, mà còn cả giá trị băm của khối trước đó. Điều này có nghĩa bạn chỉ có thể tính ra giá trị băm hợp lệ nếu biết giá trị băm của khối trước, mà giá trị đó lại được tạo từ băm của khối trước nữa, cứ thế nối tiếp. Cách này tạo ra một chuỗi khối tuần tự, bất biến. Nếu bạn sửa đổi một khối về sau, bạn sẽ phải tính lại toàn bộ các giá trị băm cho các khối tiếp theo trong chuỗi.
#Function that creates a hashed "block"
hash_block <-function(block){
block$new_hash <-digest(c(block$index,
block$timestamp,
block$data,
block$previous_hash),"sha256")return(block)}Được hỗ trợ bởi
3. Bằng chứng công việc (Proof-of-Work)
Nếu có rất nhiều thông tin cần lưu trên blockchain, bạn sẽ cần tạo rất nhiều khối mới. Trong nhiều trường hợp, bạn muốn kiểm soát số lượng khối mới được tạo ra. Với tiền mã hóa chẳng hạn, đồng tiền sẽ mất giá nếu mỗi giây có thể tạo ra vô hạn đồng mới.
Vì vậy, ta thêm thuật toán gọi là "Bằng chứng công việc" (PoW) để kiểm soát độ khó của việc tạo khối mới. "Bằng chứng" nghĩa là máy tính đã thực hiện một lượng công việc nhất định. Trên thực tế, mục tiêu là tạo ra thứ gì đó khó tạo nhưng dễ kiểm chứng. Tôi sẽ dùng "nhiệm vụ" sau làm PoW: tìm số tiếp theo vừa chia hết cho 99 vừa chia hết cho số proof của khối trước.
### Simple Proof of Work Alogrithm
proof_of_work <-function(last_proof){
proof <- last_proof +1
# Increment the proof number until a number is found that is divisable by 99 and by the proof of the previous block
while(!(proof %%99==0& proof %% last_proof ==0)){
proof <- proof +1}return(proof)}Được hỗ trợ bởi
Với các blockchain như Bitcoin hay Ethereum, công việc tạo khối mới do các "thợ đào" (miners) đảm nhiệm. Khi cần tạo khối mới, một bài toán tính toán sẽ được gửi ra mạng. Thợ đào giải được bài toán PoW trước sẽ tạo khối mới và nhận phần thưởng bằng Bitcoin (đây chính là cách Bitcoin mới được tạo ra). "Xổ số" tìm proof đúng này đảm bảo quyền tạo khối mới là phi tập trung. Khi một khối mới được đào, nó sẽ được gửi đến mọi người để mọi nút trong mạng đều có bản sao blockchain mới nhất. Ý tưởng rằng blockchain dài nhất trong mạng (chuỗi mà "đã bỏ nhiều công sức nhất") là phiên bản hợp lệ của blockchain gọi là "đồng thuận phi tập trung".
Trong Bitcoin, bài toán PoW liên quan đến việc tìm các số tạo ra băm với một số lượng chữ số 0 ở đầu nhất định (giải thích hay nhất tôi tìm thấy là video của Savjee). Để thích ứng với tốc độ tính toán tăng dần và số lượng thợ đào thay đổi trong mạng, độ khó PoW có thể được điều chỉnh để giữ thời gian tạo khối mới ổn định khoảng mười phút.
4. Thêm khối mới
Giờ bạn đã biết khối trông như thế nào, các khối được xâu chuỗi bằng băm ra sao và nhịp độ tạo khối mới được điều tiết bằng PoW như thế nào. Hãy ghép tất cả lại trong một hàm:
#Afunction that takes the previous block and normally some data(in our case the data is a string indicating which block in the chain it is)
gen_new_block <-function(previous_block){
#Proof-of-Work
new_proof <-proof_of_work(previous_block$proof)
#Create newBlock
new_block <-list(index = previous_block$index +1,
timestamp = Sys.time(),
data =paste0("this is block ", previous_block$index +1),
previous_hash = previous_block$new_hash,
proof = new_proof)
#Hash the newBlock
new_block_hashed <-hash_block(new_block)return(new_block_hashed)}Được hỗ trợ bởi
Trước khi xây dựng blockchain, bạn cần bắt đầu chuỗi ở đâu đó. Điều này được thực hiện bằng Khối Khởi nguyên (Genesis Block). Nó không chứa dữ liệu và có các giá trị tùy ý cho proof và previous hash (vì không có khối trước đó).
# Define Genesis Block(index 1 and arbitrary previous hash)
block_genesis <-list(index =1,
timestamp = Sys.time(),
data ="Genesis Block",
previous_hash ="0",
proof =1)Được hỗ trợ bởi
5. Xây dựng Blockchain
Bây giờ bạn có thể bắt đầu xây dựng blockchain. Bạn khởi đầu với khối Genesis rồi thêm vài khối bằng một vòng lặp.
blockchain <-list(block_genesis)
previous_block <- blockchain[[1]]
# How many blocks should we add to the chain after the genesis block
num_of_blocks_to_add <-5
# Add blocks to the chain
for(i in1: num_of_blocks_to_add){
block_to_add <-gen_new_block(previous_block)
blockchain[i+1]<-list(block_to_add)
previous_block <- block_to_add
print(cat(paste0("Block ", block_to_add$index," has been added","\n","\t","Proof: ", block_to_add$proof,"\n","\t","Hash: ", block_to_add$new_hash)))}Được hỗ trợ bởi
## Block 2 has been added
## Proof:99
## Hash: 7d3dfbb58b410838769f6080dbc62a44a4c5d411a41048c4e597d26dccd1cd38NULL
## Block 3 has been added
## Proof:198
## Hash: 4f8bdd79d751f9e9829c14c52a737f257285b61e54b29531dd59bf1a530f1097NULL
## Block 4 has been added
## Proof:396
## Hash: 512b877c4ff92605d9fe10ac73ced20f748742964f306c211c4691f15425a26eNULL
## Block 5 has been added
## Proof:792
## Hash: a3baaa025186c5bcb2238a888bc65e705ffe73c17dc5c8f26ee337fd62867993NULL
## Block 6 has been added
## Proof:1584
## Hash: d12c3f54c14f3287a9f31ab542271197ba6a658cee561a9289819dd563fe4991NULL
Được hỗ trợ bởi
Nếu muốn thêm nhiều khối nữa, bạn sẽ thấy thời gian chạy tăng dần. Lý do là số proof tăng theo cấp số nhân.
Đối với tiền mã hóa như Bitcoin, đây sẽ là vấn đề vì thời gian tạo khối mới nên tương đối ổn định (khoảng 10 phút với Bitcoin). Do đó, độ khó của PoW phải được điều chỉnh liên tục để phản ánh tốc độ tính toán tăng và số lượng thợ đào trong mạng biến động theo thời điểm.
Cuối cùng, một khối trong chuỗi của bạn trông như thế này:
Trong bài viết nhỏ này, bạn đã tạo ra một blockchain tí hon. Mục tiêu chính là giới thiệu blockchain trông như thế nào và một số khái niệm cốt lõi đằng sau nó. Hiểu được cách ứng dụng thiên tài của mật mã học sẽ cho thấy vì sao mọi người lại hào hứng với những khả năng mà blockchain mang lại.
Để đưa một blockchain vào vận hành thực tế cần nhiều việc hơn nữa: thiết lập API, tạo ví, chữ ký số dùng cặp khóa công khai - riêng tư, v.v. Tôi cũng chỉ mới chạm tới bề mặt của khái niệm đồng thuận phi tập trung, vốn là trái tim của mạng lưới blockchain.
Bài giới thiệu nhỏ này tham khảo bài viết của Gerald Nash người đã triển khai "blockchain tí hon" bằng Python. Tôi triển khai bằng R và bổ sung phần PoW từ Daniel van Flymen.
Nếu bạn có ý kiến hay phản hồi về bài viết, hãy liên hệ với tôi trên Twitter: bạn có thể tìm tôi tại @jj_mllr hoặc xem @CorrelAid, một mạng lưới các nhà phân tích dữ liệu trẻ muốn thay đổi thế giới bằng cách tiếp cận phân tích dữ liệu bao trùm, tích hợp và đổi mới hơn.
Giờ đây ai cũng nói về tiền mã hóa - nhờ cơn sốt quanh Bitcoin. Thay vì tranh luận có bong bóng Bitcoin hay không, điều thú vị hơn là công nghệ này thực sự vận hành ra sao và có thể làm được gì. Câu chuyện Bitcoin bắt đầu với bản whitepaper mang tên "Bitcoin: A Peer-to-Peer Electronic Cash System" năm 2008. Trong tài liệu này, tác giả dùng bút danh Satoshi Nakamoto (đến nay vẫn còn nhiều tranh cãi về danh tính thật của Satoshi) giới thiệu một công nghệ và ý tưởng mang tính cách mạng: một đồng tiền điện tử phi tập trung chạy trên thứ gọi là blockchain. Từ đây, ý tưởng đã lan rộng và hiện có thể áp dụng cho nhiều lĩnh vực khác.
Tôi lần đầu được giới thiệu về blockchain tại một buổi họp của BlockchainSociety ở Oxford. Ai nấy đều tỏ ra rất hào hứng với tiềm năng của công nghệ mới này. Quả thực, nghe rất hấp dẫn: Một cơ sở dữ liệu phi tập trung, không thể bị can thiệp, lưu trữ giao dịch tiền tệ, hợp đồng hay bất cứ thứ gì bạn muốn (ví dụ như máy bỏ phiếu không thể bị hack). Lời hứa của blockchain với cộng đồng crypto là sẽ làm thay đổi cả ngành công nghiệp bằng cách cách mạng hóa niềm tin, đến mức chúng ta không còn cần các bên thứ ba như ngân hàng hay luật sư nữa - chỉ cần sức mạnh của mật mã học.
Mặc dù ý tưởng cơ bản khá trực quan, câu hỏi về cách blockchain hoạt động ở mức kỹ thuật lại khó nắm bắt hơn. Tuần trước, tôi bắt gặp một bài trên R-bloggers, nơi BigData Doc xây dựng một blockchain hoàn toàn bằng R. Blockchain viết bằng R có thể không phải là thứ hiệu quả và thực tiễn nhất, nhưng là cách tuyệt vời để hiểu các nguyên lý lập trình và mật mã đằng sau nó. Tôi cũng muốn hiểu rõ, nên đã triển khai một phiên bản nhỏ gọn của blockchain trong R: "Nếu bạn có thể code nó, bạn chắc chắn hiểu nó".
Blockchain là gì?
Giả sử mục tiêu của bạn là lưu trữ một số dữ liệu theo cách an toàn. Để làm vậy, trước tiên bạn lưu dữ liệu vào một vùng chứa - gọi là một khối (block). Trong trường hợp của Bitcoin, mỗi khối chứa một số giao dịch tài chính. Khi có giao dịch mới (hoặc có dữ liệu mới), một khối mới sẽ được tạo và được thêm cùng các khối trước đó để tạo thành một chuỗi - blockchain.
Hãy xem blockchain tận dụng mật mã học như thế nào để gần như không thể bị hack.
1. Các khối
Trước khi bắt đầu xây dựng blockchain - tức là xâu chuỗi các vùng chứa dữ liệu lại với nhau - bạn cần biết thêm hai khái niệm: Băm (hashing) và Thuật toán Bằng chứng công việc (Proof-of-Work).
2. Hàm băm (Hash)
Hàm băm giúp đảm bảo tính toàn vẹn của một khối bằng cách liên kết nó với các khối khác trong chuỗi. Một hàm băm nhận đầu vào bất kỳ và cho ra kết quả đầu ra duy nhất đã được mã hóa. Ví dụ như sau: Bạn đưa cho bạn mình một câu đố "Chương trình thống kê nào tốt hơn: Stata hay R?" và đưa kèm giá trị băm của đáp án đúng: "71ec0b920622cf4358bbc21d6a8b41f903584808db53ec07a8aa79119304ce86". Giờ cô ấy có thể tự kiểm tra xem mình có câu trả lời đúng không chỉ bằng cách đưa câu trả lời vào hàm băm (trong trường hợp này là thuật toán SHA256):
Điều này giúp ích gì cho bạn?
Trong trường hợp này, bạn không chỉ đưa thông tin về khối (index, timestamp, data) vào hàm băm, mà còn cả giá trị băm của khối trước đó. Điều này có nghĩa bạn chỉ có thể tính ra giá trị băm hợp lệ nếu biết giá trị băm của khối trước, mà giá trị đó lại được tạo từ băm của khối trước nữa, cứ thế nối tiếp. Cách này tạo ra một chuỗi khối tuần tự, bất biến. Nếu bạn sửa đổi một khối về sau, bạn sẽ phải tính lại toàn bộ các giá trị băm cho các khối tiếp theo trong chuỗi.
3. Bằng chứng công việc (Proof-of-Work)
Nếu có rất nhiều thông tin cần lưu trên blockchain, bạn sẽ cần tạo rất nhiều khối mới. Trong nhiều trường hợp, bạn muốn kiểm soát số lượng khối mới được tạo ra. Với tiền mã hóa chẳng hạn, đồng tiền sẽ mất giá nếu mỗi giây có thể tạo ra vô hạn đồng mới.
Vì vậy, ta thêm thuật toán gọi là "Bằng chứng công việc" (PoW) để kiểm soát độ khó của việc tạo khối mới. "Bằng chứng" nghĩa là máy tính đã thực hiện một lượng công việc nhất định. Trên thực tế, mục tiêu là tạo ra thứ gì đó khó tạo nhưng dễ kiểm chứng. Tôi sẽ dùng "nhiệm vụ" sau làm PoW: tìm số tiếp theo vừa chia hết cho 99 vừa chia hết cho số proof của khối trước.
Với các blockchain như Bitcoin hay Ethereum, công việc tạo khối mới do các "thợ đào" (miners) đảm nhiệm. Khi cần tạo khối mới, một bài toán tính toán sẽ được gửi ra mạng. Thợ đào giải được bài toán PoW trước sẽ tạo khối mới và nhận phần thưởng bằng Bitcoin (đây chính là cách Bitcoin mới được tạo ra). "Xổ số" tìm proof đúng này đảm bảo quyền tạo khối mới là phi tập trung. Khi một khối mới được đào, nó sẽ được gửi đến mọi người để mọi nút trong mạng đều có bản sao blockchain mới nhất. Ý tưởng rằng blockchain dài nhất trong mạng (chuỗi mà "đã bỏ nhiều công sức nhất") là phiên bản hợp lệ của blockchain gọi là "đồng thuận phi tập trung".
Trong Bitcoin, bài toán PoW liên quan đến việc tìm các số tạo ra băm với một số lượng chữ số 0 ở đầu nhất định (giải thích hay nhất tôi tìm thấy là video của Savjee). Để thích ứng với tốc độ tính toán tăng dần và số lượng thợ đào thay đổi trong mạng, độ khó PoW có thể được điều chỉnh để giữ thời gian tạo khối mới ổn định khoảng mười phút.
4. Thêm khối mới
Giờ bạn đã biết khối trông như thế nào, các khối được xâu chuỗi bằng băm ra sao và nhịp độ tạo khối mới được điều tiết bằng PoW như thế nào. Hãy ghép tất cả lại trong một hàm:
Trước khi xây dựng blockchain, bạn cần bắt đầu chuỗi ở đâu đó. Điều này được thực hiện bằng Khối Khởi nguyên (Genesis Block). Nó không chứa dữ liệu và có các giá trị tùy ý cho proof và previous hash (vì không có khối trước đó).
5. Xây dựng Blockchain
Bây giờ bạn có thể bắt đầu xây dựng blockchain. Bạn khởi đầu với khối Genesis rồi thêm vài khối bằng một vòng lặp.
Nếu muốn thêm nhiều khối nữa, bạn sẽ thấy thời gian chạy tăng dần. Lý do là số proof tăng theo cấp số nhân.
Đối với tiền mã hóa như Bitcoin, đây sẽ là vấn đề vì thời gian tạo khối mới nên tương đối ổn định (khoảng 10 phút với Bitcoin). Do đó, độ khó của PoW phải được điều chỉnh liên tục để phản ánh tốc độ tính toán tăng và số lượng thợ đào trong mạng biến động theo thời điểm.
Cuối cùng, một khối trong chuỗi của bạn trông như thế này:
Tổng kết
Trong bài viết nhỏ này, bạn đã tạo ra một blockchain tí hon. Mục tiêu chính là giới thiệu blockchain trông như thế nào và một số khái niệm cốt lõi đằng sau nó. Hiểu được cách ứng dụng thiên tài của mật mã học sẽ cho thấy vì sao mọi người lại hào hứng với những khả năng mà blockchain mang lại.
Để đưa một blockchain vào vận hành thực tế cần nhiều việc hơn nữa: thiết lập API, tạo ví, chữ ký số dùng cặp khóa công khai - riêng tư, v.v. Tôi cũng chỉ mới chạm tới bề mặt của khái niệm đồng thuận phi tập trung, vốn là trái tim của mạng lưới blockchain.
Bài giới thiệu nhỏ này tham khảo bài viết của Gerald Nash người đã triển khai "blockchain tí hon" bằng Python. Tôi triển khai bằng R và bổ sung phần PoW từ Daniel van Flymen.
Để đào sâu hơn về blockchain, tôi khuyến nghị bản whitepaper gốc xuất sắc về Bitcoin của Satoshi Nakamoto và bài viết từ BigData Doc.
Nếu bạn có ý kiến hay phản hồi về bài viết, hãy liên hệ với tôi trên Twitter: bạn có thể tìm tôi tại @jj_mllr hoặc xem @CorrelAid, một mạng lưới các nhà phân tích dữ liệu trẻ muốn thay đổi thế giới bằng cách tiếp cận phân tích dữ liệu bao trùm, tích hợp và đổi mới hơn.