Trong hướng dẫn này, chúng ta sẽ xem Cách tạo chuỗi khối trong JavaScript. Blockchain lưu giữ hồ sơ của tất cả các trao đổi dữ liệu – hồ sơ này được gọi là “ sổ cái ” trong thế giới tiền điện tử và mỗi trao đổi dữ liệu là “ giao dịch ”. Mọi giao dịch đã xác minh sẽ được thêm vào sổ cái dưới dạng một “ khối ”. Nó sử dụng hệ thống phân tán để xác minh từng giao dịch – mạng ngang hàng của các nút. Sau khi đã ký và xác minh, một giao dịch mới sẽ được thêm vào blockchain và không thể thay đổi được.
Blockchain là một cấu trúc dữ liệu đại diện cho mục nhập sổ cái tài chính hoặc bản ghi của một giao dịch. Mỗi giao dịch đều được ký điện tử để đảm bảo tính xác thực của nó và không ai giả mạo được, vì vậy bản thân sổ cái và các giao dịch hiện có bên trong nó được coi là có tính toàn vẹn cao.
Trong hướng dẫn này, chúng tôi sẽ tạo chuỗi khối đơn giản bằng javascript, trong đó chúng tôi sử dụng Javascript làm ngôn ngữ và Node.js làm phần phụ trợ để chạy dự án nhỏ.
Cách tạo chuỗi khối trong JavaScript
Bây giờ nếu chúng ta cần tạo một Blockchain đơn giản trong Node.js, thì chúng ta cần có một Khối khởi đầu
Bạn có thể gọi Genesis Block là khối đầu tiên của Blockchain vì Blockchain là một mảng các khối và Genesis là khối đầu tiên của Blockchain .
Khối Genesis
Khối genesis là khối đầu tiên của blockchain. Khối genesis thường được mã hóa cứng trong các ứng dụng sử dụng blockchain của nó. Genesis Block còn được gọi là Block Zero hoặc Block 0. Nó là tổ tiên mà mọi khối của mạng Blockchain có thể được truy tìm về nguồn gốc của nó. Hãy nhớ cách mọi khối trong Blockchain được liên kết trở lại khối trước đó bằng cách sử dụng hàm băm trong tiêu đề khối? Bạn tiếp tục quay lại, và bạn nhận ra rằng mọi khối do đó được kết nối với khối gốc.
Khối Genesis của chúng tôi chứa các trường hoặc thuộc tính sau.
- dấu thời gian
- lastHash
- băm
- dữ liệu
Vì vậy, nếu chúng ta kết hợp tất cả các thuộc tính này vào một đối tượng, thì nó sẽ trở thành một Khối khởi đầu. Vì vậy, dựa trên khối này, chúng tôi sẽ khai thác khối thứ hai. Sau đó, từ khối thứ hai, chúng ta sẽ trích xuất khối thứ ba, v.v. Đó là lý do tại sao chúng ta cần Genesis Block để bắt đầu một Blockchain.
Bây giờ, chúng ta hãy bắt đầu một dự án bằng cách tạo một thư mục dự án và sau đó bắt đầu xây dựng chuỗi khối tuyệt vời bằng cách sử dụng Javascript.
Bước 1: Tạo dự án và tạo Dữ liệu Genesis Bước đầu tiên là tạo một dự án. Nhập lệnh sau :
mkdir cryptochain
Vào bên trong thư mục đó.
cd cryptochain
Bây giờ, tạo tệp package.json trong trường hợp trong tương lai, chúng ta cần cài đặt bất kỳ mô-đun nút nào.
npm init -y
Hãy nhớ rằng, tôi đang sử dụng Node v11.3.0.
Bước tiếp theo là tạo một tệp mới bên trong thư mục gốc có tên là genesis.js và thêm đoạn mã sau.
// genesis.js
const GENESIS_DATA = {
timestamp: Date.now(),
lastHash: '64b7edc786326651e031a4d12d9838d279571946d8c9a5d448c70db94b0e143f',
hash: 'c671c84681b9d682b9fd43b2a2ef01a343eab7cfa410df9835f8165007d38467',
data: 'krunal'
};
module.exports = { GENESIS_DATA };
Ở đây, chúng tôi đã lấy một đối tượng với các giá trị ban đầu của nó.
Như tôi đã xác định trước đó, khối của chúng ta chứa bốn thuộc tính. Đây là dữ liệu nguồn gốc, vì vậy chúng ta cần mã hóa các giá trị này.
Bạn có thể hiểu được dấu thời gian và dữ liệu thuộc tính . Nhưng tôi đã sử dụng thuật toán SHA256 để chuyển văn bản đơn giản thành văn bản băm.
Văn bản thực tế cho lastHash là một krunal và văn bản thực tế cho hàm băm là một krunalHash.
Bạn có thể xác minh nó bằng cách truy cập URL này: https://passwordsgenerator.net/sha256-hash-generator/
Tại đây, bạn có thể nhập tên của tôi dưới dạng văn bản và nó sẽ cung cấp hàm băm SHA256 của văn bản đó. Bây giờ, bạn cần chuyển văn bản đó thành chữ thường bằng cách sử dụng toLowercase () của Javascript. Đó là nó. Bạn sẽ tìm thấy băm chính xác giống như tôi. Mát mẻ!! Vì vậy, bây giờ, bạn có Dữ liệu Genesis đã sẵn sàng. Việc tiếp theo là tạo Block từ dữ liệu này.
Bước 2: Tạo khối Bên trong gốc dự án của bạn, hãy tạo một tệp có tên block.js và thêm mã sau :
// block.js
const { GENESIS_DATA } = require('./genesis.js');
class Block {
constructor({timestamp, lastHash, hash, data}) {
this.timestamp = timestamp;
this.lastHash = lastHash;
this.hash = hash;
this.data = data;
}
static genesis() {
return new this(GENESIS_DATA);
}
}
module.exports = Block;
Vì vậy, ở đây chúng tôi đã nhập GENESIS_DATA cho khối của chúng tôi.
Sau đó, chúng ta đã xác định lớp Block và truyền các tham số cho phương thức khởi tạo khi chúng ta tạo một đối tượng của Block.
Chúng tôi cũng đã xác định phương thức tĩnh được gọi là genesis () chịu trách nhiệm trả về Genesis Block cho blockchain của chúng tôi.
Hãy nhớ rằng trước đây chúng tôi đã xác định khối không GENESIS_DATA. Sau khi tạo một đối tượng của lớp này, nó sẽ trở thành một Khối Genesis.
Bước 3: Tạo một băm dựa trên một khối trước đó.
Chúng ta cần xác định một hàm có thể tạo một băm dựa trên băm của khối trước đó. Vì vậy, trước tiên, chúng ta hãy tạo một tệp mới bên trong tệp gốc có tên là crypto-hash.js và thêm đoạn mã sau vào bên trong nó.
// crypto-hash.js
const crypto = require('crypto');
const cryptoHash =(...inputs) => {
const hash = crypto.createHash('sha256');
hash.update(inputs.sort().join(' '));
return hash.digest('hex');
}
module.exports = cryptoHash;
Bây giờ, để tạo Hash, chúng ta cần ba thuộc tính.
- dấu thời gian
- lastHash
- dữ liệu
Vì vậy, trước tiên chúng tôi yêu cầu mô-đun tiền điện tử được cung cấp bởi Node.js.
Sau đó, chúng tôi đã xác định hàm được gọi là cryptoHash () sẽ chấp nhận các đầu vào. Ở đây chúng tôi đã sử dụng toán tử spread là cú pháp của ES6.
Bên trong hàm đó, chúng ta đã gọi phương thức createHash () và chuyển sha256 làm tham số. Điều đó có nghĩa là chúng ta cần tạo một hàm băm dựa trên thuật toán sha256 .
Sau đó, chúng tôi đã sắp xếp và nối ba tham số đó và trả về các giá trị hex của nó.
Vì vậy, cuối cùng, chúng ta có thể lấy băm của khối hiện tại dựa trên ba thuộc tính của khối trước đó.
Bước 4: Khai thác một Khối mới dựa trên một Khối trước đó
Vì vậy, chúng tôi đã có Genesis Block và băm của khối đó. Bây giờ, chúng ta cần viết hàm có thể tạo một Khối mới dựa trên khối trước đó. Ngay bây giờ, trong trường hợp của chúng ta, nó là một Khối Khởi Nguyên.
Bây giờ, nhập mô-đun mã hóa-băm bên trong tệp block.js và tạo một hàm mới có tên mineBlock () và chuyển hai tham số.
- lastBlock
- dữ liệu
Vì vậy, tệp block.js cuối cùng của chúng tôi trông như thế này.
// block.js
const { GENESIS_DATA } = require('./genesis.js');
const cryptoHash = require('./crypto-hash');
class Block {
constructor({timestamp, lastHash, hash, data}) {
this.timestamp = timestamp;
this.lastHash = lastHash;
this.hash = hash;
this.data = data;
}
static genesis() {
return new this(GENESIS_DATA);
}
static mineBlock({lastBlock, data}) {
const timestamp = Date.now();
const lastHash = lastBlock.hash;
return new this({
timestamp,
lastHash,
data,
hash: cryptoHash(timestamp, lastHash, data)
});
}
}
module.exports = Block;
Vì vậy, ở đây chúng ta đã định nghĩa phương thức gọi là mineBlock và truyền hai tham số. MineBlock () sẽ trả về một Khối mới hoàn chỉnh dựa trên khối trước đó.
Bây giờ, đã đến lúc tạo ra một Blockchain từ các khối này.
Bước 5: Tạo chuỗi khối Chúng ta đã hoàn thành bước tạo Khối Genesis và khai thác một Khối mới. Bây giờ là lúc để phát triển một blockchain. Đó là lý do tại sao tạo một tệp mới bên trong tệp gốc có tên là blockchain.js và thêm mã sau vào bên trong nó.
// blockchain.js
const Block = require('./block');
class Blockchain {
constructor() {
this.chain = [Block.genesis()];
}
addBlock({ data }) {
const newBlock = Block.mineBlock({
lastBlock: this.chain[this.chain.length-1],
data
});
this.chain.push(newBlock);
}
}
module.exports = Blockchain;
Vì vậy, trước tiên, chúng tôi đã nhập tệp Block.js và sau đó tạo một lớp có tên là Blockchain.
Lớp Blockchain chịu trách nhiệm thêm một khối mới bên trong blockchain.
Blockchain là một mảng của các khối bắt đầu bằng khối Genesis.
Vì vậy, trong hàm tạo, chúng ta chưa xác định một mảng trống. Thay vào đó, chúng tôi đã lấp đầy mảng chuỗi bằng khối Genesis.
Sau đó, chúng tôi đã xác định một hàm được gọi là addBlock () chấp nhận dữ liệu.
Bây giờ, trước khi thêm một khối mới vào mảng chuỗi, chúng ta cần khai thác nó. Đó là lý do tại sao chúng ta đã gọi phương thức mineBlock () của lớp Block để trích xuất một khối mới.
Để khai thác một khối mới, chúng ta cần một khối trước đó và dữ liệu. Đó là lý do tại sao chúng tôi đã sử dụng mã this.chain [this.chain.length-1] vì nó sẽ trả về khối cuối cùng trong chuỗi khối và dữ liệu đã được chúng tôi chuyển đến hàm đó. Vì vậy, chúng tôi nhận được khối mới dựa trên khối và dữ liệu trước đó.
Bước tiếp theo là thêm khối mới được khai thác đó vào bên trong chuỗi khối của chúng tôi, và thế là xong.
Bước cuối cùng là chạy dự án này và lấy blockchain.
Bước 6: Chạy dự án và nhận blockchain.
Bây giờ, bước cuối cùng là tạo một tệp bên trong thư mục gốc của dự án có tên là server.js và thêm đoạn mã sau.
// server.js
const Blockchain = require('./blockchain');
const Block = require('./block');
const blockchain = new Blockchain();
for(let i=0; i<5; i++) {
const newData = 'krunal'+i;
blockchain.addBlock({data: newData});
}
console.log(blockchain);
Vì vậy, ở đây chúng tôi đã nhập cả tệp block.js và blockchain.js và tạo một đối tượng của Blockchain.
Sau đó, chúng tôi sẽ lặp qua chuỗi khối đó và thêm dữ liệu vào chuỗi khối đó và tạo ra sáu khối trong chuỗi khối vì một khối là Genesis và năm khối dựa trên các khối trước đó.
Đi tới thiết bị đầu cuối và khởi động máy chủ nút.
node server Bạn sẽ thấy một đầu ra như thế này.