Tác giả: olkurbatov
Chúng tôi đề xuất một phương pháp để mô phỏng mã lệnh OP_RAND trên Bit, thông qua một trò chơi tương tác không cần tin tưởng giữa các đối tác giao dịch. Kết quả của trò chơi là xác suất, và không cho phép bất kỳ bên nào gian lận hoặc ảnh hưởng đến tỷ lệ thắng của mình ở bất kỳ bước nào. Giao thức có thể cho phép những người tham gia bên ngoài phân biệt không được, và không yêu cầu nâng cấp Bit và Bit Script. Chúng tôi sẽ sử dụng một trò chơi Thimbles đơn giản để minh họa cách hoạt động của giao thức này và cung cấp một số suy nghĩ ban đầu về các ứng dụng có thể sử dụng phương pháp trên.
Lời mở đầu
Bit Script bản thân không cho phép đưa vào tính ngẫu nhiên, do đó cũng không cho phép xây dựng các luồng thanh toán dựa trên tính ngẫu nhiên. Vì vậy, trong các giả định sau, quy trình "Alice và Bob mỗi người đặt 5 BTC, nếu mặt coin là mặt sấp, Bob có thể lấy tất cả tiền" là không thể thực hiện được:
- Giao dịch không thể lấy được tính ngẫu nhiên từ bất kỳ nơi nào tại thời điểm xác nhận
- Bit Script không thể kiểm tra Block, cũng không thể đọc các giao dịch trong quá khứ và tương lai
- Cả hai bên đều có thể nhận được cùng một trạng thái ngăn xếp sau khi mỗi mã lệnh được xử lý xong
- Không thể kiểm soát tính xác định của chữ ký ECDSA và Schnorr
- Bit không hỗ trợ mã lệnh OP_RAND
Tất cả các hạn chế nêu trên khiến chúng tôi không thể tìm thấy một phương pháp không cần tin tưởng để lấy tính ngẫu nhiên và sử dụng nó để thao tác Bit. Chúng tôi đề xuất một cách tiếp cận thông qua một giao thức tương tác hai bên để thực hiện điều này, và chỉ ra rằng các tính năng này có thể được sử dụng trong trò chơi Thimbles có đặt cược Bit.
Kiến thức cơ bản
$\mathbb{G}$ là một nhóm chu kỳ có số thứ tự là số nguyên tố $p$, $G \in \mathbb{G}$ là bộ phát sinh của nhóm đó.
$a \in \mathbb{F}_p$ là một giá trị standard, trong khi $A \in \mathbb{G}$ là một phần tử thuộc nhóm đó.
$\mathsf{hash}_p(m) \rightarrow h\in \mathbb{F}_p$ là một hàm băm mật mã, lấy bất kỳ thông điệp $m$ làm đầu vào, trả về một phần tử miền $h$.
$\mathsf{hash}_{160}(P) \rightarrow \mathsf{addr}\in \mathcal{A}$ là một hàm, thực hiện các phép tính SHA-256 và Ripemd160 liên tiếp trên một khóa công khai, đầu ra là một địa chỉ Bit hợp lệ.
Chúng tôi định nghĩa một bằng chứng $\pi$ cho mối quan hệ sau: $\mathcal{R} = {(w;x) \in \mathcal{W} \times \mathcal{X}: \phi_1(w,x), \phi_2(w,x) , \dots, \phi_m(w,x)}$, trong đó $w$ là dữ liệu chứng thực, $x$ là dữ liệu công khai, và $\phi_1(w,x), \phi_2(w,x) , \dots, \phi_m(w,x)$ là một tập hợp các mối quan hệ phải được chứng minh đồng thời.
Chúng tôi định nghĩa một giao dịch Bit với $n$ đầu vào và $m$ đầu ra là $\mathsf{TX}{(\mathsf{id, i, proof})^{(n)};(\mathsf{a BTC, cond})^{(m)}}$, trong đó $\mathsf{id}$ là giá trị băm của giao dịch trước, $i$ là chỉ số đầu ra, $\mathsf{proof}$ là một tập hợp các dữ liệu cần thiết để tiêu thụ giao dịch; $a$ là số tiền trong đầu ra, $\mathsf{cond}$ là điều kiện khóa công khai. Ví dụ, đầu vào P2PKH cần $\mathsf{proof} \leftarrow \langle \mathsf{PK}, \sigma\rangle$ và $\mathsf{cond}\leftarrow \langle$ OP_DUP, OP_HASH160, $\mathsf{addr}$, OP_EQUALVERIFY, OP_CHECKSIG $\rangle$. Khi sử dụng P2PKH, chúng tôi sẽ đơn giản hóa ký hiệu điều kiện trên thành $\mathsf{addr}$.
Điều khoản hạn chế điểm trên đường cong ellipse
Trước tiên, chúng tôi hãy xem xét cách thực hiện một giao dịch với điều kiện sau: "Chỉ có thể tiêu thụ đầu ra thứ hai của giao dịch sau khi đầu ra thứ nhất đã được tiêu thụ". Trước đây, người ta cho rằng điều này có thể được thực hiện bằng cách sử dụng một hợp đồng hash, tuy nhiên, (1) nó có thể được nhận dạng; (2) nó không giúp ích gì cho việc thực hiện trò chơi cuối cùng của chúng tôi.
Thuật toán 1: Tạo đầu ra có điều kiện chỉ có thể tiêu thụ sau khi đầu ra khác đã được tiêu thụ.
Điều kiện: Alice và Bob mỗi người gửi 1 BTC. Bob chỉ có thể tiêu thụ 1 BTC của mình sau khi Alice đã tiêu thụ 1 BTC của cô ấy. Khóa công khai của Bob $P_b$ là có thể biết trước.
Quy trình:
Alice tạo ra:
$$
sk_a \leftarrow \mathbb{F}b \
P_a = sk_a G \
addr_a = \mathsf{hash}{160}(P_a) \
C = \mathsf{hash}_{p}(P_a)·G
$$Và tạo ra một bằng chứng $\pi_c$ cho mối quan hệ sau:
$$
\mathcal{R}_c = {P_a;\mathsf{addr}a,C,G:\mathsf{hash}{160}(P_a) \rightarrow \mathsf{addr}a \and \mathsf{hash}{p}(P_a)·G \rightarrow C}
$$Sau khi nhận được bằng chứng $\pi_c$, Bob lấy ra $C$ và tính toán:
$$
\mathsf{addr}b = \mathsf{hash}{160}(P_b + C)
$$Bob tạo ra một giao dịch và gửi cho Alice:
$$
\mathsf{TX}_1{(\mathsf{prev}_A, i_A, -), (\mathsf{prev}_B, i_B, \sigma_B(\mathsf{TX}_1));(1BTC, \mathsf{addr}_a),(1BTC, \mathsf{addr}_b)}
$$Alice cũng ký giao dịch này và phát sóng lên mạng:
$$
\mathsf{TX}_1{(\mathsf{prev}_A, i_A, \sigma_A(\mathsf{TX}_1)), (\mathsf{prev}_B, i_B, \sigma_B(\mathsf{TX}_1));(1BTC, \mathsf{addr}_a),(1BTC, \mathsf{addr}_b)}
$$
Nếu Alice muốn tiêu thụ đầu ra của mình, cô ấy sẽ tạo ra một giao dịch như sau và công khai khóa công khai $P_a$ cùng với chữ ký của nó:
$$
\mathsf{TX}_2{(\mathsf{TX}1,1, \langle P_a, \sigma{P_a}(\mathsf{TX}2) \rangle);(1 BTC, \mathsf{addr}{a'})}
$$
Khi giao dịch này được công khai, Bob có thể trích xuất $P_a$ và phục hồi giá trị $\mathsf{hash}_p(P_a)$. Sau đó, khóa riêng tư của đầu ra thứ hai có thể được tính toán: $sk = \mathsf{hash}_p(P_a) + sk_b$ (chỉ Bob biết $sk_b$), và Bob có thể tạo ra một chữ ký liên kết với khóa công khai $P_b + C$ và địa chỉ của nó.
$$
\mathsf{TX}_3{(\mathsf{TX}1,2, \langle P_b + C, \sigma{P_b + C}(\mathsf{TX}3) \rangle);(1 BTC, \mathsf{addr}{b'})}
$$
(Ghi chú của người dịch: Xem xét ngữ cảnh ở đây, bằng chứng mà Alice cung cấp cho Bob là một "bằng chứng kiến thức không tiết lộ", Bob chỉ biết rằng Alice có một giá trị như vậy, nhưng không thể biết giá trị đó là gì từ bằng chứng.)
Như vậy, chúng tôi đã xây dựng được phần đầu tiên của việc mô phỏng tính ngẫu nhiên và trò chơi Thimbles của chúng tôi. Điều cần lưu ý là, trong ví dụ trên, nếu Alice không tiêu thụ đầu ra của mình và không công khai $P_a$, Bob sẽ không thể phục hồi được khóa riêng tư của đầu ra thứ hai và do đó không thể tiêu thụ nó. Nếu chúng tôi cần cung cấp khả năng tiêu thụ các đầu ra này sau một khoảng thời gian (ví dụ: nếu trò chơi không bắt đầu), chúng tôi có thể làm tương tự như cách xây dựng kênh thanh toán - khóa tiền vào đầu ra đa chữ ký, sau đó tạo ra một giao dịch có thể tiêu thụ nó sau một khoảng thời gian.
Thimbles 游戏作为một ví dụ
(bỏ qua)


