Xây dựng ứng dụng Blockchain bằng JavaScript

Xây dựng ứng dụng Blockchain bằng JavaScript

Giới thiệu

Được rồi, người bạn đồng hành mã hóa thân yêu của tôi! Hãy để tôi dẫn bạn qua cuộc phiêu lưu blockchain này bằng kinh nghiệm lập trình nhiều năm của tôi và một chút hài hước.

Những tiến bộ mang tính đột phá hiện đại, chẳng hạn như các loại tiền kỹ thuật số như Bitcoin và các ứng dụng phi tập trung (DApp) khác nhau trên nhiều ngành, đều bị ảnh hưởng đáng kể bởi công nghệ blockchain. Về cơ bản, blockchain đại diện cho một cơ sở dữ liệu chung ghi lại các giao dịch trên nhiều thiết bị, đảm bảo dữ liệu không thể bị sửa đổi sau khi được ghi lại. Mỗi giao dịch hoặc “khối” được liên kết với giao dịch trước nó, tạo thành một chuỗi không bị gián đoạn, do đó có thuật ngữ “blockchain”. Cấu trúc này đảm bảo tính minh bạch, bảo mật và tính bất biến của dữ liệu – những phẩm chất rất quan trọng đối với nhiều ứng dụng.

JavaScript trong chuỗi khối

JavaScript nổi bật là ngôn ngữ lập trình linh hoạt và nổi tiếng, đặc biệt có lợi cho việc tạo ra các giải pháp blockchain. Hệ sinh thái rộng lớn và sự hỗ trợ cộng đồng mạnh mẽ của nó giúp phát triển các ứng dụng blockchain dễ dàng hơn bằng cách cung cấp một số lợi thế:

  • Áp dụng rộng rãi: Vì Javascript là ngôn ngữ cốt lõi được sử dụng để phát triển web nên việc có ứng dụng trong bối cảnh blockchain với các ứng dụng web là điều hiển nhiên.
  • Xử lý không đồng bộ: Khả năng không đồng bộ của JavaScript, được hỗ trợ bởi Node.js, rất lý tưởng để xử lý nhiều giao dịch và tương tác trong môi trường chuỗi khối.
  • Hệ sinh thái phong phú: Các công cụ và thư viện trong hệ sinh thái JavaScript, chẳng hạn như Node.js để phát triển phía máy chủ và Express.js cho API, hợp lý hóa việc phát triển ứng dụng blockchain.

Khán giả

Là một nhà phát triển JavaScript dày dạn kinh nghiệm với nhiều năm kinh nghiệm, tôi hoàn toàn có thể giới thiệu bài viết này cho bất kỳ ai muốn mở rộng kỹ năng của mình và đi sâu vào thế giới hấp dẫn của công nghệ blockchain. Hướng dẫn này sẽ hướng dẫn bạn qua quá trình thiết lập môi trường phát triển, chia nhỏ các khái niệm phức tạp thành các nguyên tắc cơ bản dễ hiểu, giúp bạn xây dựng một ứng dụng blockchain cơ bản và cuối cùng là hiển thị nó thông qua API thân thiện với người dùng. Cho dù bạn háo hức tìm hiểu hay muốn bổ sung thêm một chuỗi khác cho nhà phát triển của mình thì bài viết này là nguồn tài nguyên vô giá cho hành trình của bạn.

Chương 1: Thiết lập môi trường phát triển

Cài đặt Node.js

  • Tải xuống nút js trên hệ thống của bạn từ trang web chính thức và ưu tiên phiên bản LTS (Hỗ trợ dài hạn) vì đây là phiên bản tốt nhất cho tất cả các hệ điều hành và duy trì sự ổn định.
  •  Thực hiện theo các hướng dẫn cài đặt cụ thể cho hệ điều hành của bạn. Quá trình cài đặt bao gồm npm (Trình quản lý gói nút), rất cần thiết để quản lý các phần phụ thuộc của dự án.
  • Xác minh quá trình cài đặt được thực hiện đúng hay không bằng cách chạy các lệnh sau trong bash:
    1. nút -v
    2. npm -v

Sau khi thực thi các lệnh đã cho, bạn sẽ tìm thấy phiên bản tương ứng của các gói đã cài đặt trên hệ thống của mình, giả sử quá trình cài đặt thành công.

Chọn IDE

Chọn JavaScript làm ngôn ngữ lập trình, Visual Studio Code (VSCode) sẽ là người bạn đồng hành tuyệt vời để xử lý tất cả các yêu cầu phát triển của bạn. Khả năng mạnh mẽ và môi trường thích ứng của nó khiến nó trở nên hoàn toàn phù hợp để phát triển JavaScript.

  • Mã Visual Studio:
    1. Tải xuống VsCode từ trang web chính thức
    2. Cài đặt các tiện ích mở rộng như sau:
      1. ESLint: Để xác định và khắc phục sự cố trong mã JavaScript.
      2. Đẹp hơn: Để định dạng mã nhất quán.
      3. Trình gỡ lỗi cho Chrome: Để gỡ lỗi mã JavaScript chạy trong Google Chrome.
      4. Node.js: Dành cho khả năng gỡ lỗi của Node.js.

Cài đặt thư viện cần thiết

Việc quản lý thư viện JavaScript được thực hiện thông qua npm (Trình quản lý gói nút). Để bắt đầu dự án của bạn và cài đặt các gói cần thiết, hãy sử dụng lệnh sau:

npm init -y
npm install express body-parser crypto

//express là  khung nút 
//body-parser là phần mềm trung gian để phân tích các yêu cầu gửi đến
//hàm mật mã dùng để băm

Chương 2: Tìm hiểu các khái niệm chuỗi khối bằng JavaScript

Khái niệm cơ bản về Blockchain trong JavaScript

Một blockchain bao gồm các khối, trong đó có:

  • Index: Vị trí của khối trong chuỗi.
  • Dấu thời gian: Ngày và giờ khi khối được tạo.
  • Dữ liệu: Dữ liệu giao dịch hoặc thông tin khác được lưu trữ trong khối.
  • Previous Hash: Hash của khối trước đó trong chuỗi, liên kết các khối lại với nhau.
  • Hash: Mã định danh duy nhất cho khối, được tạo bằng cách băm nội dung của nó.
const crypto = require(‘crypto’);

Khối lớp {    
constructor(chỉ mục, dấu thời gian, dữ liệu, trướcHash = ”) {        
this.index = chỉ mục;        
this.timestamp = dấu thời gian;        
this.data = dữ liệu;        
this.previousHash = previousHash;        
this.hash = this.calcateHash;    
>
    tínhHash {        
trả về crypto.createHash(‘sha256’)            < br/>.update(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data))           
 .digest(‘hex’);    

Tầm quan trọng của cơ chế phân cấp, bất biến và đồng thuận:

Phi tập trung

Trong các hệ thống blockchain, thay vì dựa vào cơ quan trung ương để lưu trữ dữ liệu và xác thực giao dịch, trách nhiệm được phân bổ giữa tất cả các nút tham gia. Điều này có nghĩa là mỗi nút giữ bản ghi (hoặc bản sao) sổ cái riêng của mình, loại bỏ các vấn đề tiềm ẩn do một điểm kiểm soát duy nhất gây ra.

Tính minh bạch:

Với tư cách là một nhà nghiên cứu khám phá Ethereum, tôi có thể tự tin nói rằng mọi nút và người tham gia trong mạng đều có quyền truy cập vào sổ cái, đảm bảo tính minh bạch vững chắc trên toàn bộ hệ thống. Các giao dịch trong Ethereum được hiển thị công khai cho tất cả mọi người xem trên blockchain explorer, cung cấp một môi trường cởi mở và minh bạch cho mọi người tham gia.

Tính bất biến:

Điều quan trọng là phải suy nghĩ kỹ lưỡng trước khi hoàn tất giao dịch vì những thay đổi hoặc đảo ngược thường không thể thực hiện được sau khi thực hiện giao dịch. Tính năng này rất có giá trị để tránh gian lận và giao dịch trùng lặp.

Cơ chế đồng thuận:

Trong mạng, các cơ chế đồng thuận đóng vai trò là hướng dẫn để các nút quyết định chung về trạng thái hiện tại của sổ cái phân tán. Các cơ chế này là công cụ để xác minh và xác thực các giao dịch. Họ đảm bảo rằng tất cả các nút tham gia trong Công nghệ sổ cái phân tán (DLT) đều đồng ý về trạng thái của sổ cái.

Các thành phần của ứng dụng Blockchain

Cấu trúc khối trong JavaScript:

const crypto = require(‘crypto’);

Khối lớp {    
constructor(chỉ mục, dấu thời gian, dữ liệu, trướcHash = ”) {        
this.index = chỉ mục;        
this.timestamp = dấu thời gian;        
this.data = dữ liệu;        
this.previousHash = previousHash;        
this.hash = this.calcateHash;        
this.nonce = 0; // Đối với Bằng chứng công việc    
>

CalculateHash {        
trả về crypto.createHash(‘sha256’)            
.update(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce )            
.digest(‘hex’);    

mineBlock(khó khăn) {        
while (this.hash.substring(0, độ khó ) !== Array(độ khó + 1).join(“0”)) {            
this.nonce++;            
this.hash = this.calcateHash;        
}        
console.log(“Khối được khai thác: ” + this.hash);    

Tạo và xác minh giao dịch bằng JavaScript:

Trong blockchain, mỗi giao dịch đóng vai trò là một đơn vị dữ liệu cơ bản, thể hiện sự thay đổi về giá trị, việc thực hiện thỏa thuận hoặc bất kỳ thay đổi nào đối với trạng thái chung của blockchain. Hệ thống thu thập các giao dịch này cùng nhau trong các khối và sau đó gắn chúng vào chuỗi khối.

Chi tiết về giao dịch:

  • Người gửi: Khóa công khai hoặc thông tin nhận dạng cụ thể của người gửi nó.
  • Người nhận: Khóa công khai hoặc thông tin nhận dạng cụ thể của người may mắn nhận được giao dịch.
  • Số tiền: Những gì đang được chuyển đi, có thể là tiền hoặc một số thông tin.
  • Dấu thời gian: Khi họ quyết định nhấn gửi nội dung này.
  • Bằng chứng/Chữ ký xác thực: Một số nội dung mã siêu bí mật cho thấy giao dịch hợp pháp và chưa bị giả mạo. Người gửi nó sẽ sử dụng khóa bí mật của họ để ký kết giao dịch và những người khác có thể kiểm tra xem nó có phải là thật bằng khóa chung hay không.

Đoạn mã cho giao dịch:

Giao dịch lớp {    
constructor(fromAddress, toAddress, money) {        
this.fromAddress = fromAddress;        
this.toAddress = toAddress;        
this.amount = số tiền;        
this.timestamp = new Date.toISOString;    
>
    tínhHash {        
trả về crypto.createHash(‘sha256’)            < br/>.update(this.fromAddress + this.toAddress + this.amount + this.timestamp)            
.digest(‘hex’);    

signTransaction(signingKey) {        
if (signingKey.getPublic(‘hex’) !== this.fromAddress) {            
ném Lỗi mới(‘Bạn không thể ký giao dịch cho các ví khác!’);        

 const hashTx = this.calcateHash;        
const sig = signatureKey.sign(hashTx, ‘base64’);        
this.signature = sig.toDER(‘hex’);    
    isValid {        
if (this.fromAddress === null) trả về giá trị đúng;

if (!this.signature || this.signature.length === 0) {            
ném Lỗi mới(‘Không chữ ký trong giao dịch này’);       

const publicKey = ec.keyFromPublic(this.fromAddress, ‘hex’);        
return publicKey.verify(this.calcateHash, this.signature);    

Việc xác minh giao dịch đảm bảo tính xác thực của nó bằng cách xác nhận rằng người ký là hợp pháp và có đủ tiền. Quá trình này thường đòi hỏi phải kiểm tra tính toàn vẹn của chữ ký số và xác minh rằng số dư tài khoản của người gửi bằng hoặc vượt quá giá trị giao dịch.

lớp Blockchain {    
hàm tạo {        
this.chain = [this.createGenesisBlock];        
this.pendingTransactions = [];        
this.miningReward = 100;    

createGenesisBlock {        
trả lại Khối mới (Date.parse(‘2024-01-01’), [], ‘0’);    

    getLatestBlock {        
trả lại this.chain[this.chain.length – 1];    

minePendingTransactions(miningRewardAddress) {        
let block = new Block(Date.now, this.pendingTransactions, this.getLatestBlock.hash);        
block.mineBlock(this.difficulty);

console.log(‘Khối được khai thác thành công !’);        
this.chain.push(block);
        this.pendingTransactions = [            
Giao dịch mới( null, miningRewardAddress, this.miningReward)       
];   

    addTransaction(transaction) {        
if (!transaction.fromAddress || !transaction. toAddress) {            
ném Lỗi mới(‘Giao dịch phải bao gồm địa chỉ từ và đến’);        

if (!transaction.isValid) {            
ném lỗi mới(‘Không thể thêm không hợp lệ giao dịch theo chuỗi’);        

        this.pendingTransactions.push(giao dịch);    

getBalanceOfAddress(address) {        
đặt số dư = 0;

for (const khối của this.chain) {            
for ( const trans của block.data) {               
 if (trans.fromAddress === địa chỉ) {                   
 balance -= trans.amount;               >

if (trans.toAddress === địa chỉ) {                   < br/> số dư += số tiền chuyển khoản;                
}           
 }       
 >
        trả lại số dư;    

    isChainValid {        
for (let i = 1; i < this.chain.length ; i++) {           
const currentBlock = this.chain[i];            
const previousBlock = this.chain[i – 1];
            if (!currentBlock.hasValidTransactions) {                
trả về sai;            

            if (currentBlock.hash !== currentBlock.calcateHash) {                
trả về sai;            >

            if (currentBlock.previousHash !== previousBlock.hash) {                
trả về sai;            
}        
>
        trả về giá trị đúng;    

Tổng quan về thuật toán đồng thuận tương thích với JavaScript:

Bằng chứng công việc (PoW):

Nói một cách đơn giản hơn, Proof of Work (thường được gọi là khai thác) là một phương pháp được sử dụng để xác thực các giao dịch và tạo các khối mới trong blockchain. Người dùng cạnh tranh để giải các bài toán phức tạp hoặc ‘câu đố mật mã’. Người đầu tiên giải được câu đố sẽ thêm khối tiếp theo vào chuỗi. Quá trình này được bảo mật bằng thuật toán băm, đảm bảo tính toàn vẹn và bảo mật của chuỗi khối.

Nói một cách đơn giản hơn, khi đưa Proof-of-Work (PoW) vào hoạt động, các công cụ cho mục đích này được cung cấp trong Bộ phát triển Bitcoin, bao gồm Bitcoin Core.

Bằng chứng cổ phần (PoS):

Nói một cách đơn giản hơn, Proof of Stake chọn người xác nhận không chỉ dựa trên số lượng tiền họ nắm giữ làm tài sản thế chấp mà còn xem xét các yếu tố như tuổi của đồng xu và tính ngẫu nhiên. Quá trình lựa chọn ưu tiên những người xác nhận đã nắm giữ tiền trong thời gian dài hơn và những người có số tiền đặt cược cao hơn, đồng thời đảm bảo tính công bằng thông qua giá trị băm thấp và tổng số tiền đặt cược cao. Những người xác nhận ưu tiên này sau đó được giao nhiệm vụ thêm một khối mới vào blockchain.

Triển khai dành cho nhà phát triển: Các công cụ và thư viện cho PoS được cung cấp bởi Ethereum 2.0 SDK

Bằng chứng cổ phần được ủy quyền (DPoS):

Nói một cách đơn giản hơn, hệ thống này sử dụng cách tiếp cận dân chủ để xác nhận các giao dịch và tạo các khối mới. Nó làm như vậy bằng cách cho phép bỏ phiếu giữa những người tham gia (được gọi là ‘đại biểu’) để xác thực các giao dịch và xây dựng các khối mới trong một chuỗi khối.

Triển khai dành cho nhà phát triển: EOSIO SDK cung cấp các công cụ và thư viện cho DPoS.

Chương 3: Xây dựng một Blockchain đơn giản bằng JavaScript

Trong hướng dẫn này, chúng ta sẽ đi sâu vào kiến ​​trúc của blockchain, bao gồm việc tạo các lớp thiết yếu như khối, xác định thuộc tính của chúng và hiểu cách các khối này cũng như tham số của chúng được kết nối với nhau.

Tạo lớp khối

Blockchain như tên đại diện bao gồm các khối và mỗi thuộc tính cơ bản của lớp khối như:

  • Chỉ mục: Mã định danh bằng số cho vị trí của khối trong chuỗi khối.
  • Dấu thời gian: Thời điểm khối được tạo.
  • Dữ liệu: Dữ liệu hoặc giao dịch được lưu trữ trong khối. Điều này có thể bao gồm thông tin như chi tiết giao dịch, dữ liệu người dùng, v.v.
  • PreviousHash: Hàm băm của khối trước đó trong chuỗi, đảm bảo tính liên tục và bảo mật.
  • Hash: Mã định danh duy nhất cho khối, được tạo bằng cách băm nội dung của khối.
  • Nonce: Một số được sử dụng cho thuật toán Proof of Work, được điều chỉnh cho đến khi tìm thấy hàm băm hợp lệ.

Triển khai các phương pháp tính toán hàm băm của khối bằng cú pháp JavaScript:

  • createGenesisBlock: Tạo khối đầu tiên trong chuỗi khối, được gọi là khối Genesis.
  • getLatestBlock: Truy xuất khối gần đây nhất trong chuỗi khối.
  • adBlock: Thêm một khối mới vào blockchain sau khi khai thác nó.
  • isChainValid: Xác thực tính toàn vẹn của chuỗi khối bằng cách đảm bảo giá trị băm của mỗi khối khớp với giá trị băm trước đó là nhất quán.

Tạo lớp Blockchain

Xác định lớp Blockchain để quản lý chuỗi và triển khai các phương thức để thêm khối mới:

lớp Blockchain {    
hàm tạo {        
this.chain = [this.createGenesisBlock];        
this.difficulty = 4;  // Mức độ khó khi khai thác    
>
    // Phương pháp tạo khối Genesis    
createGenesisBlock {
trả lại Khối mới(0, “01/01/2024”, “Khối Genesis”, “0”);    

 // Phương pháp truy xuất khối mới nhất trong chuỗi    < br/>getLatestBlock {        
trả lại this.chain[this.chain.length – 1];    

// Phương pháp thêm khối mới vào chuỗi sau khi khai thác nó    
addBlock(newBlock) {        
newBlock.previousHash = this.getLatestBlock.hash;        
newBlock.mineBlock(this.difficulty);        
this.chain.push(newBlock);    
>

 // Phương pháp xác thực tính toàn vẹn của chuỗi khối    
isChainValid {        
for (let i = 1; i < this.chain.length; i++) {            
const currentBlock = this.chain[i];            
const previousBlock = this.chain[i – 1];

// Kiểm tra xem hàm băm của khối hiện tại là chính xác            
if (currentBlock.hash !== currentBlock.calcateHash) {                
trả về sai;           

            // Kiểm tra xem hàm băm trước đó của khối hiện tại có khớp với hàm băm của khối trước đó hay không            
if (currentBlock.previousHash !== previousBlock.hash) {                
trả về sai;            
}       
 }        
trả về giá trị đúng;    

Chương 4: Triển khai Cơ chế đồng thuận trong JavaScript

Bằng chứng công việc

Nói một cách đơn giản hơn, Proof of Work (thường được gọi là khai thác) là một hệ thống trong đó những người tham gia mạng hoặc người khai thác cạnh tranh để giải quyết các vấn đề toán học phức tạp giống như các câu đố bằng mã mật mã. Người khai thác giải được câu đố trước tiên sẽ thêm khối tiếp theo vào chuỗi dữ liệu được gọi là chuỗi khối và nhận phần thưởng. Quá trình này liên quan đến việc sử dụng hàm băm để giữ an toàn cho chuỗi khối. Sự phức tạp của những câu đố này giúp duy trì tính bảo mật của chuỗi khối và điều chỉnh tốc độ các khối mới được thêm vào chuỗi.

Trong lớp Khối, hãy kết hợp khái niệm Bằng chứng công việc bằng cách tạo chức năng ‘mineBlock’. Hàm này sẽ liên tục điều chỉnh nonce cho đến khi hàm băm được mã hóa của khối đáp ứng một tiêu chuẩn phức tạp cụ thể (ví dụ: hàm băm phải bắt đầu bằng một số số 0 được chỉ định).

Đoạn mã:

Khối lớp {    
constructor(chỉ mục, dấu thời gian, dữ liệu, previousHash = ) {        
this.index = chỉ mục;        
this.timestamp = dấu thời gian;        
this.data = dữ liệu;        
this.previousHash = previousHash;        
this.hash = this.calcateHash;        
this.nonce = 0;   

 // Tính hàm băm của khối bằng SHA-256    
Tính toánHash {        
trả về crypto.createHash(‘sha256’)            
.update(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce)            
.digest(‘hex’);    

    // Triển khai Bằng chứng công việc    
mineBlock(khó khăn) {        
while (this.hash.substring(0, độ khó) !== Array(độ khó +
1).join(“0”)) {            
this.nonce++;            
this.hash = this.calcateHash;       
 }        
console.log(`Khối được khai thác: ${this.hash}`);    

Cập nhật lớp Blockchain để xác thực bằng chứng trước khi thêm khối mới.

lớp Blockchain {    
hàm tạo {        
this.chain = [this.createGenesisBlock];        
this.difficulty = 4;    

 // Tạo khối Genesis    createGenesisBlock {        
trả về Khối mới(0, “01/01/2024”, “Khối Genesis”, “0”);    

// Nhận khối mới nhất trong chuỗi    
getLatestBlock {        
trả lại this.chain[this.chain.length – 1];    

// Thêm khối mới vào chuỗi    
addBlock(newBlock) {        
newBlock.previousHash = this.getLatestBlock.hash;        
newBlock.mineBlock(this.difficulty);  // Triển khai Bằng chứng công việc        
this.chain.push(newBlock);    

// Kiểm tra xem chuỗi khối có hợp lệ hay không    
isChainValid {        
for (let i = 1; i < this.chain.length; i++) {            
const currentBlock = this. chuỗi[i];            
const previousBlock = this.chain[i – 1];
            if (currentBlock.hash !== currentBlock.calcHash) {                
trả về sai;           >

            if (currentBlock.previousHash !== previousBlock.hash) {                
trả về sai;           
 }        
}        
trả về giá trị đúng;    



Chương 5: Tạo API Blockchain đơn giản bằng JavaScript

Phát triển blockchain chỉ là bước đầu tiên; nó cũng phải thiết thực để sử dụng hàng ngày. Để đạt được mục tiêu này, chúng ta nên thiết kế giao diện thân thiện với người dùng, chẳng hạn như API đơn giản (Giao diện lập trình ứng dụng), cho phép tương tác dễ dàng.

Thiết lập môi trường API

Để tạo một API hiệu quả, điều quan trọng là trước tiên bạn phải chuẩn bị không gian làm việc bằng cách cài đặt tất cả các công cụ và khung cần thiết để phát triển nó.

  • Cài đặt nút và npm 
  • Khởi tạo dự án của bạn bằng lệnh: npm init -y
  • Cài đặt Express: npm install express -save (Express là khung js nút giúp xây dựng API nhanh hơn)
  • Cài đặt trình phân tích cú pháp nội dung để xử lý yêu cầu đến: npm install body-parser -save

Xây dựng API

Khi bạn đã chuẩn bị xong thiết lập của mình, hãy tiến hành tạo Giao diện lập trình ứng dụng (API). Giao diện này sẽ cho phép người dùng giao tiếp với blockchain, quan sát trạng thái hiện tại của chuỗi và thậm chí thêm các khối mới vào đó.

Tạo máy chủ bằng Express:

const express = require(‘express’);
const bodyParser = require(‘body-parser’);
const Blockchain = require(‘./blockchain’);  // Nhập lớp Blockchain

const app = express;
app.use(bodyParser.json);

let demoBlockchain = Blockchain mới;  // Khởi tạo một phiên bản Blockchain mới

Xác định điểm cuối API

app.get(‘/blocks’, (req, res) => {     //điểm cuối để lấy blockchain    
res.json(demoBlockchain.chain);});

//đây là điểm cuối để tạo khối mới

app.post(‘/mine’, ( req, res) => {    
const newBlock = Khối mới(        
demoBlockchain.chain.length,       
Date.now,        
req.body.data,        
demoBlockchain.getLatestBlock.hash   
);    
demoBlockchain.addBlock(newBlock);
    res.send(`Khối được khai thác thành công: ${newBlock.hash}`);
});

Khởi động máy chủ

app.listen(3000, => {    
console.log(‘API Blockchain chạy trên cổng 3000’);
}) ;
node server.js

Chương 6: Chạy và kiểm tra ứng dụng

Tôi không thể nhấn mạnh đủ tầm quan trọng của giai đoạn này để đảm bảo rằng chuỗi khối của bạn hoạt động trơn tru và mang lại kết quả như bạn mong đợi. Là một người đã dành nhiều năm làm việc với nhiều công nghệ blockchain khác nhau, tôi đã chứng kiến ​​vô số dự án thất bại do bỏ qua bước quan trọng này. Đừng mắc phải sai lầm tương tự – hãy đầu tư thời gian vào việc kiểm tra kỹ lưỡng và tinh chỉnh blockchain của bạn trước khi đưa nó vào sử dụng. Hãy tin tôi; người dùng của bạn sẽ cảm ơn bạn vì điều đó!

Chạy ứng dụng

  1. Khởi động máy chủ: Điều hướng đến thư mục dự án của bạn rồi chạy mục tiêu: node server.js
  2. Nhận xác nhận máy chủ: API Blockchain chạy trên cổng 3000
  3. Truy cập ứng dụng: Ứng dụng của bạn hiện đang chạy cục bộ trên http://localhost:3000, sẵn sàng chấp nhận các yêu cầu HTTP

Thử nghiệm với Người đưa thư

Là một nhà đầu tư tiền điện tử, tôi thường dựa vào các công cụ như Postman để đảm bảo API blockchain của mình hoạt động tối ưu. Với Postman, tôi có thể dễ dàng gửi yêu cầu HTTP và phân tích phản hồi mà nó trả về. Công cụ này vô cùng hữu ích khi kiểm tra và xác minh hiệu suất API của tôi, giữ cho khoản đầu tư của tôi an toàn và hiệu quả.

  • Cài đặt Người đưa thư
  • Kiểm tra điểm cuối Blockchain
  • Kiểm tra điểm cuối khai thác
  • Xác minh chuỗi khối
(Bước1)node server.js
API Blockchain chạy trên cổng 3000

//http://localhost: 3000/khối

(Bước2)[    
{        
“chỉ mục”: 0 ,        
“dấu thời gian”: 1636568887994,        
“dữ liệu”: “Khối Genesis”,       
 “ trướcHash”: “0”,       
 “băm”:
“81f1a4ab4d484c64f1b4c524b1d8f2fef8f2bca7853d44682e12022fb2d803b9”   
  giả b>
]

(Bước 3){    
“dữ liệu”: {        < br/>“số tiền”: 100,        
“người gửi”: “John Doe”,        
“người nhận”: “Jane Smith ”   
  giả định /> “thông báo”: “Khối khai thác thành công”,    
“chặn”: {       
“chỉ mục”: 1,        
“dấu thời gian”: 1636578990123,        
“dữ liệu”: {           
“số tiền”: 100,            
“người gửi”: “John Doe”,            
“người nhận”: “Jane Smith”        
},
“previousHash”: “81f1a4ab4d484c64f1b4c524b1d8f2fef8f2bca7853d44682e12022fb2d803b9”,      
 “băm”:
“5a1cdd657c8d0d 3c0f12c2bb2c9fdf32a7d2d4ad13fcb78170a8caa82ff4a9a2”    
>
>

 (Bước 5)[    {
“chỉ mục”: 0,        “dấu thời gian”: 1636568887994,        “dữ liệu”: “Khối Genesis”,        “Hash trước”: “0”,        “băm”:“81f1a4ab4d484c64f1b4c524b1d8f2fef8f2bca 7853d44682e12022fb2d803b9”    },    {        “chỉ mục”: 1,        “dấu thời gian ”: 1636578990123,        “dữ liệu”: {            “số tiền”: 100,            “người gửi”: “John Doe”,            “người nhận”: “Jane Smith”        },        “trướcHash”: 81f1a4ab4d484c64f1b4c524b1d8f2fef8f2bca7853d44682e12022fb2d803b9”,       “băm”: “5a1cdd657c8d0d3c0f12c2bb2c9fdf32a7d2d4ad13fcb78170a 8caa82ff4a9a2”    }

curl http://localhost:3000/blocks //Xem chuỗi khối
[   
 {       
 “chỉ mục”: 0,        
“dấu thời gian”: 1636568887994,       
 “dữ liệu”: “Khối Genesis”,        xuống />>
]

//Khai thác một blockcurl mới -X POST -H “Content-Type: application /json” -d ‘{“data”: {“amount”: 100, “sender”: “John Doe”, “receiver”: “Jane Smith”}}’ http://localhost:3000/mine

//xác minh blockcurl http://localhost:3000/blocks

[   
xuống dữ liệu”: “Khối Genesis”,       
 “previousHash”: “0”,      
 “băm”: “81f1a4ab4d484c64f1b4c524b1d8f2fef8f2bca7853d44682e12022fb2d803b9”   < br/>},    
{       
 “chỉ mục”: 1,       
 “dấu thời gian ”: 1636578990123,        
“dữ liệu”: {           
 “số tiền”: 100,            
“người gửi ”: “John Doe”,            
“người nhận”: “Jane Smith”       
 },        
“trướcHash”: “81f1a4ab4d484c64f1b4c524b1d8f2fef8f2bca7853d44682e12022fb2d803b9”,      
 “băm”:
“5a1cdd657c8d0d3c0f12c2bb 2c9fdf32a7d2d4ad13fcb78170a8caa82ff4a9a2”    

]

Chương 7: Ví dụ trực tiếp về xây dựng ứng dụng Blockchain bằng JavaScript

Thực hiện từng bước

  • Bước 1: Tạo lớp Block với các thuộc tính cần thiết bằng cú pháp JavaScript.
Khối lớp {    
constructor(chỉ mục, dấu thời gian, dữ liệu, previousHash = ) {        
this.index = chỉ mục;        
this.timestamp = dấu thời gian;        
this.data = dữ liệu;        
this.previousHash = previousHash;        
this.hash = this.calcateHash;        
this.nonce = 0;    

  • Bước 2: Triển khai phương thức CalculateHash.
CalculateHash {   
 trả về crypto.createHash(‘sha256’)        
.update(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce)       
 .digest(‘hex’);
  • Bước 3: Xác định lớp Blockchain và khởi tạo nó bằng khối Genesis.
lớp Blockchain {    
hàm tạo {        
this.chain = [this.createGenesisBlock];    

  • Bước 4: Triển khai các phương pháp thêm khối mới và truy xuất khối mới nhất bằng JavaScript.
getLatestBlock {    
trả lại this.chain[this.chain.length – 1];
>

addBlock(newBlock) {    
newBlock.previousHash = this.getLatestBlock.hash;    
newBlock.hash = newBlock. CalculateHash;    
this.chain.push(newBlock);

  • Bước 5: Thêm chức năng Proof of Work vào lớp Block và cập nhật lớp Blockchain.
mineBlock(độ khó) {    
while (this.hash.substring(0, độ khó) !== Array(độ khó + 1).join(“0”)) {        
this.nonce++;        
this.hash = this.calcateHash;    

  • Bước 6: Thiết lập môi trường API để xử lý các yêu cầu bằng Express.
npm init -y
npm install express -save                     //Thiết lập dự án và
thư mục

const express = require(‘express’);      // Thiết lập express serverconst bodyParser = require(‘body-parser’);
const Blockchain = require(‘./blockchain’); // Giả sử bạn có lớp Blockchain từ các chương trước

const app = express;app.use(bodyParser.json);

const demoBlockchain = Blockchain mới;
app.get(‘/blocks’, (req, res) => {    res.json(demoBlockchain.chain);});

app.post(‘/mine’, (req, res) => {            //tạo một khối mới             const newBlock = new Chặn(
demoBlockchain.chain.length,
        Date.now,
        req.body.data ,
        demoBlockchain.getLatestBlock.hash
);
    newBlock.mineBlock(2); Giả sử độ khó là 2 đối với PoW    demoBlockchain.addBlock(newBlock);    
res.send(`Khối được khai thác thành công: ${newBlock.hash}`);
});
app.listen(3000, => {                               //khởi động máy chủ    console.log(‘Blockchain API chạy trên cổng 3000’);});

node server.js

  • Bước 7: Kiểm tra ứng dụng bằng cách khai thác khối mới và xác minh chuỗi khối bằng Postman hoặc Curl.
Người đưa thư gửi yêu cầu:
NHẬN yêu cầu tới http://localhost:3000/blocks.
{    < br/>“dữ liệu”: {       
 “số tiền”: 10,       
 “người gửi”: “Alice”,       
 “người nhận”: “Bob”   

Trong Curl:curl
http://localhost:3000/blocks

Hãy tóm tắt ngắn gọn các bước trên

Hãy thực hiện từng bước quy trình để đưa ứng dụng blockchain của bạn vào cuộc sống:

  1. Bắt đầu bằng cách xác định các lớp Khối và Chuỗi khối để thiết lập cấu trúc cốt lõi của chuỗi khối của bạn.
  2. Kết hợp Bằng chứng công việc bằng cách thêm phương thức MineBlock vào lớp Block, đảm bảo mỗi khối đáp ứng độ khó cần thiết trước khi được thêm vào chuỗi.
  3. Thiết lập API bằng Express để cho phép bạn tương tác với blockchain của mình, cho phép thực hiện các hoạt động như xem chuỗi và thêm khối mới.
  4. Thực thi và kiểm tra ứng dụng của bạn bằng Postman hoặc Curl để xác minh rằng mọi thứ đều hoạt động như mong đợi, từ các khối khai thác đến truy xuất dữ liệu chuỗi khối.

Chúc mừng mã hóa!!

2024-08-14 21:30