Rate this post

Chúng tôi đã xem xét cấu trúc dữ liệu blockchain cơ bản trong phần trước chương và cũng bao gồm các khối xây dựng cơ bản của dữ liệu blockchain cấu trúc chẳng hạn như kỹ thuật băm và mật mã không đối xứng. Chúng ta sẽ tìm hiểu các chi tiết cụ thể về chuỗi khối Bitcoin trong phần này.

BlockChain Bitcoin, giống như bất kỳ chuỗi khối nào khác, có một cấu trúc dữ liệu blockchain. Khách hàng Bitcoin Core sử dụng LevelDB cơ sở dữ liệu của Google để lưu trữ cơ cấu dữ liệu blockchain trong nội bộ. Mỗi Khối được xác định bằng hàm băm của nó (Bitcoin sử dụng thuật toán băm SHA256).

Mọi khối đều chứa hàm băm của khối trước đó trong phần tiêu đề của nó. Hãy nhớ rằng hàm băm này không chỉ là hàm băm của tiêu đề trước đó mà còn là toàn bộ khối bao gồm tiêu đề và nó tiếp tục đến tận gốc khối. Khối genesis là sự khởi đầu của bất kỳ blockchain nào. Thông thường, một Chuỗi khối bitcoin trông như thể hiện trong Hình 3-3

Hình 3-3. Chuỗi khối Bitcoin

Như bạn có thể thấy trong blockchain này, có một phần tiêu đề khối chứa thông tin tiêu đề và có một phần nội dung trong đó các giao dịch được đóng gói trong mọi khối. Mỗi tiêu đề của khối đều chứa năm của khối trước đó. Vì vậy, bất kỳ thay đổi nào trong bất kỳ khối nào trong chuỗi sẽ không được dễ dàng như vậy; tất cả các khối tiếp theo phải được thay đổi cho phù hợp. 

Các bài viết liên quan:

Ví dụ: Nếu ai đó cố gắng thay đổi giao dịch trước đó chiếm được, chẳng hạn như khối số 441, sau khi thay đổi giao dịch, băm của khối này nằm trong tiêu đề của khối số 442 sẽ không phù hợp, vì vậy nó cũng phải được thay đổi. Thay đổi tiêu đề bằng tiêu đề mới hash sau đó sẽ yêu cầu bạn cập nhật hash trong tiêu đề khối của khối tiếp theo trong dãy, đó là khối số 443, và khối này sẽ cho đến khi khối hiện tại và đây là công việc khó khăn để làm. Nó gần như là không thể xảy ra khi chúng ta biết rằng mỗi nút đều có bản sao và hack của riêng nó vào tất cả các nút, hoặc ít nhất 51% trong số chúng, là không khả thi.

Hình 3-4. Các khối mồ côi trong blockchain thực sự

Quan sát trong hình 3-4 mà ở chiều cao khối-3, hai khối được đề xuất trở thành khối 3, nhưng chỉ một trong số chúng có thể lọt vào chuỗi khối cuối cùng và số còn lại mồ côi. Rõ ràng là ở một chiều cao khối nhất định,có thể có một hoặc nhiều khối vì cũng có thể có một số khối mồ côi ở độ cao này, vì vậy độ cao khối không phải là cách tốt nhất để xác định duy nhất một khối và băm khối là cách thích hợp để làm như vậy

Cấu trúc block của bitcoin

Cấu trúc khối của một chuỗi khối Bitcoin được cố định cho tất cả các khối và có các trường cụ thể với dữ liệu bắt buộc tương ứng của chúng. Hãy xem hình 3-5, một cái nhìn toàn cảnh về toàn bộ cấu trúc khối, và sau đó chúng tôi sẽ tìm hiểu thêm về các trường riêng lẻ ở phần sau của chương này

Hình 3-5. Cấu trúc khối của chuỗi khối Bitcoin

Magic Number 4 byte nó có một giá trị cố định 0xD9B4BeF9, cho biết Sự bắt đầu của khối và cũng là khối bắt nguồn từ mạng chính hoặc mạng sản xuất.

Block size 4 byte điều này cho biết kích thước của khối. bản gốc Khối bitcoin có 1MB và có khối mới hơn phiên bản của Bitcoin được gọi là “Bitcoin Cash” có khối kích thước là 2MB.

Block header 80 byte nó bao gồm nhiều thông tin như trước đó Băm, nonce, gốc Merkle của khối, và nhiều thứ khác Lớp Kích thước

Giao dịch 1–9 byte nó cho biết tổng số giao dịch.

Transaction list bao gồm trong khối. không phải mọi giao dịch đều có cùng kích thước và có một số giao dịch trong mọi khối.

Biến số trong nhưng kích thước cố định nó liệt kê tất cả các giao dịch đang diễn ra trong mộtkhối đã cho. Tùy thuộc vào kích thước khối (cho dù 1MBhoặc 2MB), trường này chiếm không gian còn lại trong một khối

Merkle tree trong Bitcoin

Chúng ta đã đề cập đến khái niệm cây Merkle trong chương trước. Trong phần này, chúng ta sẽ chỉ xem xét cách Bitcoin sử dụng cây Merkle.Mỗi khối trong chuỗi khối Bitcoin chứa hàm băm của tất cả các giao dịch, và gốc Merkle của tất cả các giao dịch này được bao gồm trong tiêu đề của khối đó. Theo đúng nghĩa, khi chúng ta nói rằng mỗi tiêu đề khối chứa băm của toàn bộ khối trước đó, tin cậy là nó chỉ chứa

băm của tiêu đề khối trước đó. Tuy nhiên, nó là đủ, bởi vì tiêu đề đã chứa gốc Merkle. Nếu một giao dịch trong khối bị thay đổi, gốc Merkle sẽ không khớp nữa và thiết kế như vậy vẫn duy trì tính toàn vẹn của blockchain. Cây Merkle là một cấu trúc dữ liệu dạng cây của hàm băm của các giao dịch. “Các nút lá” trong cây Merkle thực sự đại diện cho hàm băm của giao dịch, trong khi gốc của cây là gốc Merkle. Tham khảo Hình 

Hình 3-6. Biểu diễn Merkle-tree

Lưu ý rằng hàm băm của bảy giao dịch A, B, C, D, E, F và G tạo thành lá của cây. Vì có bảy giao dịch nhưng tổng số các nút lá phải nằm trong cây nhị phân, nút lá cuối cùng được lặp lại. Mỗi băm giao dịch 32 byte (tức là 256 bit) được tính bằng cách áp dụng SHA256 hai lần cho các giao dịch. Tương tự, hàm băm của hai giao dịch được nối (62 byte) và sau đó được băm hai lần với SHA256 để có được băm mẹ là 32 byte. Chỉ đường dẫn Merkle đến một giao dịch là đủ để xác minh xem giao dịch là một phần của bất kỳ khối nào và do đó khá hiệu quả. Nên blockchain thực tế có thể được biểu diễn như trong Hình 3-7.

Hình 3-7. Đại diện cây Merkle

Mục tiêu về độ khó

Mục tiêu khó khăn là mục tiêu thúc đẩy PoW trong Bitcoin. Ý tưởng là rằng khi một block được lấp đầy bằng các giao dịch hợp lệ, hàm băm của khối đó tiêu đề cần được tính toán để nhỏ hơn mục tiêu độ khó trong cùng một tiêu đề. Số nonce trong tiêu đề bắt đầu từ số không. 

Người khai thác có để tiếp tục tăng nonce này và băm tiêu đề cho đến khi băm giá trị nhỏ hơn mục tiêu. Độ khó của bốn byte (32 bit) trong tiêu đề xác định những gì sẽ là giá trị đích (256 bit) cho khối đó được khai thác. The nonce nên được tìm thấy sao cho băm của toàn bộ tiêu đề phải ít hơn hơn giá trị mục tiêu. Hãy nhớ rằng giá trị mục tiêu càng thấp thì càng nhiều rất khó để tìm thấy một hàm băm tiêu đề nhỏ hơn Mục tiêu. Vì Bitcoin sử dụng SHA256, mỗi khi bạn băm tiêu đề khối, đầu ra là bất kỳ số nào trong khoảng từ 0 đến 2^256 , đây là một con số khá lớn

Nếu với hàm băm của bạn nhỏ hơn mục tiêu, khối sẽ là được chấp nhận bởi toàn bộ mạng, nếu không bạn phải thử với một nonce khác cho đến khi nó thỏa mãn điều kiện. Tại thời điểm này, vẫn chưa rõ làm thế nào mục tiêu độ khó được tính toán với các bit độ khó trong mỗi tiêu đề. Mục tiêu có thể được lấy từ bốn byte (8 số thập lục phân) các bit khó khăn trong tiêu đề bằng cách sử dụng công thức xác định trước mà mọi nút đều có theo mặc định, vì nó đi kèm với các tệp nhị phân trong quá trình cài đặt. Tiếp theo là công thức để tính độ khó:

target = coefficient * 2(8 * (exponent – 3))

Lưu ý rằng có một “hệ số” và cũng có một số hạng “số mũ” trong công thức này, chúng hiện diện như một phần của bit khó khăn bốn byte. Hãy để chúng tôi lấy một ví dụ để giải thích điều này tốt hơn. Nếu bit khó khăn bốn byteở dạng hex là 0x1b0404cb, sau đó hai chữ số hex đầu tiên tạo thành số mũ số hạng, là (0x1b), và số còn lại tạo thành số hạng hệ số, là (0x0404cb) trong trường hợp này. Giải công thức mục tiêu với các giá trị sau:

target = 0x0404cb * 2(0x08 * (0x1b – 0x03))

target = 0x00000000000404 CB000000000000000000000000000000000000000000000000

Bitcoin được thiết kế sao cho cứ mỗi 2.016 khối sẽ mất hai tuần được tạo và nếu bạn làm phép toán, sẽ mất khoảng mười phút cho mọi khối. Trong mạng không đồng bộ này, rất khó lập trình như thế này, trong đó mỗi khối mất đúng mười phút với loại PoW cơ chế tại chỗ. Trong thực tế, đó là thời gian trung bình cho một khối, và ở đó là khả năng khối Bitcoin được tạo trong vòng một phút hoặc có thể rất tốt mất 15 phút để được tạo. Vì vậy, khó khăn được thiết kế để tăng hoặc giảm tùy thuộc vào việc mất ít hơn hay nhiều hơn hai tuần để tìm thấy 2.016 khối. 

Thời gian này được thực hiện cho 2.016 khối có thể được tìm thấy sử dụng thời gian hiện tại trong các trường dấu thời gian của mọi tiêu đề khối. Nếu nó mất, giả sử, T lượng thời gian cho 2.016 khối, con số này không bao giờ chính xác hai tuần, mục tiêu khó khăn trong mỗi khối được nhân với (T / 2 tuần). Vì vậy, kết quả của [mục tiêu khó khăn × (T / 2 tuần)] sẽ được tăng lên nếu T là ít hơn và giảm khác.

Rõ ràng là bây giờ mục tiêu độ khó có thể điều chỉnh được; Nó có thể được đặt khó hơn hoặc dễ hơn tùy thuộc vào tình huống mà chúng tôi đã giải thích trước. Bạn phải tự hỏi, ai sẽ điều chỉnh khó khăn này khi hệ thống được phân cấp? Một nguyên tắc chung mà bạn phải luôn giữ lưu ý rằng bất cứ điều gì xảy ra trong một thiết kế phi tập trung như vậy đều phải xảy ra riêng lẻ ở mọi nút. Sau mỗi 2.016 khối, tất cả các nút tính toán riêng giá trị mục tiêu độ khó mới và tất cả đều kết luận trên cùng một vì đã có một công thức được xác định cho nó. Có công thức này hữu ích, đây là một lần nữa: 

Mục tiêu mới = Mục tiêu cũ * (T / 2 tuần)

⇨ Mục tiêu mới = Mục tiêu cũ * (Thời gian thực hiện cho năm 2016 Chặn trong

Giây / 12,09,600 giây)

Lưu ý các tham số như 2.016 khối và thời gian mục tiêu của hai tuần (12.09.600 giây) được định nghĩa trong chainparams.cpp là

consensus.nPowTargetTimespan = 14 * 24 * 60 * 60;
 // two weeks consensus.nPowTargetSpacing = 10 * 60;
 consensus.nMinerConfirmationWindow = 2016; 
// nPowTargetTimespan / nPowTargetSpacing

Lưu ý ở đây là (T / 2 tuần) chứ không phải (2 tuần / T). Ý tưởng là giảm mục tiêu độ khó khi cần tăng độ phức tạp, vì vậy cần nhiều thời gian hơn. Hàm băm mục tiêu càng ít thì càng khó. để tìm một hàm băm nhỏ hơn hàm băm mục tiêu này. Ví dụ: Nếu mất mười ngày để khai thác 2.016 khối, thì (T / 2 tuần) sẽ là một phần nhỏ, khi nhân với “Mục tiêu cũ” sẽ làm giảm nó hơn nữa và “Mục tiêu mới” sẽ là một giá trị nhỏ hơn giá trị cũ. 

Điều này sẽ làm cho việc tìm kiếm một hàm băm trở nên khó khăn và sẽ cần nhiều thời gian hơn. Đây là cách thời gian giữa các khối duy trì ở mức trung bình mười phút. Hãy tưởng tượng rằng mục tiêu khó khăn đã được cố định và không thể điều chỉnh; bạn nghĩ vấn đề sẽ là gì? Hãy nhớ rằng sức mạnh tính toán của phần cứng tăng lên khi thời gian khi các máy tính mạnh hơn được giới thiệu để khai thác khối.

Một tình huống trong đó 10 giây hoặc 100 hoặc thậm chí 1.000 khối được đề xuất tại đồng thời không mong muốn cho mạng hoạt động bình thường. Nên ý tưởng là, ngay cả khi ngày càng có nhiều nút máy tính mạnh mẽ hơn vào vào mạng Bitcoin, thời gian phát sóng cần thiết để đề xuất một khối vẫn còn mười phút bằng cách điều chỉnh mục tiêu khó khăn. 

Ngoài ra, thợ mỏ của cơ hội đề xuất một khối phụ thuộc vào việc họ có bao nhiêu sức mạnh băm so với sức mạnh băm toàn cầu của tất cả các thợ đào bao gồm. Bạn đang nghĩ tại sao lại là mười phút, và tại sao không phải là 12 phút? Hoặc tại sao không sáu phút? Chỉ cần lưu ý rằng phải có một khoảng cách thời gian nào đó cho tất cả các nút trong một hệ thống không đồng bộ phi tập trung để đồng ý về nó. Nếu không có khoảng cách thời gian, rất nhiều khối sẽ đến chỉ bằng một phân số sự chậm trễ và sẽ không có bất kỳ lợi ích tối ưu hóa nào của blockchain như so với chuỗi giao dịch . Mỗi giao dịch là một chương trình phát sóng và mỗi khối mới cũng là một chương trình phát sóng. Ngoài ra, tính trật tự mà một blockchain mang lại cho hệ thống là khá kém khả thi bởi chuỗi giao dịch. 

Với khái niệm về khối, có thể bao gồm các giao dịch không liên quan từ bất kỳ người gửi nào đến bất kỳ người nhận nào trong các khối, điều này không dễ duy trì với chuỗi giao dịch. 

Một quảng cáo khối hợp lệ hiệu quả hơn so phát sóng giao dịch cá nhân sau khi xác thực. Bây giờ, trở lại với cuộc thảo luận trong mười phút, nó rất có thể ít hơn một chút hoặc một chút nhiều hơn nhưng chắc chắn sẽ có một khoảng cách nào đó giữa hai các khối. 

Hãy tưởng tượng rằng bạn là một người khai thác và khối khai thác số 4567, nhưng một số người khai thác khác đã may mắn và đề xuất số khối 4567, mà bạn vừa nhận được trong khi giải câu đố mật mã. Bạn sẽ làm gì bây giờ là xác thực khối này và nếu nó hợp lệ, hãy thêm nó vào bản sao cục bộ của bạn blockchain và ngay lập tức bắt đầu khai thác 4568. Bạn sẽ không muốn người khác đề xuất 4568 trong khi bạn vừa mới xác thực xong khối 4567, mà bạn nhận được muộn hơn một chút so với các công cụ khai thác khác do độ trễ của mạng. Bây giờ câu hỏi là: 10 phút này có phải là tốt nhất không tùy chọn khả thi ? 

Chà, thật khó để giải thích điều này trong một từ, nhưng mười- khoảng cách phút giải quyết rất nhiều vấn đề do mạng không đồng bộ, thời gian chậm trễ, giảm gói, dung lượng hệ thống và hơn thế nữa. Có khả năng nó có thể được tối ưu hóa hơn nữa, ví dụ, năm phút hoặc lâu hơn, mà bạn có thể thấy trong nhiều loại tiền điện tử mới và các trường hợp sử dụng blockchain khác

Khối genesis

Khối đầu tiên như bạn có thể thấy trong đoạn mã sau, khối-0, được gọi là các nguồn gốc khối. Hãy nhớ rằng khối genesis phải được mã hóa cứng vào các ứng dụng blockchain và trường hợp của Bitcoin cũng vậy. Bạn có thể coi nó như một khối đặc biệt vì nó không chứa bất kỳ tham chiếu nào đến các khối trước đó. Khối khởi đầu của Bitcoin được tạo ra vào năm 2009 khi nó đã được đưa ra. Nếu bạn mở Bitcoin Core, đặc biệt là chuỗi tệp cpp, bạn sẽ thấy cách khối genesis được mã hóa tĩnh. Sử dụng một tham chiếu dòng lệnh đến Bitcoin Core, bạn có thể nhận được thông tin tương tự bằng cách truy vấn với hàm băm của khối genesis như được hiển thị bên dưới:

$ bitcoin-cli getblock 000000000019d6689c085ae165831e934 ff763ae46a2a6c172b3f1b60a8ce26f
{

"hash" : "000000000019d6689c085ae165831e934ff763ae46a2a6

c172b3f1b60a8ce26f",

"confirmations" : 308321,

"size" : 285,

"height" : 0,
"version" : 1,

"merkleroot" : "4a5e1e4baab89f3a32518a88c31bc87f618

f76673e2cc77ab2127b7afdeda33b",

"tx" : ["4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc

77ab2127b7afdeda33b"],

"time" : 1231006505,

"nonce" : 2083236893,

"bits" : "1d00ffff",

"difficulty" : 1.00000000,"nextblockhash" : "00000000839a8e6886ab5951d76 f411475428afc90947ee320161bbf18eb6048"}

Nếu bạn chuyển đổi tem thời gian Unix như được hiển thị trong đầu ra trước đó, bạn sẽ tìm thấy thông tin ngày-giờ này: Thứ Bảy, ngày 3 tháng 1 năm 2009 11:45:05 CH. Bạn cũng có thể lấy thông tin tương tự từ trang web https: //blockchain.info . Chỉ cần điều hướng đến trang web này và dán giá trị băm vào hộp tìm kiếm trên cùng bên phải và nhấn “Enter”. Đây là những gì bạn sẽ tìm thấy (Bảng 3-3 )(bảng thông tin giao dịch)

THÔNG TIN BĂM(3-4)

Trong Block-0 này, chỉ có một giao dịch, đó là coinbase Giao dịch. Các giao dịch trên Coinbase là những giao dịch mà các thợ đào nhận được. Không có đầu vào cho các giao dịch như vậy và chúng chỉ có thể tạo ra Bitcoin. Nếu bạn đã khám phá các giao dịch được liên kết trong khối này, đây là nó sẽ trông như thế nào

Hình 3-8. Giao dịch Coinbase trong Block-0

Mạng Bitcoin

Mạng Bitcoin là một mạng ngang hàng, như đã được thảo luận. Ở đó không có máy chủ tập trung nào trong một hệ thống như vậy và mọi nút đều được đối xử bình đẳng. Không có hiện tượng master-slave và không có hệ thống phân cấp trong như vậy hệ thống. Vì điều này chạy trên chính Internet, nó sử dụng cùng một TCP / IP ngăn xếp giao thức như được hiển thị trong Hình 3-9

Hình 3-9. Mạng lưới blockchain Bitcoin trên Internet

Sơ đồ trên cho thấy các mạng Bitcoin cùng tồn tại như thế nào Ngăn xếp Internet. 

Mạng Bitcoin khá năng động theo nghĩa các nút có thể tham gia và rời khỏi network theo ý muốn và hệ thống vẫn hoạt động. Cũng, mặc dù về bản chất là không đồng bộ và với sự chậm trễ của mạng và gói giảm xuống, hệ thống rất mạnh mẽ — nhờ vào thiết kế của Bitcoin! Mạng Bitcoin là một mạng phi tập trung không có điểm trung tâm thất bại và cũng như không có cơ quan trung ương. 

Với thiết kế như vậy, bạn sẽ đánh giá mạng lưới Bitcoin lớn như thế nào? Không có cách ước tính thích hợp điều này vì các nút có thể tham gia và rời đi theo ý muốn. Tuy nhiên, có một số cố gắng nghiên cứu mạng Bitcoin và một số người cho rằng có gần 10.000 nút chủ yếu được kết nối với mạng mọi lúc và có thể có hàng triệu nút cùng một lúc.

Mọi nút trong mạng Bitcoin đều bình đẳng về quyền hạn và có cấu trúc phẳng, nhưng các nút có thể là nút đầy đủ hoặc nút nhẹ. Các nút đầy đủ có thể thực hiện hầu hết mọi hoạt động được phép trong Bitcoin hệ thống, chẳng hạn như giao dịch khai thác và giao dịch phát sóng, và có thể cung cấp dịch vụ ví. Các nút đầy đủ cũng cung cấp định tuyến có chức năng tham gia và duy trì mạng Bitcoin. Để trở thành một nút đầy đủ, bạn phải tải xuống toàn bộ cơ sở dữ liệu blockchain chứa toàn bộ giao dịch đã diễn ra cho đến nay. 

Ngoài ra, nút phải kết nối vĩnh viễn với mạng Bitcoin và nghe thấy tất cả giao dịch đang diễn ra. Điều quan trọng là bạn phải có một mạng lưới tốtkết nối, bộ nhớ tốt (ít nhất 200GB) và ít nhất 2GB RAM chuyên dụng với nó. Yêu cầu này có thể thay đổi nhiều hơn nữa và đòi hỏi nhiều tài nguyên hơn theo thời gian.

Mặt khác, các nút nhẹ không thể khai thác các khối mới nhưng có thể xác minh giao dịch bằng cách sử dụng Xác minh thanh toán đơn giản hóa (SPV). Họđược gọi là “khách hàng mỏng”. Phần lớn các nút trong Bitcoin mạng là các SPV. Họ cũng có thể tham gia khai thác chung ở đó nhiều nút đang cố gắng khai thác các khối mới cùng nhau. 

Các nút nhẹ có thể giúp xác minh các giao dịch cho các nút đầy đủ. Một ví dụ điển hình về SPV là một ví (khách hàng). Nếu bạn đang chạy ví và ai đó gửi tiền đối với bạn, bạn có thể hoạt động như một nút trong mạng Bitcoin và tải xuống các giao dịch liên quan đến một giao dịch đã thực hiện với bạn để bạn có thể kiểm tra xem người đó có gửi cho bạn Bitcoin thực sự sở hữu chúng.

Điều quan trọng cần lưu ý là SPV không được bảo mật như xác thực hoàn toàn vì nó thường chứa các tiêu đề khối chứ không phải toàn bộ các khối. Do đó, SPV không thể xác thực các giao dịch vì chúng không có chúng cho một khối và cũng bởi vì chúng không có tất cả những gì chưa được tiêu đầu ra giao dịch (UTXO) ngoại trừ đầu ra của chính chúng.

Tập lệnh bitcoin

Chúng tôi đã tìm hiểu về các giao dịch Bitcoin trong các phần trước ở mức độ cao. Trong phần này, chúng ta sẽ đi sâu vào các cấu trúc lập trình thực tế làm cho các giao dịch xảy ra. Mọi đầu vào của giao dịch Bitcoin và đầu ra được nhúng với các tập lệnh. Các tập lệnh bitcoin dựa trên ngăn xếp mà chúng ta sẽ thấy ngay sau đây và được đánh giá từ trái sang phải. 

Nhớ lại rằng các tập lệnh Bitcoin không phải là hoàn chỉnh Turing, vì vậy bạn không thể thực sự bất cứ thứ gì và mọi thứ có thể thông qua Turing-complete khác các ngôn ngữ như C, C++ hoặc Java, v.v.

Không có khái niệm về vòng lặp trong Tập lệnh bitcoin, do đó thời gian thực thi cho các tập lệnh không thay đổi và là tỷ lệ với số lượng lệnh. Điều này có nghĩa là các tập lệnh thực hiện trong một khoảng thời gian giới hạn và không có khả năng cho chúng mắc kẹt bên trong một vòng lặp. Ngoài ra, quan trọng nhất, các tập lệnh chắc chắn chấm dứt. 

Bây giờ chúng ta đã biết một chút về các tập lệnh, chúng chạy ở đâu?Bất cứ khi nào giao dịch được thực hiện, dù theo chương trình hay thông qua một phần mềm ví hoặc bất kỳ chương trình nào khác, các tập lệnh được đưa vào bên trong giao dịch và công việc của người khai thác là chạy các tập lệnh đó trong khi khai thác mỏ. Mục đích của các tập lệnh Bitcoin là cho phép các nút mạng để đảm bảo các khoản tiền hiện có chỉ được xác nhận và chi tiêu bởi người có quyền bên thực sự sở hữu chúng.

Giao dịch bitcoin đã được duyệt lại

Một giao dịch trong mạng Bitcoin là một sự chuyển giao giá trị, là một phát tới toàn bộ mạng và kết thúc ở một số khối trong chuỗi khối. Thông thường, có vẻ như Bitcoin được chuyển từ một tài khoản hoặc ví khác, nhưng trên thực tế, nó là từ một giao dịch đến nữa. 

Trước khi đi vào chi tiết, hãy nhớ rằng Địa chỉ bitcoin về cơ bản là đầu ra được băm kép của công chúng chính của những người tham gia. Khóa công khai được băm đầu tiên bằng SHA256 và sau đó bằng các thuật toán băm RIPEMD160, tương ứng, để tạo ra 160- địa chỉ Bitcoin. Chúng tôi đã đề cập đến các kỹ thuật băm này trong chương trước. Hãy để chúng tôi phóng to hơn một chút về các giao dịch hiện nay. Hãy xem cây giao dịch sau (Hình 3-20), theo cách của nó xảy ra bằng Bitcoin

Hình 3-20. Một cấu trúc giao dịch Bitcoin điển hình

Quan sát rằng đầu ra của các giao dịch trước đó trở thành đầu vào của giao dịch và quá trình này tiếp tục mãi mãi. Trong hình trước, nếu chính bạn đã nhận được 100K từ một số đầu ra trước đó, nó đã trở thành đầu vào có thể chi tiêu cho một giao dịch mới. Lưu ý rằng trong Tx 0, bạn đã chi 40 nghìn và 50 nghìn và đã thanh toán những số tiền đó, và số tiền còn lại (10 nghìn) đã trở thành phí cho người khai thác. 

Theo mặc định, số tiền còn lại được thanh toán cho người khai thác, vì vậy bạn cần phải cẩn thận để không bỏ qua những tình huống như vậy, luôn luôn là trường hợp. Trong tình huống tương tự, trong số những người còn lại Số tiền 10 nghìn, bạn có thể chuyển 9 nghìn đến địa chỉ của riêng bạn và rời đi dành 1K cho phí khai thác. Khi một số tiền không được chi tiêu, theo nghĩa rằng một giao dịch không được sử dụng làm đầu vào cho một giao dịch mới, nó vẫn UTXO, có thể được sử dụng sau này. Rõ ràng, những cái trước đó là đã được chi tiêu. Vì vậy, tất cả các UTXO được kết hợp cho tất cả các tài khoản (công khai chìa khóa) mà bạn giữ là số dư trong ví của bạn

Hãy tạm dừng một chút ở đây và nghĩ xem nó phải như thế nào được lập trình. Hãy nhớ rằng cả đầu vào và đầu ra của các giao dịch được trang bị các tập lệnh có liên quan để làm cho nó có thể thực hiện được. Nó chỉ thông qua các tập lệnh mà nó có thể được đảm bảo rằng bạn là người dùng được ủy quyền để thực hiện một giao dịch và bạn có số tiền cần thiết mà bạn đã nhận được từ một giao dịch trước đó. Điều này có nghĩa là cả đầu vào và đầu ra đều quan trọng như nhau. Đây là cách nội dung của giao dịch:

Đầu ra giao dịch = Số lượng Bitcoin cần chuyển + Đầu ra Kịch bản

Đầu vào giao dịch = Tham chiếu đến đầu ra giao dịch trước đó + Tập lệnh đầu vào

Việc xem xét tập lệnh đầu ra trước hay tập lệnh đầu vào trước là thực ra là một vấn đề về trứng gà. Nhưng chúng ta sẽ thấy tập lệnh đầu ra trước tiên bởi vì nó là thứ đang được sử dụng bởi tập lệnh đầu vào của giao dịch tiếp theo. 

Hãy để chúng tôi lặp lại và hiểu đúng điều này, điều đó trong khi tạo giao dịch, tập lệnh đầu ra của giao dịch hiện tại chỉ để cho phép giao dịch trong tương lai có thể sử dụng điều này làm đầu vào, nhưng đối với điều này giao dịch hiện tại, nó là tập lệnh đầu ra của giao dịch trước đó cho phép bạn chi tiêu nó. 

Đây là lý do tại sao các tập lệnh đầu ra có khóa công khai của người nhận và giá trị (số lượng Bitcoin) được chuyển. Khi mà tập lệnh đầu ra đang được sử dụng làm đầu vào, mục đích chính của chúng là kiểm tra chữ ký so với khóa công khai. Các tập lệnh đầu ra còn được gọi là ScriptPubKey . 

Trừ khi đầu ra này được sử dụng, nó vẫn là một UTXO đang chờ dành ra. Tập lệnh đầu vào trong cấu trúc dữ liệu đầu vào giao dịch có cơ chế về cách thực hiện giao dịch trước đó mà bạn đang thử để chi tiêu. Vì vậy, nó phải có tham chiếu đến giao dịch trước đó. Số băm của giao dịch trước đó và số chỉ mục {băm, chỉ mục} xác định chính xác nơi bạn đã nhận được số tiền mà bạn hiện đang chi tiêu. 

Mục đích của “chỉ mục” là xác định mục đích đầu ra trong giao dịch trước đó. Nếu bạn là người nhận trước giao dịch, bạn phải cung cấp chữ ký của mình để tuyên bố rằng bạn là chủ sở hữu hợp pháp của khóa công khai mà giao dịch đã được thực hiện. Cái này sẽ cho phép bạn chi tiêu giao dịch đó. Ngoài ra, bạn phải cung cấp khóa này sẽ băm thành địa chỉ được sử dụng làm địa chỉ đích trước đó Giao dịch. Tập lệnh đầu vào còn được gọi là ScriptSig. Cuối cùng mục tiêu của tập lệnh là đẩy các chữ ký và khóa lên ngăn xếp

Bây giờ chúng ta hãy xem xét một đại diện khác của cùng một cấu trúc giao dịch mà chúng ta đã thảo luận trong phần trước. Đây là để xem cái nhìn chi tiết hơn về cấu trúc giao dịch và các các thành phần của nó. Bây giờ hãy tham khảo Hình  3-21

Hình 3-21. Các thành phần chi tiết của giao dịch Bitcoin

Như bạn có thể thấy trong hình trước, các mục dữ liệu như chữ ký hoặc các khóa công khai đều được nhúng bên trong các tập lệnh và là một phần của sự giao dịch. Chỉ bằng cách nhìn vào các thành phần chi tiết của Bitcoin giao dịch, nhiều truy vấn của bạn sẽ được trả lời trước. Các các hướng dẫn trong tập lệnh được đẩy vào ngăn xếp và được thực thi, chúng tôi sẽ khám phá chi tiết ngay sau đây. Khi các nút Bitcoin nhận được các chương trình phát sóng giao dịch, tất cả chúng đều xác thực các giao dịch đó một cách riêng lẻ, bằng cách kết hợp tập lệnh đầu ra của giao dịch trước với tập lệnh đầu vào của giao dịch hiện tại theo các bước được đề cập như sau:

  • Tìm giao dịch trước đó có đầu ra là được sử dụng làm đầu vào để thực hiện giao dịch này. “Trước đó. Txn Trường ID (Hash) ”chứa hàm băm của trường trước đó Giao dịch.
  • Trong kết quả giao dịch trước đó, hãy tìm chính xác chỉ mục nơi số tiền đã được nhận. Có thể là nhiều người nhận trong một giao dịch, vì vậy chỉ số là được sử dụng để xác định người khởi tạo giao dịch hiện tại này có địa chỉ đã được sử dụng làm người nhận trong lần trước Giao dịch
  • Sử dụng tập lệnh đầu ra được sử dụng trong phần trước giao dịch sử dụng Tập lệnh mở khóa được gọi là ” ScriptSig .” Lưu ý trong Hình  3-21 rằng có một trường trước nó chỉ định độ dài của Mở khóa này Kịch bản.
  • Kết hợp tập lệnh đầu ra này với tập lệnh đầu vào chỉ bằng nối nó để tạo thành tập lệnh xác thực và thực thi tập lệnh xác thực này (hãy nhớ rằng đây là một tập lệnh dựa trên ngăn xếp ngôn ngữ kịch bản).
  • Giá trị số tiền thực sự có trong Đầu ra Script, tức là “ ScriptPubKey ”. Nó là tập lệnh khóa khóa đầu ra giao dịch với chi tiêu điều kiện và đảm bảo rằng chỉ chủ sở hữu hợp pháp của địa chỉ Bitcoin mà giao dịch này có đã được thực hiện sau đó có thể yêu cầu nó. Quan sát rằng nó cũng có trường Độ dài Tập lệnh Khóa ngay trước nó. Vì giao dịch hiện tại, tập lệnh đầu ra này chỉ dành cho thông tin và đóng vai trò của nó trong tương lai khi chủ sở hữu cố gắng chi tiêu nó.
  • Nó là tập lệnh xác thực quyết định nếu hiện tại đầu vào giao dịch có quyền chi tiêu trước UTXO bằng cách xác thực chữ ký. Nếu xác nhận script chạy thành công, nó được xác nhận rằng giao dịch hợp lệ và giao dịch đã được thực hiện. Hãy để chúng tôi khám phá lời giải thích trước thông qua một sơ đồ đại diện để hiểu rõ hơn. 

Giả sử rằng Alice đang thanh toán Bob, giả sử, năm BTC. Điều này có nghĩa là Alice đã nhận được 5BTC ở một trong những các giao dịch trước đó đã bị khóa bằng ScriptPubKey . Alice có thể tuyên bố rằng cô ấy là chủ sở hữu hợp pháp của giao dịch đó bằng cách mở khóa nó bằng ScriptSig và có thể dành nó cho Bob. Tương tự, bây giờ nếu Bob cố gắng chi tiêu ba BTC cho Charlie và hai BTC cho chính anh ấy, sau đó đây là cách nó sẽ trông như thế nào

Hình 3-22. Một ví dụ thực tế về tập lệnh Bitcoin

Khi mạng Bitcoin, chính xác hơn là những người khai thác, nhận được giao dịch từ Alice, họ kiểm tra và xác nhận rằng đó là giao dịch hợp lệ và phê duyệt nó bằng cách đưa nó vào các khối của họ (tốt, người đề xuất

khối hiện nó). Khi điều đó xảy ra, đầu ra của giao dịch này trở thành một phần của UTXO nhân danh Bob, người sau này có thể sử dụng nó. Và điều này là những gì xảy ra trong ví dụ của chúng tôi — Bob cũng dành nó cho Charlie. Bob đã làm vì vậy bằng cách sử dụng giao dịch trước đó, mở khóa nó bằng chữ ký của anh ấy và khóa công khai, để chứng minh rằng anh ta là chủ sở hữu của địa chỉ Bitcoin mà Alice đã sử dụng. Quan sát rằng có hai đầu ra trong giao dịch của Bob.

Vì anh ấy đã nhận được năm BTC từ Alice và đang trả ba BTC cho Charlie, anh ấy phải chuyển phần còn lại cho chính mình để nó trở thành hài BTC UTXO liên kết với chính Bob và anh ấy có thể tiêu nó trong tương lai. Trong giao dịch của Bob, ba BTC cho Charlie bị khóa bằng cách sử dụng khóa kịch bản chỉ để Charlie sử dụng sau này.Bây giờ bạn có đang nghĩ về cách các tập lệnh được kết hợp và cùng thực hiện? Hãy nhớ rằng tập lệnh mở khóa của hiện tại giao dịch được chạy cùng với tập lệnh khóa của giao dịch trước đó.

Như đã thảo luận, chạy các tập lệnh là công việc của người khai thác và họ không xảy ra tại phần mềm ví. Trong ví dụ trước, khi Bob thực hiện các giao dịch, thợ đào thực hiện tập lệnh mở khóa ScriptSig từ Bob’s giao dịch và sau đó thực hiện khóa ScriptPubKey ngay lập tức tập lệnh từ giao dịch của Alice theo thứ tự. Nếu thực hiện tuần tự trong một thời trang dựa trên ngăn xếp để tập lệnh xác thực kết hợp chạy thành công bằng cách trả về TRUE, khi đó giao dịch của Bob được tất cả các nút loại trừ xác nhận nó. 

Chúng ta sẽ xem xét các tập lệnh Bitcoin và cách một Bitcoin- máy ảo script thực thi ngăn xếp trong quá trình thực thi các lệnh script kết hợp chi tiết hơn trong phần sau. Trong này tuy nhiên, hãy xem ví dụ sau đại diện cho giao dịch từ quan điểm của nhà phát triển:

Example code with just one input and one output
{
"hash": "a320ba8bbe163f26cafb2092306c153f87c1c2609b25db0
c13664ae1afca78ce",
"ver": 1,
"vin_sz": 1,
"vout_sz": 1,
"lock_time": 0,
"size": 51,
"in":

{
"prev_out":{
"hash":"83cd5e9b704c0a4cb6066e3a1642b483adc8f73a76
791c82a73dfa381281d32f",
"n":0
},
"scriptSig":"63883d3d2dea35029d17d25b8a926675def004
5c397d3df55b0ae145ef80db7849599b930220ab13bd2dda2
ca0a67e2c5cd28030bb9b7b3dcacf176652dac82fe9d5873
f3409661281d32f6d35b46906cd562bf8b48f4f938c077bcb
29d46b0560fa5c61813d3d2d"
}
],
"out":[
{
"value":"0.08",
"scriptPubKey":"OP_DUP OP_HASH160 b3a2c0d84ec82cff 932b5c3231567a0d48ab4c78
OP_EQUALVERIFY OP_CHECKSIG"
}
]
}

Tập lệnh

Một tập lệnh thực sự là một danh sách các hướng dẫn được ghi lại với mỗi giao dịch mô tả cách người tiếp theo có thể truy cập vào những Bitcoin đã nhận được và chi tiêu chúng. Bitcoin sử dụng tập lệnh hoàn chỉnh dựa trên ngăn xếp, không Turing ngôn ngữ nơi các hướng dẫn được xử lý từ trái sang phải. 

Giữ trong lưu ý rằng nó không phải là hoàn chỉnh theo thiết kế! Chúng ta đã xem xét các tập lệnh đầu vào và đầu ra trong phần trước. chúng tôi bây giờ nhận thức được rằng tập lệnh đầu vào ScriptSig là tập lệnh mở khóa và có hai thành phần, khóa công khai và chữ ký. Khóa công khai được sử dụng bởi vì nó băm thành địa chỉ Bitcoin mà giao dịch đã được chi tiêu trong giao dịch trước đó. 

Mục đích của chữ ký số ECDSA là để chứng minh quyền sở hữu khóa công khai, do đó địa chỉ Bitcoin sẽ có thể chi tiêu nó hơn nữa. Tương tự, tập lệnh đầu ra ScriptPubKey trong giao dịch trước đó là khóa giao dịch cho chủ sở hữu hợp pháp của địa chỉ Bitcoin. Hai tập lệnh này, ScriptSig của giao dịch hiện tại và ScriptPubKey của giao dịch trước đó, được kết hợp và chạy. Hãy xem ở diện mạo của nó sau khi chúng được kết hợp với nhau (Hình  3-23).

Hình 3-23. Hình thành tập lệnh xác thực kết hợp

Như chúng ta đã tìm hiểu, điều quan trọng cần lưu ý là tập lệnh Bitcoin hoặc chạy thành công hoặc không thành công. Khi các giao dịch hợp lệ, nó chạy thành công mà không có bất kỳ lỗi nào. Ngôn ngữ kịch bản bitcoin là một ngôn ngữ rất phiên bản đơn giản của ngôn ngữ lập trình và khá nhỏ, với chỉ có 256 hướng dẫn trong tổng số. Trong số 256 người này, 15 người bị vô hiệu hóa và 75 người bị được giữ lại có thể để sử dụng sau này. Những hướng dẫn cơ bản này bao gồm toán học, logic (if / then), báo cáo lỗi và chỉ trả về các câu lệnh. Ngoài những điều này, có một số hướng dẫn mật mã bổ sung chẳng hạn như băm, xác minh chữ ký, v.v. Chúng tôi sẽ không đi sâu vào tất cả các bộ hướng dẫn có sẵn và chỉ tập trung vào những bộ chúng tôi sẽ sử dụng trong chương. Sau đây là một số:

  • OP_DUP : Nó chỉ sao chép mục trên cùng trong ngăn xếp.
  • OP_HASH160 : Nó băm hai lần, lần đầu với SHA256 và thì RIPEMD160.
  • OP_EQUALVERIFY : Nó trả về TRUE nếu các đầu vào được so khớp và nếu không thì FALSE và đánh dấu giao dịch không hợp lệ.
  • OP_CHECKSIG : Kiểm tra xem chữ ký đầu vào có hợp lệ không chữ ký bằng cách sử dụng chính Khóa công khai đầu vào cho hàm băm của giao dịch hiện tại.

Để thực hiện các hướng dẫn này, chúng tôi chỉ cần đẩy các hướng dẫn này vào ngăn xếp và sau đó thực thi. Ngoài bộ nhớ mà ngăn xếp mất, không cần thêm bộ nhớ và điều này làm cho các tập lệnh Bitcoin Có hiệu quả. 

Xem thêm Lý do blogger tập trung vào SEO

Như bạn đã thấy, có hai loại hướng dẫn trong tập lệnh, một là hướng dẫn dữ liệu và một là mã quang. Danh sách dấu đầu dòng trước các mục nhập đều là mã opcodes và tập lệnh xác thực kết hợp mà chúng tôi đã thấy trước khi có cả hai loại hướng dẫn này. 

Hướng dẫn dữ liệu chỉ là để đẩy dữ liệu lên ngăn xếp và không thực sự thực hiện bất kỳ chức năng nào và mục đích duy nhất của mã opcodes là thực thi một số chức năng trên dữ liệu trong ngăn xếp và bật ra nếu có. Hãy để chúng tôi thảo luận về cách giao dịch của Bob sẽ được thực thi với một triển khai dựa trên ngăn xếp như vậy. Hồi tưởng tập lệnh kết hợp trong đó Bob đang cố gắng sử dụng giao dịch trong giao dịch hiện tại với Charlie (Hình  3-24 ).

Hình 3-24. Tập lệnh kết hợp của ScriptPubKey và CheckSig

Triển khai dựa trên ngăn xếp tương ứng sẽ như sau(Hình  3-25).

Hình 3-25. Ví dụ về triển khai dựa trên ngăn xếp của tập lệnh Bitcoin

Mặc dù việc triển khai dựa trên ngăn xếp trước đó là tự giải thích, chúng ta sẽ nhanh chóng xem qua những gì đã xảy ra ở đây.

  • Đầu tiên là chữ ký của Bob – một hướng dẫn dữ liệu và vì vậy đẩy lên ngăn xếp
  • Sau đó là khóa công khai của anh ấy – lại là hướng dẫn dữ liệu và được đẩy lên ngăn xếp
  • Sau đó, nó là OP_DUP, một opcode. Nó sao chép mục đầu tiên trong ngăn xếp, vì vậy khóa công khai của Bob là nhân đôi và trở thành mục thứ ba trên ngăn xếp.
  • Tiếp theo là OP_HASH160, một Opcode, được băm Khóa công khai của Bob hai lần, một lần với SHA256 và sau đó với RIPEMD160 và đầu ra 160 bit cuối cùng được thay thế Khóa công khai của Bob và trở thành đỉnh của ngăn xếp.
  • Sau đó, đó là địa chỉ Bitcoin của Bob (160 bit) –một dữ liệu hướng dẫn, đã được đẩy vào ngăn xếp.
  • Tiếp theo là mã opcode, OP_EQUALVERIFY, kiểm tra hai mục hàng đầu trong ngăn xếp và nếu chúng khớp nhau, nó sẽ bật ra cả hai đều khác một lỗi được ném ra và tập lệnh sẽ chấm dứt.
  • Sau đó lại là mã opcode OP_CHECKSIG, kiểm tra khóa công khai so với chữ ký để xác thực tính xác thực của chủ sở hữu. Mã opcode này cũng là có khả năng tiêu thụ cả đầu vào và đưa chúng vào ra khỏi ngăn xếp.

Bạn phải tự hỏi điều gì nếu ai đó cố gắng tiêm một số các kịch bản gian lận hoặc cố gắng sử dụng sai. Xin lưu ý rằng các tập lệnh Bitcoin được tiêu chuẩn hóa và các thợ mỏ nhận thức được chúng. Bất cứ điều gì không tuân theo tiêu chuẩn sẽ bị các thợ đào bỏ qua, vì họ sẽ không lãng phí thời gian của họ khi thực hiện các giao dịch đó.

Các nút đầy đủ so với SPV

Chúng ta đã có thông báo về các nút đầy đủ và SPV trong chương này. Nó là rõ ràng rằng khái niệm về nút đầy đủ và nút nhẹ được triển khai để giảm bớt việc sử dụng Bitcoin và làm cho chúng dễ thích ứng hơn. Trong này , chúng tôi sẽ phóng to các tính năng kỹ thuật cho các biến thể này và hiểu Mục đích của họ.

Cây đầy đủ

Các nút đầy đủ là các thành phần không thể thiếu trong mạng Bitcoin. Họ là những người duy trì và chạy Bitcoin từ nhiều nơi khác nhau toàn cầu. Như đã thảo luận, hãy tải xuống toàn bộ blockchain với tất cả các giao dịch, bắt đầu tất cả các cách từ khối gốc cho đến mới nhất khối phát hiện. 

Khối mới nhất xác định chiều cao của blockchain. Các nút đầy đủ cực kỳ an toàn vì chúng có toàn bộ chuỗi. Để kẻ thù thành công trong việc gian lận một nút, một giải pháp thay thế blockchain cần phải được trình bày, điều này thực tế là không thể. Các true chain là chuỗi PoW tích lũy nhiều nhất và nó được tính toán không khả thi để đề xuất một khối gian lận mới. Nếu tất cả các giao dịch không hợp lệ trong một khối, khai thác PoW do đối thủ thực hiện sẽ ở

vô ích, bởi vì những người khai thác khác sẽ không khai thác trên nó. Một khối như vậy được mồ côi sớm. Các nút đầy đủ xây dựng và duy trì bản sao của riêng chúng của blockchain cục bộ. Họ không dựa vào mạng để giao dịch xác nhận bởi vì họ tự cung cấp. Họ chỉ quan tâm đến biết các khối mới được đề xuất bởi các nút khác để chúng có thể cập nhật bản sao cục bộ của họ sau khi xác thực khối. 

Vì vậy, chúng tôi đã học được rằng mỗi nút phải xử lý tất cả các giao dịch; họ phải lưu trữ toàn bộ cơ sở dữ liệu, mọi giao dịch hiện đang được phát sóng, mọi giao dịch đã từng được chi tiêu và danh sách các UTXO; tham gia vào việc duy trì toàn bộ Mạng bitcoin; và họ cũng phải phục vụ các khách hàng SPV Lưu ý rằng có rất nhiều biến thể của phần mềm Bitcoin mà các nút đầy đủ sử dụng khá khác nhau về kiến ​​trúc phần mềm và được lập trình bằng các cấu trúc ngôn ngữ khác nhau. Tuy nhiên, rộng rãi nhất đã sử dụng một là phần mềm “Bitcoin Core”; hơn ba phần tư của mạng sử dụng nó

Cây SPV

Thiết kế Bitcoin có khái niệm hay về Xác minh thanh toán đơn giản (SPV) các nút có thể được sử dụng để xác minh các giao dịch mà không cần chạy các nút đầy đủ. Cách hoạt động của SPV là chúng chỉ tải xuống tiêu đề của tất cả các khối trong quá trình đồng bộ hóa ban đầu với mạng Bitcoin. 

Trong Bitcoin, khối tiêu đề có kích thước 80 byte mỗi tiêu đề và việc tải xuống tất cả các tiêu đề không nhiều và có tổng cộng khoảng vài MB. Mục đích của SPV là cung cấp một cơ chế để xác minh rằng giao dịch cụ thể nằm trong một khối trong chuỗi khối mà không yêu cầu toàn bộ dữ liệu blockchain. Mọi tiêu đề khối đều có gốc Merkle, là khối băm. Chúng tôi biết rằng mọi giao dịch đều có hàm băm và giao dịch đó băm có thể được liên kết với băm khối bằng cách sử dụng bằng chứng cây Merkle mà chúng tôi đã thảo luận trong chương trước. 

Tất cả các giao dịch trong một khối tạo thành các lá Merkle và băm khối tạo thành gốc Merkle. Cái hay của cây Merkle là chỉ cần một phần nhỏ của khối để chứng minh rằng một giao dịch thực sự là một phần của khối. Vì vậy, để xác nhận một giao dịch một SPV thực hiện hai điều. Đầu tiên, nó kiểm tra bằng chứng cây Merkle cho một giao dịch để xác định nó là một phần của khối và thứ hai, nếu khối đó có phải là một phần của chuỗi chính hay không; và phải có ít nhất sáu các khối được tạo sau nó để xác nhận nó là một phần của chuỗi dài nhất. Hình  3-26 mô tả quá trình này

Hình 3-26. Merkle root trong tiêu đề khối của SPV

Hãy để chúng tôi tìm hiểu sâu hơn về tính kỹ thuật của cách SPV thực sự hoạt động xác minh giao dịch. Ở cấp độ cao, nó thực hiện theo các bước sau:

  • Đối với các đồng nghiệp mà một SPV được kết nối, nó thiết lập Bloom bộ lọc với nhiều người trong số họ và lý tưởng là không chỉ cho một ứng dụng ngang hàng, bởi vì có thể có cơ hội để đồng nghiệp đó thực hiện từ chối dịch vụ hoặc gian lận. Mục đích của bộ lọc Bloom là chỉ khớp với các giao dịch mà SPV quan tâm trong, chứ không phải phần còn lại trong một khối mà không tiết lộ địa chỉ hoặc khóa mà SPV quan tâm.
  • Đồng đẳng gửi lại các giao dịch có liên quan trong một thông báo merkle block có chứa gốc Merkle và đường dẫn Merkle đến giao dịch quan tâm như được hiển thị trong hình trên. Các merkle block Size nhắn là trong một ít kB và khá hiệu quả.
  • Sau đó, SPV có thể dễ dàng xác minh xem một giao dịch có thực sự hay không thuộc về một khối trong chuỗi khối.
  • Sau khi giao dịch được xác minh, bước tiếp theo là kiểm tra xem Khối đó có thực sự là một phần của khối dài nhất thực sự hay không chuỗi khối

Sau đây (Hình  3-27 ) mô tả các bước giao tiếp SPV này với các đồng nghiệp của nó

Hình 3-27. Cơ chế giao tiếp SPV với Bitcoin mạng

Ví bitcoin

Ví bitcoin rất giống với ví bạn sử dụng trong cuộc sống hàng ngày, trong cảm giác bạn có quyền truy cập vào nó và bạn có thể chi tiêu khi bạn muốn. Bitcoin Tuy nhiên, ví là một hiện tượng kỹ thuật số. 

Nhớ lại ví dụ chúng ta được sử dụng trong phần trước, nơi Alice đã trả một số tiền cho Bob. Thế nào cô ấy sẽ làm điều đó nếu Bob không có tài khoản? Trong cài đặt Bitcoin, tài khoản hoặc ví được đại diện bằng địa chỉ Bitcoin. Bob phải đầu tiên tạo một cặp khóa (khóa riêng tư / khóa công khai). 

Bitcoin sử dụng ECDSA thuật toán với đường cong secp256k1 (đừng lo lắng, nó chỉ là loại đường cong — a khuyến nghị tiêu chuẩn). Đầu tiên, một chuỗi bit ngẫu nhiên được tạo để đóng vai trò là khóa riêng tư, sau đó được chuyển đổi một cách xác định thành khóa công khai. Như chúng ta đã tìm hiểu trước đây trong phần trước, khóa riêng tư / công khai có liên quan về mặt toán học và khóa công khai có thể được tạo từ khóa cá nhân bất kỳ lúc nào (xác định). 

Vì vậy, nó không thực sự là một yêu cầu lưu các khóa công khai. như vậy. Sự ngẫu nhiên thực sự không thể thông qua triển khai phần mềm, vì vậy nhiều máy chủ hoặc ứng dụng sử dụng phần cứng mô-đun bảo mật (HSM) để tạo ra các bit ngẫu nhiên thực sự và cũng để bảo vệ các khóa riêng. Không giống như khóa công khai, khóa cá nhân chắc chắn yêu cầu lưu chúng với bảo mật tối đa. 

Nếu bạn mất chúng, bạn không thể tạochữ ký sẽ chứng minh quyền sở hữu khóa công khai (hoặc Bitcoin địa chỉ) đã nhận được một số tiền trong bất kỳ giao dịch nào. Các khóa công khai được băm hai lần để tạo địa chỉ Bitcoin, đầu tiên với SHA256 và sau đó với RIPEMD160. 

Điều này cũng mang tính xác định, do đó, với một khóa công khai, nó chỉ là vấn đề của một vài băm để tạo địa chỉ Bitcoin. Lưu ý cẩn thận rằng địa chỉ Bitcoin không thực sự tiết lộ công khai Chìa khóa. Điều này là do các địa chỉ là khóa công khai được băm kép và nókhá khó tìm thấy khóa công khai được cung cấp cho địa chỉ Bitcoin. Tuy vậy, đối với người có khóa công khai, thật dễ dàng để xác nhận quyền sở hữu Bitcoin Địa chỉ. 

Kỹ thuật băm trong Bitcoin rút ngắn và làm xáo trộn khóa công khai . Mặc dù nó làm cho việc phiên âm thủ công dễ dàng hơn, nó cũng cung cấp bảo mật chống lại các vấn đề không lường trước có thể cho phép xây dựng lại khóa cá nhân từ khóa công khai s. Đây có thể là cách thực hiện an toàn nhất! Khóa công khai chỉ được tiết lộ khi đầu ra giao dịch đang được xác nhận bởi chủ sở hữu, không phải khi nó được giao dịch với họ, như bạn có thể thấy trong

Hình 3-28. Tiết lộ khóa công khai để xác nhận một giao dịch

Ví bitcoin không là gì khác ngoài SPV và được cung cấp đầy đủ điểm giao. Chúng tôi đã xem xét hoạt động của SPV, vì vậy trong phần này, chúng tôi sẽ xem xét một số hoạt động dành riêng cho ví. 

Tất cả chúng ta đều hiểu điều đó để thực hiện một giao dịch hoặc để nhận một giao dịch, bạn không cần phải chạy một nút đầy đủ. Tất cả những gì bạn muốn là một chiếc ví để có thể lưu khóa cá nhân / công khai của bạn ghép nối, để có thể thực hiện và nhận các giao dịch (thực sự xem và xác minh những cái dành cho bạn). Chúng tôi đã học phần xác minh trong khi đi thông qua phần SPV. Hãy để chúng tôi xem cách bắt đầu một giao dịch sử dụng ví.

Bạn nên chạy nút đầy đủ của riêng mình và kết nối ví của bạn đối với nó, vì nó sẽ là cách hoạt động an toàn nhất trên Bitcoin. Tuy vậy, nó không phải là một nhiệm vụ và bạn vẫn có thể làm việc mà không cần duy trì nút. Hãy nhớ rằng khi bạn truy vấn một nút, bạn phải đề cập đếnđịa chỉ công cộng của bạn để nhận danh sách các UTXO và nút đầy đủ đang trở thành biết địa chỉ công cộng của bạn, đó là một rò rỉ quyền riêng tư!

Tất cả những gì một chiếc ví phải làm là lấy danh sách các UTXO để nó có thể chi tiêu một giao dịch bằng cách ký tên vào khóa cá nhân và xuất bản giao dịch đó vào mạng Bitcoin. Cái này có thể được thực hiện bằng cách tạo phần mềm ví của riêng bạn hoặc bằng cách sử dụng bên thứ badịch vụ ví. Tuy nhiên, hãy cẩn thận với các nhà cung cấp dịch vụ ví bởi vì bạn đang cho phép họ kiểm soát khóa cá nhân của bạn. Cho dù

họ cố tình lấy Bitcoin của bạn hoặc chính họ bị tấn công, điều này Đã xảy ra trường hợp với nhiều dịch vụ ví, bạn sẽ mất Bitcoin của mình. Tại vào cuối ngày, tất cả các nhà cung cấp dịch vụ ví đều tập trung mạng Bitcoin được phân cấp. Một đại diện hình ảnh điển hình bắt đầu giao dịch Bitcoin thông qua phần mềm ví có thể được biểu diễn như sau (Hình  3-29)

Ví dụ về một ứng dụng SPV có thể hoạt động như một ví Bitcoin là “BitcoinJ”. BitcoinJ thực sự là một thư viện để làm việc với giao thức Bitcoin,duy trì ví và bắt đầu / xác thực giao dịch. Nó không yêu cầu một nút đầy đủ, chẳng hạn như nút Bitcoin Core cục bộ và có thể hoạt động như một nút mỏng nút khách hàng. Mặc dù nó được triển khai bằng Java, nó có thể được sử dụng từ bất kỳ JVM- ngôn ngữ tương thích như JavaScript và Python

Leave a Reply

Call now
%d bloggers like this: