Lập trình blockchain phần 2: Ngôn ngữ lập trình Javascript
Lập trình blockchain phần 1: Ngôn ngữ lập trình C++ Ở phần đầu tiên bạn đã tìm hiểu về những vấn đề mà các nhà phát triển blockchain sẽ gặp phải khi tiến hành lập trình blockchain, cũng như biết được lý do vì sao C++ được lựa chọn là ngôn ngữ cơ sở của mã ...
- Lập trình blockchain phần 1: Ngôn ngữ lập trình C++
Ở phần đầu tiên bạn đã tìm hiểu về những vấn đề mà các nhà phát triển blockchain sẽ gặp phải khi tiến hành lập trình blockchain, cũng như biết được lý do vì sao C++ được lựa chọn là ngôn ngữ cơ sở của mã nguồn Bitcoin.
Trong phần này, bạn sẽ được tìm hiểu về JavaScript, cách tạo một blockchain đơn giản bằng JavaScript.
Ngôn ngữ lập trình Javascript
Tiếp theo chúng ta sẽ chuyển sang Javascript.
Cùng với HTML và CSS, nó là một trong ba công nghệ cốt lõi trong World Wide Web Content Production. Javascript thường được sử dụng để tạo các trang web có độ tương tác cao. Vì vậy, bây giờ, bài viết này sẽ giúp bạn đọc tìm hiểu xem làm thế nào để tạo ra một blockchain rất đơn giản bằng cách sử dụng Javascript.
Giả sử, chúng ta muốn tạo một blockchain đơn giản trong Javascript. Trước khi thực hiện điều này, có một số điều mà chúng ta cần phải làm rõ.
Blockchain là gì và chính xác nó hoạt động như thế nào?
Blockchain về cơ bản là một chuỗi các khối chứa dữ liệu. Nó cơ bản là một danh sách liên kết. Vậy điều gì làm cho nó trở nên đặc biệt? Một blockchain là bất biến. Khi một dữ liệu đi vào trong một khối, nó không bao giờ có thể thay đổi được nữa. Làm thế nào để một blockchain đạt được tính bất biến? Đó là do một cơ chế đơn giản nhưng khéo léo được gọi là "hashing". Hãy xem sơ đồ bên dưới:
Mỗi khối được kết nối với khối trước đó thông qua một con trỏ hash có chứa hash của khối trước đó. Một trong những thuộc tính hấp dẫn nhất của hàm cryptographic hash là nếu bạn thay đổi input dù chỉ một chút thì cũng có thể ảnh hưởng lớn đến kết quả hash đầu ra. Ví dụ, bạn có thể thử kiểm tra điều này:
Chỉ cần chuyển "T" viết hoa thành viết thường sẽ thay đổi đáng kể hash kết quả.
Vậy, điều này ảnh hưởng đến blockchain như thế nào?
Mỗi khối được kết nối với khối trước thông qua con trỏ hash. Vì vậy, nếu ai đó đã giả mạo dữ liệu trong một khối, nó sẽ thay đổi hash rất nhiều và kết quả cuối cùng là ảnh hưởng đến toàn bộ chuỗi (vì tất cả các khối được liên kết). Điều này sẽ đóng băng chuỗi đó và từ đây các khối không thể thay đổi.
Vậy chúng ta tạo ra một khối như thế nào? Một khối đơn giản bao gồm những gì? Trong cryptocoin (tiền kỹ thuật số) đơn giản mà chúng ta sẽ tạo (tạm gọi là "BlockGeeksCoin"), mỗi khối sẽ có các thông tin sau:
- Index: Để biết số khối.
- Timestamp: Để biết thời gian tạo.
- Data: Dữ liệu bên trong khối.
- Previous Hash: Hash của khối trước đó.
- Hash: Hash của khối hiện tại.
Trước khi tiếp tục, bạn cần phải hiểu một số thuật ngữ nhất định sau đây:
- This: Từ khóa "this" được gọi bên trong một hàm và cho phép bạn truy cập các giá trị bên trong một đối tượng cụ thể gọi hàm đó.
- Constructor: Constructor là một hàm đặc biệt có thể giúp tạo và khởi tạo một đối tượng trong một lớp. Mỗi lớp được giới hạn chỉ có một Constructor duy nhất.
Bây giờ mọi thứ đã xong, hãy bắt đầu tạo khối.
Tạo khối
const SHA256 = require("crypto-js/sha256");
class Block
{
constructor(index, timestamp, data, previousHash = ')
{
this.index = index;
this.previousHash = previousHash;
this.timestamp = timestamp;
this.data = data;
this.hash = this.calculateHash();
}
calculateHash()
{
return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString();
}
}
Phân tích code
Dòng đầu tiên của đoạn code trên dùng để gọi thư viện crypto-js vì hàm hash sha256 không có sẵn trong JavaScript.
Tiếp theo, gọi một hàm tạo bên trong lớp để gọi các đối tượng có các giá trị nhất định. Thứ bạn nhìn thấy đầu tiên là hàm calculateHash(). Hãy xem chính xác nó đang thực hiện chức năng gì.
Trong một khối, chúng ta sẽ lấy tất cả các nội dung và hash của chúng để có được hash của khối cụ thể đó. Sử dụng hàm JSON.stringify để biến dữ liệu của khối thành chuỗi.
Vậy là chúng ta đã tạo khối thành công. Bây giờ hãy kết nối các khối lại với nhau thành một blockchain.
Tạo blockchain
class Blockchain
{
//Section 1 Genesis block creation
constructor()
{
this.chain = [this.createGenesisBlock()];
}
createGenesisBlock()
{
return new Block(0, "01/01/2017", "Genesis block", "0");
}
//section 2 adding new blocks
getLatestBlock()
{
return this.chain[this.chain.length - 1];
}
addBlock(newBlock) {
newBlock.previousHash = this.getLatestBlock().hash;
newBlock.hash = newBlock.calculateHash();
this.chain.push(newBlock);
}
//section 3 validating the chain
isChainValid()
{
for (let i = 1; i < this.chain.length; i++)
{
const currentBlock = this.chain[i];
const previousBlock = this.chain[i - 1];
if (currentBlock.hash !== currentBlock.calculateHash()) {
return false;
}
if (currentBlock.previousHash !== previousBlock.hash)
{
return false;
}
}
return true;
}
}
Phân tích code
Có rất nhiều thứ để phân tích trong đoạn code bên trên. Hãy chia nhỏ nó thành các phần.
Phần 1: Khối Genesis
Khối genesis là gì?
Khối genesis là khối đầu tiên của blockchain, và lý do tại sao nó đặc biệt là bởi vì trong khi mỗi khối trỏ đến khối trước đó, khối genesis không trỏ đến bất cứ thứ gì trước đó cả. Vì vậy, thời điểm một chuỗi mới được tạo ra, khối genesis được gọi ngay lập tức. Ngoài ra, bạn có thể thấy hàm “createGenesisBlock()”, trong đó dữ liệu của khối đã được cung cấp theo cách thủ công:
createGenesisBlock()
{
return new Block(0, “01/01/2017”, “Genesis block”, “0”);
}
Bây giờ, khối genesis đã được xây dựng xong. Hãy xây dựng nốt phần còn lại của chuỗi.
Phần 2: Thêm các khối
Thứ nhất, chúng ta cần biết khối cuối cùng trong blockchain hiện tại là gì bằng cách sử dụng hàm getLatestBlock().
getLatestBlock()
{
return this.chain[this.chain.length - 1];
}
Bây giờ đã xác định khối mới nhất. Hãy tìm hiểu xem cách thêm các khối mới như thế nào nhé!
addBlock(newBlock) {
newBlock.previousHash = this.getLatestBlock().hash;
newBlock.hash = newBlock.calculateHash();
this.chain.push(newBlock);
}
Vậy làm cách nào để thêm các khối? Làm cách nào để kiểm tra xem khối đã cho có hợp lệ hay không?
Bạn vẫn nhớ nội dung của một khối và một khối có hash của khối trước đó phải không?
Những gì chúng ta sẽ làm ở đây rất đơn giản. So sánh giá trị previousHash của khối mới với giá trị hash của khối gần nhất.
Nếu hai giá trị này khớp nhau, thì điều này có nghĩa khối mới hợp lệ và nó đã được thêm vào blockchain.
Phần 3: Xác thực chuỗi
Bây giờ, chúng ta cần phải kiểm tra xem có vấn đề gì với blockchain đã tạo không và đảm bảo mọi thứ đều ổn định.
Ta cần sử dụng vòng lặp "for" để lặp từ khối 1 đến khối cuối cùng. Khối Genesis là khối 0.
for (let i = 1; i < this.chain.length; i++)
{
const currentBlock = this.chain[i];
const previousBlock = this.chain[i - 1];
Trong phần này của code, ta định nghĩa hai thuật ngữ, khối hiện tại và khối trước đó. Và bây giờ chúng ta chỉ cần tìm hash của hai giá trị này.
if (currentBlock.hash !== currentBlock.calculateHash()) {
return false;
}
if (currentBlock.previousHash !== previousBlock.hash)
{
return false;
}
}
return true;
}
Nếu "previousHash" của khối hiện tại không bằng "Hash" của khối trước đó, thì hàm này sẽ trả về False, ngược lại, nó sẽ trả về True.
Sử dụng blockchain
Bây giờ, hãy sử dụng blockchain để tạo ra BlockGeeksCoin.
- Đặt BlockGeeksCoin = new Blockchain();
- BlockGeeksCoin.addBlock(new Block(1, “20/07/2017”, { amount: 4 }));
- BlockGeeksCoin.addBlock(new Block(2, “20/07/2017”, { amount: 8 }));
Chúng ta đã tạo ra một cryptocurrency mới dựa trên blockchain và đặt tên nó là BlockGeeksCoin. Bằng cách gọi đối tượng mới này, constructor sẽ được kích hoạt và lần lượt tạo ra khối Genesis tự động.
Chỉ cần thêm hai khối nữa vào blockchain và cung cấp cho nó một số dữ liệu. Việc này khá là đơn giản.
Còn nữa...