shohu / c0ban

c0ban source tree
MIT License
0 stars 0 forks source link

Think OP_DATASIGVERIFY #71

Open shohu opened 5 years ago

shohu commented 5 years ago

Motivation

https://twitter.com/techmedia_think/status/1043155228290416640?s=19

Explain

https://techmedia-think.hatenablog.com/entry/2017/12/01/192732

Reference implementation

https://github.com/BitcoinUnlimited/BitcoinUnlimited/commit/1bf53307cab5d96076721ef5a238a63b03aca07d

shohu commented 5 years ago

以下 https://techmedia-think.hatenablog.com/entry/2017/12/01/192732 より抜粋

このopcodeはトランザクションではなくスタック上のデータに対してOP_CHECKSIGVERIFYを行う。具体的には

1. スタックからトップ3アイテム(公開鍵ハッシュ、署名、任意のデータ)をポップする。
2. 署名が任意のデータに対する有効な署名か検証する。
3. 署名の公開鍵のハッシュが公開鍵ハッシュと一致するか検証する。

通常のP2PKHの場合のScript

[OUTPUT] scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
[INPUT]  scriptSig: <sig> <pubKey>

つなげると ↓

<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

これを OP_DATASIGVERIFY 使った形に直すといかになる?

<sig> <pubKey> <oracleData> <oracleSign> <オラクルの公開鍵ハッシュ> OP_DATASIGVERIFY OP_CHECKSIG

inputとoutputに分けると

[OUTPUT] scriptPubKey: <oracleData> <oracleSign> <オラクルの公開鍵ハッシュ> OP_DATASIGVERIFY OP_CHECKSIG
[INPUT]  scriptSig: <sig> <pubKey>

スタック内容の内訳

オラクルの公開鍵ハッシュ
オラクルの署名
オラクルのデータ
勝者の公開鍵 (標準のP2PKHの場合)
勝者のトランザクションの署名 (標準のP2PKHの場合)