Giải mã Bitcoin Script: Ngôn ngữ lập trình đứng sau Tiền kỹ thuật số

Giới thiệu

Bitcoin thường được gọi là tiền tệ có thể lập trình. Bản chất kỹ thuật số của nó cung cấp cho người dùng sự linh hoạt cao hơn trong việc xác định các điều kiện sử dụng quỹ của họ.

Khi thảo luận về Bitcoin, các cuộc trò chuyện thường xoay quanh ví và đồng xu. Tuy nhiên, một khái niệm chính xác hơn sẽ là coi ví như những chiếc chìa khóa, đồng xu như những tấm séc, và blockchain như một kho bảo mật. Mỗi kho đều có một lối vào hẹp mà qua đó có thể đưa séc vào hoặc kiểm tra nội dung bên trong. Quyền truy cập vào kho vẫn bị hạn chế đối với những người sở hữu chìa khóa đúng.

Khi một người nắm giữ khóa muốn chuyển tiền, họ mở khóa kho. Quy trình này bao gồm việc tạo một séc mới tham chiếu đến bản gốc ( mà bị vô hiệu hóa ) và bảo mật nó trong một kho chỉ có thể truy cập bởi người nhận dự định. Người nhận mới thực hiện các bước tương tự khi chi tiêu những khoản tiền này.

Bài viết này xem xét Bitcoin Script - ngôn ngữ lập trình mà các nút trong mạng Bitcoin sử dụng để kiểm soát cơ chế khóa và mở khóa của các kho tài sản số này.

Cơ chế giao dịch của Bitcoin

Theo phép ẩn dụ của chúng tôi, mỗi giao dịch Bitcoin bao gồm hai thành phần thiết yếu: một chìa khóa ( để truy cập kho ) và một ổ khóa. Chìa khóa mở khóa kho chứa tấm séc mà bạn muốn chuyển, trong khi tấm séc mới được đặt vào một kho khác được bảo mật bằng một ổ khóa khác. Để truy cập quỹ từ kho mới này cần một chìa khóa cụ thể khác.

Hệ thống này cung cấp sự linh hoạt đáng kể. Mạng hỗ trợ nhiều loại khóa khác nhau - một số kho có thể yêu cầu nhiều chìa khóa, trong khi những kho khác có thể yêu cầu chứng minh quyền hạn để truy cập. Người dùng có thể tùy chỉnh nhiều điều kiện theo yêu cầu cụ thể của họ.

Về mặt kỹ thuật, chìa khóa được gọi là scriptSig, trong khi khóa được gọi là scriptPubKey. Khi xem xét kỹ lưỡng, các thành phần này thể hiện mình như là sự kết hợp của các mảnh dữ liệu và các khối mã mà cùng nhau tạo thành một chương trình ngắn gọn.

Trong quá trình thực hiện giao dịch, sự kết hợp này lan tỏa qua mạng lưới. Mỗi nút nhận sẽ xác minh tính hợp lệ của giao dịch. Việc xác minh không thành công dẫn đến việc quỹ không thể truy cập.

Các kiểm tra (coins) về mặt kỹ thuật được gọi là đầu ra giao dịch chưa chi tiêu (UTXOs). Bất kỳ người dùng nào sở hữu một khóa thích hợp đều có thể sử dụng những quỹ này. Cụ thể, scriptSig hoạt động như một khóa trong khi scriptPubKey giữ vai trò như một ổ khóa.

Nếu ví của bạn chứa UTXOs, chúng có thể có điều kiện quy định rằng chỉ những cá nhân có thể chứng minh quyền sở hữu một khóa công khai cụ thể mới có thể mở khóa các quỹ liên quan. Để mở khóa chúng, bạn phải cung cấp một scriptSig được ký số bằng khóa riêng tương ứng với khóa công khai được chỉ định trong scriptPubKey.

Các nguyên tắc cơ bản của Bitcoin Stack

Kịch bản hoạt động như một ngôn ngữ dựa trên ngăn xếp. Các lệnh được sắp xếp theo cột dọc, với việc thực thi bắt đầu từ phần tử ở đỉnh. Ví dụ, các phần tử A, B và C tạo thành một ngăn xếp với C ở trên cùng và A ở dưới cùng. Khi thực thi các lệnh, các phép toán bắt đầu với các phần tử từ đỉnh của ngăn xếp.

Các phần tử được thêm vào và "bị loại bỏ" khỏi ngăn xếp trong quá trình thực thi.

Các phần tử dữ liệu ( như chữ ký, băm và khóa công khai) khác với các lệnh ( hoặc mã thao tác). Các lệnh loại bỏ dữ liệu và thực hiện các phép toán trên đó. Hãy xem xét ví dụ đơn giản này:

\u003cxyz\u003e \u003cmd5 hasher=""\u003e \u003cd16fb36f0911f878998c136191af705e\u003e \u003ccheck if="" equal=""\u003e

Dữ liệu hiển thị bằng màu đỏ, mã lệnh bằng màu xanh. Đọc từ trái sang phải, chuỗi đầu tiên vào ngăn xếp. Mã lệnh (giả định cho ví dụ này) sau đó loại bỏ phần tử trên cùng của ngăn xếp () và áp dụng băm MD5, đẩy kết quả trở lại ngăn xếp: d16fb36f0911f878998c136191af705e.

Tiếp theo, vào ngăn xếp, dẫn đến hai phần tử giống hệt nhau. Cuối cùng, loại bỏ hai phần tử trên cùng và so sánh chúng, đẩy <1> vào ngăn xếp nếu giống nhau hoặc <0> nếu khác nhau.

Khi đã đến cuối danh sách hướng dẫn, việc xác thực kịch bản tuân theo hai quy tắc: thất bại xảy ra nếu phần tử còn lại là null hoặc nếu một hướng dẫn thất bại do các điều kiện không được đáp ứng. Trong ví dụ này, không có điều kiện nào áp dụng - chúng ta có một phần tử không null (<1>), xác nhận tính hợp lệ của kịch bản. Những quy tắc này cũng điều chỉnh các giao dịch Bitcoin thực tế.

Pay-to-Pubkey (P2PK)

Pay-to-Pubkey (P2PK) đại diện cho hình thức giao dịch cơ bản nhất. Nó khóa quỹ vào một khóa công khai cụ thể. Để nhận quỹ thông qua phương pháp này, người nhận phải cung cấp cho người gửi khóa công khai của họ thay vì địa chỉ Bitcoin.

Giao dịch đầu tiên giữa Satoshi Nakamoto và Hal Finney vào năm 2009 đã sử dụng P2PK. Cấu trúc này rất phổ biến trong những ngày đầu của Bitcoin nhưng đã phần lớn bị thay thế bởi Pay-to-Pubkey-Hash (P2PKH).

Kịch bản khóa cho P2PK theo định dạng đơn giản: OP_CHECKSIG. Như tên gọi, OP_CHECKSIG xác minh chữ ký so với khóa công khai được cung cấp. Kịch bản scriptSig tương ứng chỉ chứa .

Quá trình thực thi không thể đơn giản hơn: chữ ký vào ngăn xếp, tiếp theo là khóa công khai. OP_CHECKSIG kiểm tra cả hai yếu tố và xác minh chữ ký với khóa công khai. Một sự khớp sẽ dẫn đến việc <1> được thêm vào ngăn xếp; nếu không, <0> sẽ xuất hiện.

P2PK đã trở nên không còn được sử dụng, với những lý do được khám phá trong phần tiếp theo.

Pay-to-Pubkey-Hash (P2PKH)

Pay-to-Pubkey-Hash (P2PKH) đại diện cho loại giao dịch phổ biến nhất trong mạng Bitcoin. Phần mềm ví hiện đại thường triển khai định dạng này theo mặc định.

ScriptPubKey P2PKH theo cấu trúc này:

OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG

Trước khi xem xét scriptSig tương ứng, hãy hiểu các opcodes liên quan:

OP_DUP

OP_DUP loại bỏ phần tử trên cùng, tạo ra một bản sao và đẩy cả hai phiên bản trở lại ngăn xếp. Điều này cho phép thực hiện các thao tác trên bản sao trong khi vẫn bảo tồn bản gốc.

OP_HASH160

Mã lệnh này loại bỏ phần tử ở đỉnh và áp dụng băm kép: đầu tiên là SHA-256, sau đó là RIPEMD-160 cho đầu ra SHA-256. Băm kết quả quay trở lại ngăn xếp.

OP_EQUALVERIFY

OP_EQUALVERIFY kết hợp hai phép toán: OP_EQUAL và OP_VERIFY. OP_EQUAL loại bỏ hai phần tử và kiểm tra tính đồng nhất, đẩy <1> nếu giống nhau hoặc <0> nếu khác nhau. OP_VERIFY loại bỏ phần tử ở trên cùng và xác minh giá trị đúng của nó (non-null). Khi kết hợp thành OP_EQUALVERIFY, điều này gây ra thất bại giao dịch nếu hai phần tử trên cùng không khớp.

Cấu trúc scriptSig tương ứng là:

<chữ ký> <khóa công khai="">

Việc mở khóa các đầu ra P2PKH yêu cầu cung cấp cả chữ ký hợp lệ và khóa công khai tương ứng.

Quy trình này xây dựng dựa trên luồng thực thi P2PK, thêm xác minh rằng khóa công khai được cung cấp khớp với băm nhúng trong kịch bản.

Một sự phân biệt quan trọng: trong các script khóa P2PKH, khóa công khai vẫn được giữ bí mật - chỉ có hàm băm của nó xuất hiện. Việc kiểm tra một đầu ra P2PKH chưa chi tiêu trong các trình khám phá blockchain không tiết lộ thông tin về khóa công khai. Khóa này chỉ trở nên hiển thị khi người nhận chuyển tiền.

Cách tiếp cận này mang lại một số lợi ích. Đầu tiên, băm khóa công khai cung cấp khả năng truyền tải gọn gàng hơn so với các khóa công khai hoàn chỉnh - điều này đã thúc đẩy việc Satoshi thực hiện vào năm 2009. Những băm khóa công khai này cấu thành các địa chỉ Bitcoin mà người dùng trao đổi.

Thứ hai, việc băm khóa công khai giới thiệu một lớp bảo mật bổ sung chống lại các mối đe dọa từ máy tính lượng tử. Vì khóa công khai vẫn ẩn cho đến khi thực hiện chi tiêu, nên việc xác định khóa riêng tương ứng trở nên khó khăn hơn đáng kể. Bất kỳ cuộc tấn công nào cũng sẽ yêu cầu đảo ngược hai phép băm liên tiếp (RIPEMD-160 và SHA-256).

BTC0.76%
Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • Bình luận
  • Đăng lại
  • Chia sẻ
Bình luận
0/400
Không có bình luận
  • Ghim
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)