Giới thiệu về Bitcoin Script

0
1

Giới thiệu

Bitcoin đôi khi còn được gọi là đồng tiền có thể lập trình. Với bản chất là đồng tiền kỹ thuật số, Bitcoin cho phép người dùng linh hoạt đặt ra các điều kiện về cách chi tiêu tiền. 
Khi thảo luận về Bitcoin, chúng ta thường nhắc đến coin. Nhưng chúng ta cũng có thể coi ví là chìa khóa, coin là séc, còn blockchain là các két sắt nối tiếp nhau theo hàng. Mỗi két sắt đều có một khe nhỏ để bất kỳ ai cũng có thể nhét séc vào hoặc nhìn vào để xem giá trị trong két sắt là bao nhiêu. Tuy nhiên, chỉ người giữ chìa khóa mới có thể truy cập vào bên trong.

Khi người giữ chìa khóa muốn đưa tiền cho người khác, họ sẽ mở két sắt của mình. Họ viết một tấm séc mới tham chiếu tới tấm séc cũ (sau đó sẽ bị hủy), rồi cất séc mới vào một két sắt mà người nhận có thể mở. Để tiêu số tiền đó, người nhận mới sẽ 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ề Script, ngôn ngữ lập trình được diễn giải bởi các node trên mạng Bitcoin. Script chính là thứ chi phối cơ chế khóa/mở khóa két sắt mà chúng tôi đề cập ở trên.

Bitcoin hoạt động như thế nào?

Theo cách tương tự, bạn có thể nói rằng có hai phần trong mỗi giao dịch là – chìa khóa (để mở két sắt) và ổ khóa. Bạn sử dụng chìa khóa để mở két có chứa séc bạn muốn gửi, sau đó bạn cất séc mới vào két mới có ổ khóa khác. Để tiêu tiền cất trong két mới, bạn cần có chìa khóa khác.
Rất đơn giản. Các loại ổ khóa trong hệ thống cũng có thể hơi khác một chút. Một số két sắt có thể yêu cầu bạn cung cấp nhiều chìa khóa, trong khi số khác yêu cầu bạn chứng minh bạn biết một bí mật. Mọi người có thể đặt ra một loạt điều kiện. 
Chìa khóa mà chúng ta sử dụng chính là scriptSig. Còn ổ khóa là scriptPubKey. Nếu xem xét hai thành phần này kỹ hơn một chút, chúng ta sẽ thấy thực tế, chúng được tạo từ các bit dữ liệu và các khối mã. Khi kết hợp lại với nhau, chúng sẽ tạo ra một chương trình nhỏ.

Khi bạn thực hiện một giao dịch, điều đó đồng nghĩa với việc bạn đang truyền tổ hợp đó tới mạng lưới. Mỗi node nhận được tổ hợp này sẽ kiểm tra chương trình để biết liệu giao dịch có hợp lệ hay không. Nếu không hợp lệ, giao dịch sẽ bị loại bỏ và bạn sẽ không thể sử dụng số tiền được khóa.

Séc (coin) mà bạn nắm giữ được gọi là đầu ra giao dịch chưa sử dụng (UTXO). Những ai cung cấp chìa khóa khớp với ổ khóa sẽ sử dụng được tiền. Cụ thể, chìa khóa là scriptSig, còn ổ khóa là scriptPubKey.
Nếu UTXO nằm trong ví của bạn, có thể điều kiện được đưa ra sẽ là chỉ người nào chứng minh được quyền sở hữu khóa công khai này mới có thể mở khóa các khoản tiền này. Để mở khóa, bạn cung cấp scriptSig bao gồm chữ ký số, sử dụng khóa riêng tư liên kết với khóa công khai được quy định trong scriptPubKey. Chúng tôi sẽ giải thích ơ chế này rõ ràng hơn trong phần sau.

Hiểu về ngăn xếp Bitcoin

Script được biết đến như là ngôn ngữ dựa trên ngăn xếp. Điều này nghĩa là khi đọc một tập hợp các chỉ thị, chúng ta đặt các chỉ thị này vào thứ gọi là cột dọc. Ví dụ, danh sách A, B, C sẽ tạo thành một ngăn xếp, trong đó A nằm dưới đáy ngăn xếp, còn C nằm trên đỉnh ngăn xếp. Khi chỉ thị yêu cầu chúng ta làm điều gì đó, chúng ta sẽ thực hiện trên một hoặc nhiều phần tử bắt đầu ở đỉnh ngăn xếp.

Các phần tử A, B và C được thêm vào và “lấy ra” khỏi ngăn xếp.

Chúng ta có thể phân biệt giữa dữ liệu (những thứ như chữ ký, hash và khóa công khai) và chỉ thị (hay mã opcode). Các chỉ thị xóa dữ liệu và làm gì đó với dữ liệu. Sau đây là một ví dụ rất đơn giản giúp bạn hình dung về script (tập lệnh):
   
Màu đỏ là dữ liệu, còn màu xanh lam là mã opcode. Chúng ta đọc từ trái sang phải, vì vậy trước tiên chúng tôi sẽ đặt chuỗi vào ngăn xếp. Tiếp theo là mã opcode . Script này không tồn tại trong Bitcoin, nhưng giả sử nó loại bỏ phần tử trên đỉnh ngăn xếp (), rồi hash (băm) phần tử này bằng thuật toán MD5. Sau đó, đầu ra được thêm trở lại vào ngăn xếp. Đầu ra ở đây là d16fb36f0911f878998c136191af705e.
Thật trùng hợp! Phần tử tiếp theo chúng tôi thêm vào là , nên giờ ngăn xếp có hai phần tử giống hệt nhau. Cuối cùng, lấy hai phần tử trên đỉnh ngăn xếp ra và kiểm tra xem hai phần tử này có bằng nhau không. Nếu bằng nhau, nó sẽ thêm <1> vào ngăn xếp. Nếu không bằng nhau, nó sẽ thêm <0>
Chúng ta đã đi đến cuối danh sách các chỉ thị. Script của chúng ta có thể bị lỗi theo hai cách – nếu phần tử còn lại là 0 hoặc nếu một trong các toán tử khiến script bị lỗi khi không đáp ứng một số điều kiện. Không có bất kỳ toán tử nào như vậy trong ví dụ này, nên chúng ta có phần tử không phải là 0 (<1>), vì vậy script của chúng ta hợp lệ. Các quy tắc này cũng áp dụng cho giao dịch Bitcoin trong thực tế.

Đây chỉ là một ví dụ về chương trình. Giờ hãy xem một số chương trình trong thực tế.

Pay-to-Pubkey (P2PK)

Pay-to-Pubkey (P2PK) cực kỳ đơn giản. Chương trình này liên quan đến việc khóa tiền vào một khóa công khai. Nếu bạn muốn nhận tiền theo cách này, bạn sẽ cung cấp khóa công khai của bạn cho người gửi, trái ngược với địa chỉ Bitcoin. 

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 Bitcoin ra đời, nhưng ngày nay, Pay-to-Pubkey-Hash (P2PKH) phần lớn đã thay thế cấu trúc này. 
Script khóa của giao dịch P2PK tuân theo định dạng  OP_CHECKSIG. Rất đơn giản. Có thể bạn sẽ đoán rằng OP_CHECKSIG kiểm tra chữ ký và khóa công khai được cung cấp xem có khớp nhau hay không. Do đó, scriptSig của chúng ta sẽ là một đơn giản. Hãy nhớ rằng scriptSig là chìa khóa để mở ổ khóa.