P2sh

我可以在腳本系統中使用什麼 OP 程式碼來製作類似於彩票的智能合約

  • July 9, 2017

我正在嘗試製作一個類似於彩票或賭博遊戲的智能合約。這是一個例子:

Alice 和 Bob 將資金發送到 P2SH 地址。鮑勃是彩票。資金需要鎖定一段時間(例如直到抽獎,比如 5 天)。為此,我們可以使用 OP_CHECKLOCKTIMEVERIFY。在 nLockTime 到期後,如果 Alice 猜中了 3 個數字,她將獲得 50% 的押金。如果她猜到 6 個數字,她將獲得 200% 的押金返還。

在 Alice 為存款地址注資之前,Bob(彩票)如何承諾 Alice 需要猜測的一些數字?Bob 需要能夠證明這些數字是在她為存款地址提供資金之前選擇的,並且不能簡單地否認 Alice 猜到的任何數字。

另一方面,如果 Bob 在抽獎(nLickTime 到期)時間到來之前消失,如果她猜到 Bob 之前承諾的數字,我們如何強制將資金返還給 Alice?

我能想到的最簡單的事情是 Bob 將他在 OP_RETURN 中承諾的數字的雜湊值放在為存款地址提供資金的交易中,但這有點像 PITA,很煩人,它不能保證 Alice 會接受如果她猜出 Bob 承諾的數字,即使他在抽獎(nLockTime 到期)時間到來之前消失,她的錢也是如此。

謝謝你。

您也許可以將雜湊鎖與條件支付結合起來。

這是一個稍微簡化的範例,顯示瞭如何根據秘密知識進行支付。Bob 與 Alice 打賭,她無法在截止日期前猜出 Bob 的秘密。Alice 通過將原像發佈到 Bob 發布的雜湊值來證明她知道這個秘密。Alice 和 Bob 各自貢獻了一個比特幣。獲勝者獲得兩個比特幣。如果 Bob 在截止日期後沒有透露秘密,Alice 就會拿走所有的錢。

有兩個單比特幣輸入,分別由 Alice 和 Bob 簽名。

有一個兩個比特幣輸出。它受嵌套的條件質詢腳本保護,如下所示:

IF
 // Alice spends with secret before deadline
 OP_HASH256 <hash> OP_EQUALVERIFY <Alice pubkey> OP_CHECKSIG
ELSE
 // deadline has expired
 <deadline> OP_CHECKLOCKTIMEVERIFY OP_DROP

 IF
   // Bob spends by revealing the secret
   OP_HASH256 <hash> OP_EQUALVERIFY <Bob pubkey> OP_CHECKSIG
 ELSE
   // Alice spends if Bob refuses to publish the secret
   <Alice pubkey> OP_CHECKSIG
 ENDIF
ENDIF

為了在截止日期之前花費輸出,Alice 使用以下響應腳本:

<Alice signature> <secret> <1>

在截止日期之後,Bob 使用以下響應腳本:

<0> <Bob signature> <secret> <1> <0>

如果 Bob 在截止日期後沒有花費輸出(洩露秘密),Alice 會通過這個響應腳本拿走所有的錢:

<0> <Alice signature> <0> <0>

但是,這種方法存在問題。如果 Alice 沒有猜到這個秘密並且 Bob 發布了它,Alice 可以使用這個秘密來進行她自己的交易來聲明輸出。這設置了一個競爭條件,其中 Alice 和 Bob 都有待處理的交易試圖花費輸出。

解決此問題的一種方法是在截止日期後立即給 Bob 一個寬限期(例如,一天)。在寬限期內,Alice 將無法消費,但 Bob 可以。

引用自:https://bitcoin.stackexchange.com/questions/56414