Blockchain là gì?
Blockchain là một cơ sở tài liệu gồm có những khối ( block ) được nối lại với nhau thành mội chuỗi ( chain ). Và những block là immutable ( không bao giờ thay đổi ). Khi một block đã được thêm vào chain, nó không hề đổi khác được nữa, và những block được nối với nhau sử dụng hash ( block sau sẽ lưu hash của block trước ) .
Đó là nguyên do tại sao những cryptocurrency được dựa trên blockchain, bạn sẽ không muốn người khác biến hóa transaction sau khi đã thực thi chúng .
Xây dựng một Block
Một Blockchain bao gồm nhiều block được liên kết với nhau. Giả sử có ai đó muốn thay đổi dữ liệu của block trước đó, làm sao chúng ta có thể đảm bảo tình toàn vẹn? Đó là dựa vào một hàm băm được tính toán dựa trên nội dung của chính block đó, và nó cũng sẽ chứa hàm băm của block trước đó. Đây là những gì một class Block được viết bằng JavaScript:
Bạn đang đọc: Xây dựng một Blockchain đơn giản bằng Javascript
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();
}
}
Một block sẽ chứa thời hạn khởi tạo block đó, Hash của block trước nó, tài liệu của nó ( tài liệu hoàn toàn có thể là bất kể thứ gì, trong cryptocurrency thì tài liệu ở đây chính là những transaction ), và tất yếu nó sẽ tàng trữ Hash của chính nó, được thống kê giám sát dựa trên một thuật toán mã hóa SHA 256 bit .
Chúng ta buộc phải require thư viện crypto-js chính bới hàm băm sha256 không có sẳn trong JavaScript .
Xây dựng Blockchain
Bây giờ tất cả chúng ta sẽ khởi đầu nối những block với nhau thành một chuỗi để tạo thành Blockchain. Chúng ta có class Blockchain được viết bằng JavaScript như sau :
class Blockchain{
constructor() {
this.chain = [this.createFirstBlock()];
}
createFirstBlock() {
return new Block(0, "01/01/2018", "first block", "0");
}
getLatestBlock() {
return this.chain[this.chain.length - 1];
}
addBlock(newBlock) {
newBlock.previousHash = this.getLatestBlock().hash;
newBlock.hash = newBlock.calculateHash();
this.chain.push(newBlock);
}
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;
}
}
Trong constructor, chúng ta khởi tạo chuỗi bằng cách tạo một mãng chứa block đầu tiên. Block đầu tiên là đặc biệt bởi vì nó không thể trỏ đến một block trước đó. Chúng ta cũng đã thêm các function sau:
Xem thêm: Giá Bitcoin giảm xuống mức thấp nhất trong 2 tháng, trader nên mong đợi điều gì tiếp theo?
getLatestBlock()
trả về block cuối cùng trong chuỗi blockchain.addBlock()
là hàm thêm một block mới vào chuỗi của chúng ta. Để làm điều đó, chúng ta thêm Hash của block trước vào block mới. Nó sẽ giúp bảo toàn tính toàn vẹn của chuỗi. Tất nhiên chúng ta sẽ phải tính toán Hash của block mới này và lưu lại. Sau khi block hoàn thiện, chúng ta cần phải thêm nó vào chuỗi.isChainValid()
đây là một hàm rất quan trọng, nó có nhiệm vụ đảm bảo rằng không ai có thể gây rối với blockchain của chúng ta. Nó lặp qua tất cả các block và kiếm tra xem Hash của mỗi block có chính xác hay không. Nó cũng kiểm tra xem mỗi block có trỏ tới chính xác block trước đó hay không bằng cách so sánh giá trị Hash của block trước và previousHash của block đó là bằng nhau hay không. Nếu một cái gì đó sai, tức data đã bị ai đó chỉnh sửa, nó sẽ lập tức return về false.
Sử dụng blockchain
Như vậy là tất cả chúng ta đã thực sự tạo ra một blockchain đơn thuần bằng JavaScript, giờ đây tất cả chúng ta sẽ thử test nó .
let myChain = new Blockchain();
myChain.addBlock(new Block(1, "20/07/2018", "block 2"));
myChain.addBlock(new Block(2, "20/07/2018", "block 3"));
console.log(JSON.stringify(myChain, null, 4));
Ở đây tất cả chúng ta đã tạo một instance của Blockchain tên là myChain. Sau đó tất cả chúng ta thêm một vài block vào chuỗi. Các block đó hoàn toàn có thể chứa bất kể giữ liệu nào mà bạn muốn, trong trường hợp này, data của tất cả chúng ta chỉ là một string đơn thuần. Và đây là hiệu quả :
{
"chain": [
{
"index": 0,
"previousHash": "0",
"timestamp": "01/01/2017",
"data": "first block",
"hash": "324b2bc54537c26b83e2e6175bf6551204ad629393a5001aef0b8a64c6d53398"
},
{
"index": 1,
"previousHash": "324b2bc54537c26b83e2e6175bf6551204ad629393a5001aef0b8a64c6d53398",
"timestamp": "20/07/2017",
"data": "block 2",
"hash": "f925a5538ac5fdb9eab1790829dc5c5cd36fcfdfcdf28cdbf2ab0d5ab4987d3b"
},
{
"index": 2,
"previousHash": "f925a5538ac5fdb9eab1790829dc5c5cd36fcfdfcdf28cdbf2ab0d5ab4987d3b",
"timestamp": "20/07/2017",
"data": "block 3",
"hash": "15ea184281490e1af0a8a8e4fd12528c158b7a679f463adeb25d084ccbeccf38"
}
]
}
Bây giờ tất cả chúng ta sẽ thử đổi khác data của một block, vì như đã nói lúc đầu, blockchain là immutable, block không hề biến hóa sau khi chúng được thêm vào. Hãy kiểm tra điều đó .
// Kiểm tra khi chain là valid
console.log('Blockchain valid? ' + myChain.isChainValid());
// Thay đổi data của một block
console.log('Changing a block...');
myChain.chain[1].data = "I am hacker";
// Kiểm tra chain một lần nữa
console.log("Blockchain valid? " + myChain.isChainValid());
Và đây là kết quả:
Blockchain valid? true
Changing a block...
Blockchain valid? false
Như vậy, Blockchain của tất cả chúng ta sau khi cố gắng nỗ lực biến hóa một block đã không còn hợp lệ nữa .
Kết luận
Thực tế thì việc triễn khai một blockchain ở trên là chưa hoàn thành xong. Nó không triển khai proof-of-work hoặc một mạng P2P để tiếp xúc với những miner khác. Tuy nhiên nó khái quát 1 cách đơn thuần làm thế nào để một blockchain hoạt động giải trí. Nhiều người nghĩ rằng nó rất phức tạp, nhưng bài viết này chứng tỏ rằng những khái niệm cơ bản của một blockchain dễ hiểu và dễ triển khai. Trong bài viết tiếp theo tất cả chúng ta sẽ tìm hiểu và khám phá về proof-of-work và cách triển khai chúng như thế nào. Bài viết được tìm hiểu thêm ở link này .
Theo : Viblo
Source: https://trade.edu.vn
Category: Blockchain