Nếu chúng ta nhìn vào xu hướng của vài năm trước, chúng ta đã nghe nói về blockchain mọi lúc, nhưng không nhiều về các chi tiết cụ thể.
Tất cả chúng ta đều biết rằng các loại tiền điện tử như Bitcoin, Ethereum, Dogecoin, Matic và các loại khác đều dựa vào công nghệ blockchain. Blockchain đã dẫn đầu các sự kiện quan trọng đã cách mạng hóa nhiều ngành công nghiệp vào năm 2021 và mở đường cho những thành tựu mới.
Blockchain là một phương tiện lưu trữ dữ liệu theo cách khó hoặc không thể chỉnh sửa, hack hoặc lừa đảo. Nó là một sổ cái kỹ thuật số của các giao dịch được sao chép và trải rộng trên toàn bộ mạng lưới hệ thống máy tính của blockchain.
Đây là công nghệ cơ sở dữ liệu đột phá cung cấp năng lượng thực tế cho tất cả các loại tiền điện tử. Blockchain khiến cho việc hack hoặc gian lận hệ thống trở nên vô cùng khó khăn bằng cách phát tán các bản sao giống hệt nhau của cơ sở dữ liệu trên toàn bộ mạng.
Mặc dù Bitcoin hiện là ứng dụng nổi bật nhất cho blockchain, nhưng công nghệ này có thể phục vụ rất nhiều ứng dụng khác nhau.
Tiền điện tử và blockchain ngày càng phổ biến trong những năm gần đây và xu hướng này dự kiến sẽ tiếp tục.
Chúng tôi sẽ tạo một chuỗi khối đơn giản với JavaScript trong hướng dẫn này. Nó sẽ cung cấp cho bạn những hiểu biết cơ bản về cách hoạt động của một blockchain.
Hãy gọi nó là MelodyCoin và bắt tay ngay vào hành động!
Tạo một khối
Để bắt đầu, chúng tôi sẽ tạo một tệp JavaScript mới, trong đó chúng tôi sẽ đặt tất cả mã của mình.
Hãy gọi nó là main.js và bắt đầu với mô tả về cách một blockchain và các khối sẽ trông như thế nào.
Tạo một lớp Block và cung cấp cho nó một hàm Object () {[native code]} để bắt đầu.
Bạn phải cung cấp ngày tháng và giá trị băm của khối trước đó khi tạo khối mới:
Dưới đây là các định nghĩa cho từng thuộc tính:
- Dấu thời gian cho biết thời điểm khối được tạo. Bạn có thể sử dụng bất kỳ định dạng nào bạn chọn (trong trường hợp này là dấu thời gian UNIX).
- Bất kỳ dạng dữ liệu nào bạn muốn kết nối với khối này đều có thể được đưa vào tham số dữ liệu. Nếu bạn muốn tạo tiền điện tử, bạn có thể giữ dữ liệu giao dịch như người gửi / người nhận và số tiền được chuyển đến đây.
- Trước đó Hash là một chuỗi chứa hàm băm của khối trước đó. Đây là những gì sẽ tạo ra chuỗi khối, điều này sẽ rất quan trọng trong việc cung cấp tính toàn vẹn cho chuỗi khối của chúng ta sau này.
Tạo mã băm
Mỗi khối liên kết với khối trước đó (do đó thuộc tính beforeHash). Đó là, mỗi khối yêu cầu một hàm băm. Hàm băm tương tự như dấu vân tay. Nó là khác biệt cho mỗi khối.
Hàm băm của một khối có thể được tính bằng cách chuyển tất cả nội dung của nó thông qua một hàm băm.
Vì vậy, hãy bắt đầu bằng cách triển khai một hàm tính toán băm của khối hiện tại.
Vì vậy, dưới lớp Block, chúng ta định nghĩa hàm tính toán:
Tuy nhiên, hàm băm SHA256 không được JavaScript hỗ trợ và phải được lấy từ thư viện bên ngoài.
Crypto-js là một gói tuyệt vời bao gồm các triển khai an toàn của một số thuật toán băm.
Sau đó, chúng tôi có thể nhập nó vào mã main.js của chúng tôi.
Bây giờ chúng ta đã có hàm CalculHash (), hãy đặt nó để sử dụng trong hàm Block của chúng ta:
Sau khi mô tả một Block trông như thế nào, chúng ta có thể xác định Blockchain sẽ trông như thế nào. Vì vậy, hãy tạo một lớp mới.
Trong trường hợp này, blockchain là một đối tượng rất đơn giản có một chuỗi tài sản. Đây là một mảng chứa tất cả các khối trên chuỗi.
Trước khi chúng ta có thể thêm các khối, trước tiên chúng ta phải tạo cái được gọi là “khối gốc”. Đây là khối đầu tiên trong chuỗi và nó độc nhất ở chỗ nó không thể trỏ đến khối trước đó (nó là khối đầu tiên!).
Vì vậy, để xây dựng khối genesis, tôi sẽ thêm một hàm vào lớp của chúng ta có tên là createGenesisBlock (). Quay lại hàm Object () {[native code]} của lớp Blockchain của chúng ta.
Bây giờ chúng ta có thể bao gồm khối genesis bất cứ lúc nào chúng ta xây dựng một phiên bản Blockchain mới:
Phương pháp chuỗi khối
Bây giờ, hãy thêm các phương thức vào lớp Blockchain của chúng tôi để cho phép chúng tôi thực hiện những việc như thêm các khối mới và tìm nạp khối gần đây nhất.
Hàm getLatestBlock là cơ bản nhất. Nó chỉ trả về thành viên cuối cùng của chuỗi mảng:
Kỹ thuật addBlock liên quan nhiều hơn một chút.
Trước khi chúng ta có thể thêm một khối mới vào chuỗi của mình, trước tiên chúng ta phải đặt trường Hash trước của khối đó một cách thích hợp.
Nó phải được đặt thành băm của khối được thêm gần đây nhất vào chuỗi của chúng tôi. Chúng tôi cũng cần tính toán băm của khối mới:
Kiểm tra
Hãy xem MelodyCoin của chúng tôi đã ra mắt như thế nào.
Tạo một phiên bản blockchain để thực hiện điều này. Hãy thêm một vài khối nữa:
Chúng tôi đã tạo hai khối mới ở đó. Chúng ta hãy xem xét blockchain của chúng ta hiện tại trông như thế nào.
MelodyCoin sẽ được chuỗi và định dạng bằng bốn dấu cách:
Xác minh tính toàn vẹn của chuỗi khối
Blockchains thật tuyệt vời vì khi một khối đã được thêm vào, nó không thể được sửa đổi mà không làm mất hiệu lực phần còn lại của chuỗi.
Tuy nhiên, không có phương pháp nào để tôi kiểm tra tính toàn vẹn của blockchain của chúng tôi với việc triển khai này.
Hãy giới thiệu một hàm isChainValid vào blockchain của chúng tôi. Nếu chuỗi là hợp lệ, nó sẽ trả về true; nếu không, nó sẽ trả về false:
Kiểm tra tính toàn vẹn
Bây giờ chúng tôi có thể đưa tính toàn vẹn của blockchain của mình vào thử nghiệm. Nếu chúng tôi thực hiện nó ngay bây giờ, nó sẽ xác nhận rằng dây chuyền của chúng tôi là chính hãng.
Bây giờ chúng ta hãy cố gắng giả mạo chuỗi khối của mình. Hãy thay đổi khối 2 và ghi đè nội dung của nó (giả sử chúng ta đã chuyển 100 đồng tiền thay vì bốn đồng tiền).
Khi chúng tôi thực hiện điều này, chúng tôi có thể thấy rằng phần mềm ghi nhận nỗ lực của chúng tôi trong việc can thiệp vào chuỗi.
Tuy nhiên, bạn có thể tin rằng có một phương pháp khác để tôi can thiệp vào điều này. Tôi đã thay đổi nội dung trong khối nhưng không tính toán lại hàm băm. Vì vậy, bạn có thể cố gắng khéo léo và tính toán lại hàm băm của cùng một khối đó.
Đó là tất cả những gì đã có đối với thiết lập blockchain nhỏ của chúng tôi! Nó cho phép chúng tôi thêm các khối mới và phát hiện giả mạo dữ liệu trong chuỗi.
Có hai vấn đề với chuỗi khối nhỏ của chúng tôi mà chúng tôi phải giải quyết:
- Máy tính hiện đại cực kỳ nhanh và có thể thêm hàng nghìn khối vào chuỗi của chúng ta trong vài giây. Chúng tôi rõ ràng không muốn bất kỳ ai gửi thư rác vào blockchain của chúng tôi.
- Blockchain của chúng tôi vẫn dễ bị giả mạo. Bạn có thể cập nhật nội dung của một khối và sau đó chỉ cần tính toán lại các hàm băm (và các hàm băm trước đó) cho tất cả các khối tiếp theo. Ngay cả khi bạn gây rối với nó, bạn sẽ kết thúc với một chuỗi hợp pháp.
Để giải quyết những mối lo ngại này, các blockchain sử dụng một kỹ thuật được gọi là "bằng chứng công việc". Bạn phải chứng minh rằng bạn đã sử dụng một lượng đáng kể tài nguyên tính toán để tạo một khối bằng cách sử dụng phương pháp này. Đây còn được gọi là khai thác mỏ.
Proof-of-work yêu cầu hàm băm của khối phải bắt đầu bằng một lượng số không cụ thể. Nhưng làm thế nào bạn có thể biết liệu hàm băm của bạn có phù hợp với quy tắc này hay không?
Nội dung của một khối xác định hàm băm của nó. Vì vậy, chúng tôi luôn có được cùng một hàm băm, miễn là chúng tôi không sửa đổi nội dung.
Mỗi khối phải có một giá trị nonce được thêm vào nó như một giải pháp. Về cơ bản, đây là một số dữ liệu ngẫu nhiên mà chúng tôi có thể cập nhật cho đến khi băm khối của chúng tôi bắt đầu bằng đủ số XNUMX. Bởi vì bạn không thể thay đổi đầu ra của hàm băm, bạn phải thử nghiệm rất nhiều cách kết hợp khác nhau và hy vọng điều tốt nhất.
Giới thiệu khai thác với chuỗi khối
Hãy bắt đầu bằng cách bao gồm một nonce trong lớp Block của chúng ta. Giá trị nonce là một giá trị duy nhất trong khối của chúng ta mà chúng ta có thể sửa đổi để tác động đến hàm băm của khối.
Chúng tôi không thể thay đổi dấu thời gian hoặc dữ liệu.
Tiếp theo, hãy viết một hàm mineBlock () sẽ thực hiện việc khai thác thực tế một khối. Hàm này sẽ được gửi độ khó cần thiết dưới dạng một tham số và sẽ tiếp tục thực thi cho đến khi hàm băm của khối của chúng ta bắt đầu bằng đủ số XNUMX.
Tôi vừa tạo một vòng lặp while cơ bản sẽ chạy cho đến khi hàm băm của chúng ta bắt đầu với đủ số 5. Chúng tôi sử dụng độ khó để xác định có bao nhiêu số không là cần thiết. Với độ khó là 5, hàm băm của chúng ta phải bắt đầu bằng XNUMX số không.
Khi hàm băm của chúng ta không chứa đủ số XNUMX, chúng ta nâng số nonce lên một và tính toán lại hàm băm. Và nếu chúng tôi tìm thấy một hàm băm tương ứng với độ khó, chúng tôi sẽ ghi nó vào bảng điều khiển.
Còn một điều nữa chúng ta cần làm. Chúng tôi không thực sự tính đến biến nonce trong phương pháp tính toán của mình, vì vậy đây là:
Lớp Blockchain
Hãy đưa cách tiếp cận mới này vào thử nghiệm trong lớp blockchain của chúng tôi và xem nó diễn ra như thế nào.
Để bắt đầu, tôi sẽ xác định độ khó của blockchain của chúng ta trong hàm Object (). Chúng tôi xác định nó ở đây vì chúng tôi có thể sử dụng nó ở đâu đó sau này.
Sau đó, hàm addBlock phải được sửa đổi để nó khai thác khối trước khi thêm nó vào chuỗi của chúng tôi.
Sử dụng chuỗi khối
Bây giờ, hãy đặt blockchain mới của chúng tôi để sử dụng với thuật toán bằng chứng công việc. Tại đây, hãy thêm một vài câu lệnh console.log.
Khi chúng tôi thực thi đoạn mã này, chúng tôi có thể nhận thấy rằng quá trình khai thác không còn nhanh nữa.
Phải mất một khoảng thời gian để thuật toán tạo ra các khối có hàm băm bắt đầu bằng ba số không (như được định cấu hình theo độ khó).
Vì vậy, đó là phần cuối của thiết lập blockchain cơ bản của chúng tôi.
Chúng tôi có thể điều chỉnh tốc độ nhanh chóng của các khối mới được thêm vào blockchain của chúng tôi nhờ cơ chế bằng chứng công việc.
Đây là tính năng bảo mật quan trọng nhất trên blockchain. Và bây giờ bạn đã hiểu cách nó hoạt động, hãy bắt đầu tạo của riêng bạn!
Bình luận