Bitcoin đôi khi được gọi là tiền tệ có thể lập trình. Bản chất kỹ thuật số của nó mang lại cho người dùng rất nhiều sự linh hoạt trong việc đặt ra các điều kiện về cách sử dụng tiền của họ
Khi thảo luận về Bitcoin, chúng ta sẽ đề cập đến ví và mã thông báo. Nhưng chúng ta cũng có thể coi ví là chìa khóa, mã thông báo là séc và chuỗi khối là hàng dãy két sắt bị khóa. Mỗi chiếc két sắt đều có một khe nhỏ để bất kỳ ai cũng có thể gửi séc hoặc xem giá trị trong két là bao nhiêu. Tuy nhiên, chỉ có người giữ chìa khóa mới có thể mở khóa két sắt.
Nếu người giữ chìa khóa muốn đưa tiền cho người khác thì két sẽ được mở. Họ sẽ viết một tấm séc mới tham chiếu đến tấm séc cũ (sau đó sẽ bị hủy) và khóa nó vào một chiếc hộp mà người nhận thanh toán có thể mở. Để tiêu tiền, người nhận mới cần lặp lại quy trình.
Trong bài viết này, chúng ta sẽ xem xét kỹ hơn về tập lệnh, một ngôn ngữ lập trình được giải thích bởi các nút trên mạng Bitcoin. Kịch bản quản lý cơ chế khóa/mở khóa của két sắt đã đề cập trước đó.
Sử dụng phép tương tự ở trên, chúng ta có thể nói rằng mọi giao dịch đều có hai phần - chìa khóa (dùng để mở khóa két) và khóa. Bạn cần có chìa khóa để mở hộp chứa séc bạn muốn gửi, sau đó thêm séc mới vào hộp mới có khóa khác. Để tiêu tiền bên trong rương mới, bạn cần có một chiếc chìa khóa khác.
Đơn giản thế thôi. Có thể có một số biến thể về loại ổ khóa trong hệ thống. Một số két yêu cầu bạn cung cấp nhiều chìa khóa, một số két khác yêu cầu bạn chứng minh rằng bạn biết sự kết hợp và có nhiều điều kiện bạn có thể đặt.
Khóa của chúng tôi được gọi là scriptSig và khóa là cái mà chúng tôi gọi là scriptPubKey. Nếu chúng ta xem xét các thành phần này chi tiết hơn, chúng ta sẽ thấy rằng chúng thực sự được tạo thành từ các bit dữ liệu và khối mã. Khi chúng được kết hợp lại, chúng tạo thành một chương trình nhỏ.
Khi bạn thực hiện giao dịch, bạn đang phát sóng sự kết hợp đó lên mạng. Mỗi nút nhận giao dịch này sẽ kiểm tra chương trình này, chương trình này sẽ cho nút biết liệu giao dịch này có hợp lệ hay không. Nếu không hợp lệ, giao dịch sẽ bị hủy và bạn sẽ không thể sử dụng số tiền bị khóa.
Séc (mã thông báo) mà bạn nắm giữ được gọi là Đầu ra giao dịch chưa chi tiêu (UTXO). Bất kỳ ai cũng có thể truy cập vào quỹ miễn là họ cung cấp khóa khớp với khóa. Cụ thể key là scriptSig và khóa là scriptPubKey.
Nếu UTXO có trong ví của bạn, chúng có thể có điều kiện chỉ người có thể chứng minh quyền sở hữu khóa chung đó mới có thể mở khóa tiền. Để mở khóa tiền, bạn cần cung cấp scriptSig chứa chữ ký điện tử, sử dụng khóa riêng được ánh xạ tới khóa chung được chỉ định trong scriptPubKey. Mọi thứ sẽ sớm trở nên rõ ràng.
Tập lệnh là ngôn ngữ dựa trên ngăn xếp. Điều này có nghĩa là khi chúng ta đọc một bộ hướng dẫn, chúng ta đặt chúng vào các cột được coi là dọc. Ví dụ: danh sách A, B, C sẽ tạo ra một ngăn xếp có A ở dưới cùng và C ở trên cùng. Khi một lệnh yêu cầu chúng ta làm điều gì đó, chúng ta thao tác trên một hoặc nhiều phần tử bắt đầu từ đầu ngăn xếp.
Các phần tử A, B và C được thêm vào và xóa khỏi ngăn xếp "Bật lên".
Chúng tôi có thể phân biệt giữa dữ liệu (chẳng hạn như chữ ký, hàm băm và khóa chung) và hướng dẫn (hoặc mã hoạt động) . Hướng dẫn xóa dữ liệu và xử lý. Đây là một ví dụ về tập lệnh rất đơn giản:
<xyz> ; <md5 hasher> <d16fb36f0911f878998c136191af705e> <kiểm tra xem có bằng không>
Phần màu đỏ tượng trưng cho dữ liệu và phần màu xanh tượng trưng cho mã hoạt động. Chúng tôi đọc từ trái sang phải, vì vậy trước tiên chúng tôi đặt chuỗi <xyz> trên ngăn xếp cấp trên . Tiếp theo là mã hoạt động <md5 hasher>. Mã hoạt động này không tồn tại trong Bitcoin nhưng chúng tôi giả định rằng nó loại bỏ phần tử ở đầu ngăn xếp (<xyz> mạnh >) và được băm bằng thuật toán MD5. Đầu ra sau đó được thêm trở lại ngăn xếp. Đầu ra ở đây là d16fb36f0911f878998c136191af705e.
Thật là trùng hợp! Phần tử tiếp theo mà chúng tôi muốn thêm là <d16fb36f0911f878998c136191af705e>, vì vậy bây giờ ngăn xếp của chúng tôi có hai phần tử giống hệt nhau . Cuối cùng, <kiểm tra xem bằng nhau> đặt hai phần tử lên trên cùng và kiểm tra xem chúng có bằng nhau không. Nếu bằng nhau, hãy thêm <1> vào ngăn xếp. Nếu không bằng, hãy thêm <0> vào ngăn xếp.
Chúng ta đã đến cuối danh sách lệnh. Tập lệnh của chúng tôi có thể bị lỗi theo hai cách - nếu các phần tử còn lại bằng 0 hoặc nếu một số điều kiện không được đáp ứng, một trong các toán tử sẽ khiến tập lệnh đó bị lỗi. Trong ví dụ này, chúng ta không có bất kỳ toán tử nào như vậy và kết thúc bằng phần tử khác 0 (<1>), vậy tập lệnh của chúng ta hợp lệ. Những quy tắc này cũng áp dụng cho các giao dịch Bitcoin thực.
Ví dụ trên chỉ là một chương trình hư cấu. Bây giờ chúng ta hãy xem xét một số ví dụ thực tế.
Thanh toán cho Khóa công khai (P2PK) rất đơn giản. Nó được thiết kế để khóa tiền vào một khóa công khai cụ thể. Nếu bạn muốn nhận tiền theo cách này, bạn cần cung cấp cho người gửi khóa công khai chứ không phải địa chỉ Bitcoin của bạn.
Giao dịch đầu tiên giữa Satoshi Nakamoto và Hal Finney vào năm 2009 là giao dịch P2PK. Cấu trúc này được sử dụng nhiều trong những ngày đầu của Bitcoin, nhưng ngày nay, Băm thanh toán cho khóa công khai (P2PKH) đã thay thế phần lớn cấu trúc này.
Tập lệnh khóa cho các giao dịch P2PK tuân theo <public key> OP_CHECKSIG định dạng. Nó đơn giản mà. Như bạn có thể đoán, OP_CHECKSIG kiểm tra chữ ký dựa trên khóa chung được cung cấp. Do đó, scriptSig của chúng ta sẽ là một <signature> đơn giản. Hãy nhớ rằng, scriptSig là chìa khóa mở khóa.
Không có gì đơn giản hơn thế này. Chữ ký được thêm vào ngăn xếp, theo sau là khóa chung.OP_CHECKSIGBật lên chữ ký và khóa chung cùng lúc và xác minh chữ ký dựa trên trên khóa chung. Nếu chúng khớp nhau, hãy gửi Thêm<1> vào ngăn xếp. Nếu không, hãy thêm <0>.
P2PK thực sự không còn được sử dụng vì những lý do mà chúng tôi sẽ trình bày chi tiết ở phần tiếp theo.
Thanh toán cho khóa công khai Hash (P2PKH) là loại giao dịch phổ biến nhất hiện nay. Trừ khi bạn cố gắng tải xuống phần mềm lỗi thời, ví của bạn rất có thể sẽ mặc định cho giao dịch này.
scriptPubKey của P2PKH như sau: p>
OP_DUP OP_HASH160 <băm khóa công khai> OP_EQUALVERIFY OP_CHECKSIG p>
Trong phần Trước khi giới thiệu scriptSig, trước tiên chúng ta hãy phân tích chức năng của opcode mới:
OP_DUP bật lên phần tử đầu tiên và Bản saophần tử. Sau đó, nó thêm cả hai trở lại ngăn xếp. Thông thường, việc này được thực hiện để thao tác trên bản sao mà không ảnh hưởng đến phần tử gốc.
Thao tác này sẽ lấy ra phần tử đầu tiên và băm nó hai lần. Vòng đầu tiên sẽ được băm bằng thuật toán SHA-256. Đầu ra SHA-256 sau đó được băm bằng thuật toán RIPEMD-160. Kết quả đầu ra được thêm trở lại ngăn xếp.
OP_EQUALVERIFY bao gồm hai toán tử khác là OP_EQUAL và OP_VERIFY. OP_EQUAL bật lên hai phần tử và kiểm tra xem chúng có giống nhau không. Nếu chúng giống nhau thì thêm 1 vào ngăn xếp. Nếu không giống nhau thì cộng thêm 0. OP_VERIFY bật phần tử trên cùng và kiểm tra xem nó có đúng không (nghĩa là không phải 0). Nếu không, giao dịch không thành công. Được kết hợp với nhau, OP_EQUALVERIFY sẽ khiến giao dịch không thành công nếu hai phần tử trên cùng không khớp.
Lần này, scriptSig trông như thế này:
<chữ ký> <khóa công khai>
Bạn cần có chữ ký cùng với khóa chung tương ứng để mở khóa đầu ra P2PKH.
Bạn có thể tìm hiểu thêm về nó thông qua ảnh GIF ở trên. Nó không khác mấy so với các tập lệnh P2PK. Chúng tôi vừa thêm một bước bổ sung để kiểm tra xem khóa chung có khớp với hàm băm trong tập lệnh hay không.
Tuy nhiên, có một điều cần lưu ý. Trong tập lệnh khóa P2PKH, khóa chung là vô hình – chúng ta chỉ có thể nhìn thấy hàm băm của nó. Nếu chúng ta truy cập trình khám phá blockchain và xem kết quả đầu ra của P2PKH chưa được chi tiêu, chúng ta sẽ không thể xác định khóa chung của nó. Nó chỉ được tiết lộ khi người nhận quyết định chuyển tiền.
Điều này có một số lợi ích. Đầu tiên là việc băm khóa công khai dễ truyền hơn khóa chung đầy đủ. Vì lý do này mà Satoshi Nakamoto đã giới thiệu phương pháp băm khóa công khai vào năm 2009. Băm khóa công khai là cái mà ngày nay chúng ta gọi là địa chỉ Bitcoin.
Lợi ích thứ hai là việc băm khóa công khai có thể cung cấp thêm một lớp bảo mật cho điện toán lượng tử. Vì khóa công khai của chúng tôi chỉ được biết sau khi chúng tôi tiêu tiền nên người khác sẽ khó tính được khóa riêng hơn. Họ phải đảo ngược hai vòng băm (RIPEMD-160 và SHA-256) để lấy khóa riêng.
➟ Bạn muốn bắt đầu hành trình tiền điện tử của mình? Hãy đến Binance và mua Bitcoin ngay bây giờ!
Trả tiền cho tập lệnh băm (P2SH) ) là một sự phát triển rất thú vị đối với Bitcoin. Nó cho phép người gửi khóa tiền vào hàm băm của tập lệnh – mà không cần biết tập lệnh thực sự làm gì. Lấy hàm băm SHA-256 sau đây làm ví dụ:
e145fe9ed5c23aa71fdb443de00c7d9b4a69f8a27a2e4fbb1fe1d0dbfb6583f1
Bạn không cần phải biết hàm băm Enter để khóa tiền. Tuy nhiên, người chi tiền cần cung cấp tập lệnh được sử dụng để băm nó và phải đáp ứng các điều kiện của tập lệnh đó.
Mã băm ở trên được tạo bởi tập lệnh sau:
<nhân với 2> <4> <kiểm tra xem có bằng không>
Nếu bạn muốn sử dụng mã thông báo được liên kết với scriptPubKey này, bạn không chỉ phải cung cấp các lệnh này . Bạn cũng cần scriptSig để giá trị của script hoàn thành là True. Trong ví dụ này, bạn<nhân với 2> để được<4>Các thành phần của kết quả. Tất nhiên, điều này có nghĩa là tập lệnh của chúng tôi chỉ là<2>.
Trong tình huống thực tế, đầu ra scriptPubKey của P2SH là:
OP_HASH160 <redeemScript hash> OP_EQUAL
Không có nhà điều hành mới nào ở đây. Tuy nhiên, chúng tôi có <redeemScript hash> làm phần tử mới. Như tên cho thấy, đây là hàm băm tập lệnh mà chúng tôi cần cung cấp cho số tiền cần đổi (gọi nó là redeemScript). scriptSig sẽ thay đổi dựa trên nội dung trong RedeeScript. Tuy nhiên, thông thường, bạn sẽ thấy đó là sự kết hợp giữa chữ ký và khóa chung được thêm vào, theo sau là (bắt buộc) redScript:
<chữ ký> <khóa chung> <redeemScript>
Tính toán của chúng tôi và ngăn xếp mà chúng tôi thấy cho đến nay Việc thực thi hơi chậm khác biệt. Nó được chia thành hai phần. Phần đầu tiên chỉ kiểm tra xem bạn đã cung cấp hàm băm chính xác chưa.
Bạn sẽ nhận thấy rằng chúng tôi không thực hiện bất kỳ thao tác nào trên các phần tử trước phần tử chuộcScript . Chúng sẽ không được sử dụng vào lúc này. Chúng ta đã đi đến phần cuối của chương trình nhỏ này và phần tử trên cùng khác 0. Đó là, nó hoạt động.
Nhưng chúng ta vẫn chưa xong đâu. Các nút mạng nhận ra cấu trúc này là P2SH, vì vậy chúng thực sự có các phần tử scriptSig đang chờ trên một ngăn xếp khác. Đây là nơi chữ ký và khóa công khai được sử dụng.
Cho đến nay, chúng ta đã coi RedemptionScript là một phần tử. Nhưng bây giờ, nó sẽ được hiểu là một mệnh lệnh, có thể là bất cứ thứ gì. Hãy lấy tập lệnh khóa P2PKH làm ví dụ. Chúng ta phải cung cấp cho nó cùng một strong><băm khóa công khai>Khớp<chữ ký> và<khóa công khai>.
Sau khi chuộcScript của bạn được gia hạn, bạn có thể thấy rằng tình huống của chúng tôi trông giống như P2PKH thông thường. giao dịch hoàn toàn giống nhau. Sau đó, bạn chỉ cần chạy nó như một chương trình bình thường.
Chúng tôi đã trình diễn cái gọi là tập lệnh P2SH (P2PKH), nhưng bạn khó có thể tìm thấy những tập lệnh như vậy trong tự nhiên. Không có gì ngăn cản bạn tạo một cái, nhưng nó sẽ không mang lại lợi ích gì cho bạn và cuối cùng sẽ chiếm nhiều không gian khối hơn (và do đó tốn kém hơn).
P2SH nhìn chung phù hợp với các tình huống như giao dịch đa chữ ký hoặc tương thích SegWit. Các giao dịch đa chữ ký có thể rất lớn vì chúng yêu cầu nhiều khóa. Trước khi thực hiện băm trả tiền theo tập lệnh, người gửi phải liệt kê tất cả các khóa chung có thể có trong tập lệnh khóa của họ.
Nhưng đối với P2SH, dù điều kiện tiêu dùng có phức tạp đến đâu cũng không có tác động. Hàm băm của RedScript luôn có kích thước cố định. Do đó, chi phí sẽ được chuyển cho người dùng muốn mở khóa tập lệnh bị khóa.
Khả năng tương thích SegWit là một ví dụ khác trong đó P2SH có thể hữu ích (chúng ta sẽ thảo luận chi tiết về sự khác biệt trong cấu trúc giao dịch trong phần tiếp theo). SegWit là một soft fork dẫn đến những thay đổi về định dạng khối/giao dịch. Vì đây là bản nâng cấp tùy chọn nên không phải tất cả phần mềm ví đều nhận ra những thay đổi này.
Điều này không thành vấn đề nếu khách hàng gói hàm băm tập lệnh SegWit trong P2SH. Giống như tất cả các giao dịch thuộc loại này, họ không cần biết RedemptionScript đã mở khóa là gì.
Để có phần giới thiệu toàn diện hơn về SegWit, vui lòng tham khảo"Hướng dẫn về SegWit cho người mới bắt đầu".
Để hiểu định dạng giao dịch trong SegWit, tất cả những gì bạn cần biết là chúng tôi không còn chỉ có scriptSig và scriptPubKey nữa. Bây giờ, chúng ta có một lĩnh vực mới gọi là "chứng kiến". Dữ liệu chúng tôi đã lưu trước đó trong scriptSig đã được chuyển đến nhân chứng, vì vậy scriptSig trống.
Nếu bạn đã từng gặp các địa chỉ bắt đầu bằng "bc1", thì đây là những gì chúng tôi gọi là SegWit gốc (chứ không phải tương thích với SegWit, vì chúng là địa chỉ P2SH nên chúng bắt đầu bằng "3" ;bắt đầu).
Thanh toán tới -Witness Public Key Hash (P2PKH) là phiên bản SegWit của P2PKH. Lời khai của chúng tôi như sau:
<signature> <khóa công khai>
Bạn sẽ nhận thấy rằng điều này giống với scriptSig trong P2PKH. Ở đây scriptSig trống. Đồng thời, scriptPubKey tương tự như sau:
<OP_0> span> <băm khóa công khai>
Điều này có vẻ kỳ lạ , Phải? Opcode cho phép chúng ta so sánh chữ ký, khóa chung và hàm băm của chúng ở đâu?
Chúng tôi không hiển thị các toán tử bổ sung ở đây vì nút nhận giao dịch dựa trên <băm khóa công khai> Độ dài của ; biết cách xử lý. Họ tính toán độ dài và hiểu rằng nó phải hoạt động giống như giao dịch P2PKH truyền thống.
Các nút không được nâng cấp không biết cách diễn giải các giao dịch theo cách này, nhưng điều đó không thành vấn đề. Theo quy định cũ, không có nhân chứng nên họ đọc một scriptSig trống và một số dữ liệu. Họ đánh giá nó và đánh dấu nó là hợp lệ - theo ý kiến của họ, bất kỳ ai cũng có thể sử dụng kết quả đầu ra. Đây là lý do tại sao SegWit được coi là một soft fork tương thích ngược.
Trả cho công chúng Key Hash (P2PKH) là P2SH mới. Nếu bạn đã đi xa đến mức này, có lẽ bạn có thể tìm ra cách nó hoạt động, nhưng dù sao chúng ta cũng sẽ xem xét nó. Nhân chứng của chúng tôi là những gì chúng tôi thường đưa vào scriptSig. Ví dụ: trong P2WSH gói một giao dịch P2PKH, nó có thể trông như thế này:
<chữ ký> <khóa công khai>
Đây là scriptPubKey của chúng tôi:
<OP_0> ; <băm khóa công khai>
Các quy tắc tương tự được áp dụng ở đây. Nút SegWit đọc độ dài của mã băm tập lệnh và xác định đó là đầu ra P2WSH, được đánh giá tương tự như P2SH. Trong khi đó, các nút cũ coi nó không hơn gì một sản phẩm đầu ra mà bất kỳ ai cũng có thể chi tiêu.
Trong bài viết này, chúng tôi có hiểu biết nhất định về các khối xây dựng của Bitcoin. Hãy tóm tắt nhanh:
Loại tập lệnh | Mô tả th> |
---|---|
Trả tiền bằng khóa công khai (P2PK) | Khóa tiền vào một Khóa công khai cụ thể |
Trả tiền cho hàm băm khóa công khai (P2PKH) | Khóa tiền vào hàm băm khóa công khai cụ thể (tức là địa chỉ) |
Thanh toán cho hàm băm tập lệnh (P2SH) | Khóa tiền vào một hàm băm của tập lệnh mà người nhận thanh toán có thể cung cấp |
Trả cho Băm khóa công khai được chứng kiến (P2PKH) | Phiên bản SegWit của P2PK |
Thanh toán cho Hash khóa công khai (P2PKH) | Phiên bản SegWit của P2SH |
Khi bạn tìm hiểu sâu hơn về Bitcoin, bạn sẽ bắt đầu hiểu tại sao nó lại có nhiều tiềm năng đến vậy. Một giao dịch có thể có nhiều thành phần khác nhau. Bằng cách thao tác các khối xây dựng này, người dùng có thể đặt ra các điều kiện về cách thức và thời điểm sử dụng tiền của họ một cách cực kỳ linh hoạt.