Skip to content

Instantly share code, notes, and snippets.

@cryptcoin-junkey
Last active October 4, 2020 12:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cryptcoin-junkey/1ade6c35ce4e44cbbd64833955b1e601 to your computer and use it in GitHub Desktop.
Save cryptcoin-junkey/1ade6c35ce4e44cbbd64833955b1e601 to your computer and use it in GitHub Desktop.
Monaparty Script の実装前検討資料

基本方針

BitcoinCash Script をベースの仕様とし、BitcoinCash Script へのトランスパイラとして実現可能なものとする。

いくつかのオペコードを追加する。今後 BitcoinCash Script が拡張された場合でも対応できるよう求められる。

拡張

文字列

Counterparty プロトコルでは文字列が多用される。一方で BitcoinCash Script には文字列型は無い。 また文字列型の多用は、処理時間の面でもバッファオーバフローなどのセキュリティリスクの面でも、好ましくない。

Monapary Script では、前段の処理として、文字列を RIPEMD-160 でハッシュした結果と置換し BitcoinCash Script へ与える。 同時にハッシュ値と元のデータの対応テーブルを処理系が保持する。 この場合のハッシュ化の目的に秘匿は無く、元データが閲覧可能であっても問題は無い。

このテーブルは、 OPX_BUILDMESSAGE で Monaparty メッセージを作成する際に用いられる。

オペコード

Bitcoin 系チェーンのコントラクトでは要求されないいくつかの機能が、Monaparty Script では必要である。 オペコードを追加する必要があるが、OP_NOP1 などを使うと、今後 BitcoinCash Script が拡張されたときに衝突する可能性がある。

そこで、Moaparty Script では、独自拡張のオペコードを 2 バイトとし、オペコード・プレフィックスを 0x50 とする。 0x50 は OP_RESERVED が既に割り当たっており、実行されない OP_IF ブランチ内にある場合を除き、トランザクションが invalid になる。 これが再定義される可能性は殆どない。

追加されるオペコード

OPX_BUILDMESSAGE (0x50 0x01)

スタックトップの値に応じて、スタックにあるデータから、契約成立時に送信予約される Monaparty メッセージを作成する。 コントラクトにデフォルトのメッセージがある場合には、作成されたメッセージで上書きされる。同一の検証スクリプト内で、複数回 OPX_BUILDMESSAGE が呼ばれた場合には、最後に呼ばれたものが有効となる。

メッセージ作成に必要なデータがスタックにない場合は即座に invalid となる。

メッセージ作成が成功した場合、作成に使われたデータはスタックから取り除かれる。

OPX_CURRENTBLOCK (0x50 0x10)

現在のコントラクトの実行契機となったモナコインのブロック高をスタックトップに置く。

OPX_BEGINBLOCK (0x50 0x11)

現在検証中のコントラクトがデプロイされたモナコインのブロック高をスタックトップに置く。

OPX_CURRENTINDEX (0x50 0x20)

現在検証中のコントラクトの実行契機となった Monaparty の tx_index 値をスタックトップに置く。

OPX_BEGININDEX (0x50 0x21)

現在検証中のコントラクトがデプロイされた Monaparty の tx_index 値をスタックトップに置く。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment