Hãy xem xét một Merkle Tree đơn giản với lá alice +100
và nhấp nhô +50
. Sử dụng thuật toán băm SHA256, tóm tắt của các chuỗi tương ứng là:
# alice +100
dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac
# bo +50
7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1
Là một hàm băm, SHA-256 mang tính xác định, vì vậy việc chúng ta triển khai hàm này trong ngôn ngữ lập trình nào không quan trọng. Để hoàn thiện, điều này có thể được thực hiện thông qua tiền điện tử-js
thư viện:
const hash256 = (chuỗi) => {
hằng số giá trị =
require('crypto').createHash('sha256').update(string).digest('hex');
trả lại giá trị;
}
# áp dụng
hash256('alice +100')
# kết quả:
dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac
Khi một người đề cập đến Thực hiện cây Merkle, người ta xem mô tả sau:
Cây băm là một cây gồm các giá trị băm trong đó các lá là giá trị băm của các khối dữ liệu trong một tệp hoặc tập hợp các tệp chẳng hạn. Các nút xa hơn trong cây là giá trị băm của các nút con tương ứng của chúng. Ví dụ: trong hình trên, hàm băm 0 là kết quả của phép băm nối hàm băm 0-0 và hàm băm 0-1. Nghĩa là, hàm băm 0 = hàm băm( hàm băm(0-0) + hàm băm(0-1) ) trong đó +
biểu thị nối.
Tôi đã thấy các bản tóm tắt thư viện cấp cao hơn thực hiện phép nối này trong trường hợp Bộ đệm.concat()
, nhưng tôi muốn biết chính xác cách thực hiện điều này từ quan điểm toán học thuần túy.
Người ta sẽ cho rằng (không chính xác):
alice_hash = hash256('alice +100')
bob_hash = hash256('bob +50')
# Sai lầm
hash256(alice_hash + bob_hash)
# cũng sai: thêm tiền tố 0x
băm256(
'0xdc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac'
+
'0x7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1'
)
Vì vậy, nếu không có bất kỳ sự trừu tượng nào, làm thế nào một người có thể nối hai giá trị băm để có được nút cha kết quả?
Đối với bất kỳ ai đang cố gắng trợ giúp, giá trị chính xác của hash(hash(alice) + hash(bob)) phải là edf9a9a0e56b58fc9caccb97d85c628d5b9dc50cb94dfc41e83026d37704400f
. Tôi đã thử thêm/xóa 0x
tiền tố, thêm một ký tự khoảng trắng giữa chúng và không có nỗ lực nào trong số này có kết quả.Tôi cũng đã đọc các bài báo mà tôi có thể thực hiện được, nhưng chưa bao giờ đi xa hơn là "nối chúng để lấy giá trị cho nút cha" với rất ít tham chiếu triển khai.