Mỗi UTXO trong Bitcoin bị khoá bởi một đoạn chương trình nhỏ, viết bằng một ngôn ngữ gọi là Script. Muốn chi tiêu UTXO đó, người dùng phải cung cấp dữ liệu mở khoá, thường là chữ ký và khoá công khai, sao cho khi ghép với chương trình khoá và chạy, kết quả là đúng. Script là ngôn ngữ dựa trên ngăn xếp, cố ý bị giới hạn: không có vòng lặp, không có trạng thái lưu giữa các giao dịch, để mọi nút có thể kiểm tra nhanh và an toàn. Dù đơn giản, nó đủ để diễn đạt chữ ký đơn, đa chữ ký, khoá thời gian và nhiều điều kiện phức tạp hơn.
Bài viết giải thích cách Script hoạt động, các mẫu khoá phổ biến, và vì sao những giới hạn của nó là có chủ đích. Nội dung dành cho người muốn hiểu sâu về kỹ thuật.
Khoá và mở khoá
Mỗi đầu ra giao dịch chứa một đoạn script khoá, tiếng Anh là scriptPubKey, mô tả điều kiện để chi tiêu. Mỗi đầu vào chi tiêu đầu ra đó chứa dữ liệu mở khoá, trước SegWit là scriptSig, sau SegWit là dữ liệu witness.
Khi kiểm tra, nút ghép dữ liệu mở khoá với script khoá và thực thi. Nếu chương trình chạy xong mà không lỗi và để lại giá trị đúng trên đỉnh ngăn xếp, đầu vào hợp lệ.
Cách thiết kế này rất linh hoạt: điều kiện chi tiêu không bị cố định là chữ ký của một khoá, mà có thể là bất kỳ logic nào Script diễn đạt được.
Trong thực tế, phần lớn UTXO dùng một vài mẫu chuẩn, vì phần mềm nút chỉ chuyển tiếp những giao dịch theo mẫu chuẩn, và ví cũng chỉ hỗ trợ những mẫu đó.
Ngăn xếp hoạt động thế nào
Script đọc từ trái sang phải. Dữ liệu được đẩy lên ngăn xếp, các toán tử lấy dữ liệu từ đỉnh ngăn xếp, xử lý, rồi đẩy kết quả trở lại. Giống như một chồng đĩa: chỉ lấy và đặt ở trên cùng.
Ví dụ mẫu trả cho dấu vân tay khoá công khai, P2PKH: script khoá yêu cầu nhân đôi khoá công khai, băm nó, so với dấu vân tay đã định, rồi kiểm tra chữ ký. Dữ liệu mở khoá cung cấp chữ ký và khoá công khai.
Khi chạy, khoá công khai được băm và so với dấu vân tay trong địa chỉ; nếu khớp, chữ ký được kiểm tra với khoá công khai. Cả hai đều đúng thì đầu vào hợp lệ.
Các toán tử có tên bắt đầu bằng OP, ví dụ OP_DUP để nhân đôi, OP_HASH160 để băm, OP_EQUALVERIFY để so sánh, OP_CHECKSIG để kiểm tra chữ ký.
Các mẫu khoá phổ biến
P2PKH là mẫu cổ điển, địa chỉ bắt đầu bằng số 1. Script khoá chứa dấu vân tay khoá công khai; mở khoá cần chữ ký và khoá công khai.
P2SH, địa chỉ bắt đầu bằng số 3, cho phép khoá vào dấu vân tay của một script bất kỳ. Người gửi không cần biết điều kiện phức tạp bên trong; người chi tiêu mới tiết lộ script đầy đủ. Đây là cách đa chữ ký trở nên tiện dụng.
P2WPKH và P2WSH là các phiên bản SegWit gốc, địa chỉ bắt đầu bằng bc1q, chuyển dữ liệu mở khoá sang witness, rẻ hơn và không bị biến dạng.
P2TR, Taproot, địa chỉ bắt đầu bằng bc1p, khoá vào một khoá công khai có thể chi tiêu bằng chữ ký Schnorr, hoặc bằng một trong nhiều script giấu trong cây, chỉ tiết lộ nhánh được dùng.
Đa chữ ký và khoá thời gian
Đa chữ ký là điều kiện yêu cầu m chữ ký trong n khoá, ví dụ hai trong ba. Trong Script cổ điển, toán tử OP_CHECKMULTISIG thực hiện việc này. Với Taproot, đa chữ ký có thể được gộp thành một chữ ký Schnorr duy nhất khi các bên phối hợp.
Khoá thời gian cho phép UTXO chỉ được chi tiêu sau một thời điểm hay một chiều cao khối nhất định. Có khoá thời gian tuyệt đối, tính theo thời điểm cụ thể, và khoá thời gian tương đối, tính từ khi UTXO được xác nhận.
Kết hợp đa chữ ký và khoá thời gian tạo ra những cấu trúc hữu ích: ví dụ hai người cùng ký để chi tiêu, nhưng sau một thời gian dài, một người có thể tự chi tiêu, phòng khi người kia mất khoá.
Những cấu trúc này là nền tảng của mạng Lightning và nhiều thiết kế lưu ký an toàn hơn.
Vì sao Script cố ý bị giới hạn
Script không có vòng lặp và không có trạng thái toàn cục. Đây là lựa chọn có chủ đích. Mọi nút phải chạy mọi script của mọi giao dịch; nếu script có thể chạy vô hạn, kẻ xấu có thể làm tê liệt mạng lưới.
Không có vòng lặp nghĩa là thời gian chạy của mỗi script có giới hạn, dễ dự đoán. Kết hợp với giới hạn kích thước và số thao tác, mọi khối có thể được kiểm tra trong thời gian hợp lý.
Thời kỳ đầu, nhiều toán tử từng bị vô hiệu hoá sau khi phát hiện chúng có thể gây lỗi hoặc tấn công. Cộng đồng Bitcoin chọn hướng thận trọng, chỉ thêm toán tử mới qua chia tách mềm sau thời gian dài thảo luận.
So với Ethereum, nơi hợp đồng thông minh mạnh hơn nhiều, Bitcoin đánh đổi khả năng biểu đạt để lấy sự đơn giản, an toàn và dễ kiểm chứng.
Gần đây, cộng đồng vẫn thảo luận nhiều đề xuất thêm toán tử mới để mở rộng khả năng của Script, chẳng hạn những toán tử cho phép ràng buộc cách một UTXO được chi tiêu tiếp theo. Các đề xuất này được tranh luận rất kỹ về lợi ích và rủi ro, và chưa có gì chắc chắn sẽ được kích hoạt.
Các mẫu và khái niệm Script cần biết
Script khoá Điều kiện chi tiêu gắn với mỗi đầu ra.
Dữ liệu mở khoá Chữ ký và dữ liệu khác người chi tiêu cung cấp.
Ngăn xếp Cấu trúc dữ liệu vào sau ra trước mà Script dùng.
P2PKH Mẫu cổ điển, địa chỉ bắt đầu bằng số 1.
P2SH Khoá vào dấu vân tay script, địa chỉ bắt đầu bằng số 3.
P2WPKH và P2WSH Mẫu SegWit gốc, địa chỉ bắt đầu bằng bc1q.
P2TR Mẫu Taproot, địa chỉ bắt đầu bằng bc1p.
Đa chữ ký Yêu cầu m chữ ký trong n khoá.
Khoá thời gian tuyệt đối Chỉ chi tiêu sau một thời điểm hay chiều cao khối nhất định.
Khoá thời gian tương đối Chỉ chi tiêu sau một khoảng thời gian kể từ khi UTXO được xác nhận.
OP_RETURN Đầu ra không chi tiêu được, dùng để ghi một lượng dữ liệu nhỏ lên chuỗi.
Không có vòng lặp Giới hạn có chủ đích để mọi nút kiểm tra nhanh và an toàn.
Script và người dùng thông thường
Phần lớn người dùng không bao giờ phải viết script. Ví tạo địa chỉ theo mẫu chuẩn và lo việc ký, mở khoá.
Nhưng hiểu Script giúp bạn hiểu những điều quan trọng: loại địa chỉ ảnh hưởng đến phí; đa chữ ký và khoá thời gian là những công cụ bảo mật có thật; và quyền chi tiêu trong Bitcoin là quyền thoả mãn một điều kiện toán học, không phải quyền do ai cấp.
Nó cũng giúp nhận ra quảng cáo sai. Những lời hứa kiểu hợp đồng Bitcoin tự động sinh lời thường không có thật; Script không có khả năng tạo ra lợi nhuận, nó chỉ quy định ai được chi tiêu khi nào.
Như mọi bài trên trang, đây là kiến thức kỹ thuật, không phải hướng dẫn sử dụng tài sản.
Câu hỏi thường gặp
Script trong Bitcoin là gì?
Là ngôn ngữ lập trình dựa trên ngăn xếp dùng để viết điều kiện khoá cho mỗi UTXO và kiểm tra dữ liệu mở khoá khi chi tiêu.
Vì sao Script không có vòng lặp?
Để thời gian chạy có giới hạn và dễ dự đoán, tránh kẻ xấu làm tê liệt mạng lưới bằng script chạy vô hạn.
Địa chỉ bắt đầu bằng 1, 3, bc1q, bc1p khác nhau thế nào?
Lần lượt là các mẫu P2PKH, P2SH, SegWit gốc và Taproot, khác nhau về cấu trúc và chi phí khi chi tiêu.
Khoá thời gian dùng để làm gì?
Để UTXO chỉ được chi tiêu sau một thời điểm, chiều cao khối hoặc khoảng thời gian nhất định, hữu ích cho dự phòng và kênh thanh toán.
Script có thể tạo lợi nhuận tự động không?
Không. Script chỉ quy định điều kiện chi tiêu; lời hứa hợp đồng Bitcoin tự sinh lời thường là lừa đảo.