ブロックチェーンでおそらく消費できないUTXOを数える方法は?
私が理解している限り、ブロックの高さ0からブロックチェーンを反復処理し、出力の数をカウントし、各ブロックの入力の数を減算して結果を合計することで、UTXOをカウントできます。これに加えて、OP_RETURNsなどの証明可能な支出不可能なトランザクションを差し引きます。おそらく支出不可能なトランザクションのリストは、次のような長い行であると私は信じています。
- OP_RETURNSで始まるトランザクション出力
- トランザクションサイズの制限を超えるトランザクション出力
上記の知識のギャップはありますか?
そうでない場合、支出できない可能性のあるトランザクションのリストをどのようにカウントしますか。
- OP_RETURNS:TXにOP_RETURNがあるTXをカウントするだけですか?ここで他に何かすることはありますか?
- TXサイズの制限:これを数えるにはどうすればよいですか?
回答
「トランザクション」とは、「トランザクション出力」を意味すると思います。
トランザクションサイズの制限を超えるトランザクション出力を持つことは文字通り不可能です。そうでなければ、その出力を含むトランザクションはブロックチェーンに含まれません。
むしろ、あなたが探しているのは、出力スクリプトが最大スクリプトサイズよりも大きいということだと思います。このようなスクリプトは、おそらく使用できず、UTXOセットから除外できます。
ビットコインコアには、出力が消費できないかどうかを判断する機能があります。これは完全なリストではなく、OP_RETURNで始まるスクリプトと、スクリプトの最大サイズよりも大きいスクリプトの2つだけです。
ただし、証明するためにもう少し作業が必要なだけで、おそらく支出できないスクリプトが他にもあります。たとえば、無効または無効なオペコードを使用するスクリプトは、おそらく使用できません。スクリプトインタープリターは、支出を検証しているときにそのようなオペコードがスクリプトで見つかった場合、失敗します。
しかし、それでも問題があります。実行されない(たとえば、実行されていないIFブランチ内の)不明なオペコードでも、スクリプトは検証に合格できます。ただし、スクリプトに無効なオペコードのいずれかが含まれている場合(一部の「無効な」オペコードは実際には完全に削除されているため、これにはいくつかの例外があります)、無効です。
スタックにプッシュするために最大スタックアイテムサイズよりも大きいものを必要とするスクリプトも潜在的にあります。または、OP_CHECKLOCKTIMEVERIFYまたはOP_CHECKSEQUENCEVERIFYと一緒に使用すると、負のロック時間になるようにスタックアイテムを操作するもの。
次に、OP_ELSEまたはOP_ENDIFだけがあり、その前にOP_IF / OP_NOTIFがないなど、無効にプログラムされた出力スクリプトがあります。
これらすべてを判断するのは難しく、実際には個々のスクリプトを検査する必要があります。また、コンセンサスに準拠したスクリプトインタープリターが必要ですが、スクリプトの正確なセマンティクスが実際には不明であるため、それ自体を実行するのは困難です。
昨日何か他のものを探していてエラーが発生したときに、あなたの場合に役立つかもしれないこのコードを見つけました:
https://github.com/in3rsha/bitcoin-utxo-dump