272ページ中23〜31ページ。

前回まで

monaparty APIで指定したアドレスの全トランザクション情報を取得する方法を知った。それをもとに総支払額などを算出したが、その集計が正しくできないことがあると発覚。理由は私がトランザクション情報であるUXTOのデータ構造を理解できていないためだと思われる。

目標

ひとまずの目標は、トランザクション情報に入っている一件あたりの取引が「支払い」なのか「受け取り」なのかを識別したい。

それが正しくできるようになれば集計も正しくできるはず。

手段

トランザクション情報についての詳しい情報源については、以前らいうさんに教えていただいたMasteringBitcoin日本語訳PDFを読めばよさそう。すでに以下で少し読んだ。

けれど、トランザクションの支払・受取を識別するだけの知識は得られなかった。もっと読み進める必要がありそう。

今回

「Bitcoinトランザクション」の項を読む。272ページ中23〜31ページ。

Bitcoinトランザクション

「Bitcoinトランザクション」の項目を読んでみた。要点は以下。今までで理解している通りのことである。

  • トランザクションは取引データである
  • トランザクションにはインプットとアウトプットがある
  • インプットは前回のアウトプットである
  • インプットは支払額+手数料以上である
  • インプットは単一または複数の取引データである
  • アウトプットは支払額とおつりの2つある
  • 手数料はインプットから支払額とおつりを差し引いた残額で暗示される
  • インプットにできるのは未使用アウトプットunspentである

アウトプットの作成

  • アウトプットはscriptの形で作成される(scriptPubKeyはこれのことかな?)
  • scriptはコインを使用する解除条件である
  • コイン所有者のアドレスに対応する秘密鍵から作られた署名をあらわす人に支払われる
  • 作成されたトランザクションはブロックチェーン・エクスプローラで見れる

このscriptとやらが、APIで取得したときのvoutにあったscriptPubKeyのことかもしれない。こいつの中にはアドレスなどが入っていた。あとはよくわからないhexだのasmだの。

私が支払ったときのトランザクション情報

[8]
    "vin": [
        {
            "scriptSig": {
                "asm": "304402204c24e753f63c57c5d2a944d4f0e66c6190f00ecd57cf2bdb24fe5e69f7e5cd970220591bfffa4e31eb124e43bd9bb2e325bd0e3d741c4c69f9d39acf1c72d2fbf306[ALL] 0257026e027209836532c2cd7807c06e30a889d3cca51884686af8aa2aacafbc1e",
                "hex": "47304402204c24e753f63c57c5d2a944d4f0e66c6190f00ecd57cf2bdb24fe5e69f7e5cd970220591bfffa4e31eb124e43bd9bb2e325bd0e3d741c4c69f9d39acf1c72d2fbf30601210257026e027209836532c2cd7807c06e30a889d3cca51884686af8aa2aacafbc1e"
            },
            "sequence": 4294967295,
            "txid": "bbb38720563500d49f9ab60f05c941c0b24fdc6294a63ca667ba45a03be6a2af",
            "vout": 1
        }
    ],
    "vout": [
        {
            "n": 0,
            "scriptPubKey": {
                "addresses": [
                    "MTH4xy3DCx18X5JqUpyfPuGFtX4xuVoWXk"
                ],
                "asm": "OP_DUP OP_HASH160 d48f250ba88b937f29b0dca914f2e0099485078f OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a914d48f250ba88b937f29b0dca914f2e0099485078f88ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 0.1
        },
        {
            "n": 1,
            "scriptPubKey": {
                "addresses": [
                    "MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu"
                ],
                "asm": "OP_DUP OP_HASH160 45fc13c9d3a0df34008291492c39e0efcdd220b8 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 0.8410725
        }
    ],

私が受け取ったときのトランザクション情報

[0]
    "vin": [
        {
            "scriptSig": {
                "asm": "3045022100b18c83115da395e12791b717b32aff754865cac478bb4e72ddde0f0e6c28b28d0220716c20fcd5151e4aeb8c2f898b9735713a596ff8daac03d7169e207c2e4e6743[ALL] 03aedd2422519c7ea14e48116b571903c16d2b4657d4a3ffc0e35646cd7e53be3d",
                "hex": "483045022100b18c83115da395e12791b717b32aff754865cac478bb4e72ddde0f0e6c28b28d0220716c20fcd5151e4aeb8c2f898b9735713a596ff8daac03d7169e207c2e4e6743012103aedd2422519c7ea14e48116b571903c16d2b4657d4a3ffc0e35646cd7e53be3d"
            },
            "sequence": 4294967295,
            "txid": "e1e94be2b6f541e6639d9bd1cce79ac9a668dd25b0c3bd5f48c411ade94f8003",
            "vout": 1
        }
    ],
    "vout": [
        {
            "n": 0,
            "scriptPubKey": {
                "addresses": [
                    "MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu"
                ],
                "asm": "OP_DUP OP_HASH160 45fc13c9d3a0df34008291492c39e0efcdd220b8 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 1.14114
        },
        {
            "n": 1,
            "scriptPubKey": {
                "addresses": [
                    "M9hY5XcC7MSD54DfqcEojiKm9QMgXeQhGK"
                ],
                "asm": "OP_DUP OP_HASH160 13bd7f2032c935652371722ae6d987f2f8135aac OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91413bd7f2032c935652371722ae6d987f2f8135aac88ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 1.02124906
        }
    ],

私が受け取ったときのトランザクション情報(上記とはvoutの支払いとおつりの順が逆)

[119]
    "vin": [
        {
            "scriptSig": {
                "asm": "0014e686e3fd74e712e103f632b8676eaaa3e18fbed9",
                "hex": "160014e686e3fd74e712e103f632b8676eaaa3e18fbed9"
            },
            "sequence": 4294967294,
            "txid": "24c394ae84801c59bb06286b1dea2bc03c92135fff2a3a51e7a9ac82486c84e6",
            "txinwitness": [
                "3044022061608a316fb340582e0407c9e2e36353215b2696fa5d92db5380486ef556f5d40220797316e9b8faea0b97060bb7b8762393eae014041e18b1f0a9de26b549171f3301",
                "02eeb0ab5a2c4cd4d37e3145c25ff3869a4a35d3485bcdc7c6ea8d6e13b7bb385a"
            ],
            "vout": 0
        }
    ],
    "vout": [
        {
            "n": 0,
            "scriptPubKey": {
                "addresses": [
                    "PA4VfmdnyNx69Ddr86gTLZ8W3znCjdaCgy"
                ],
                "asm": "OP_HASH160 1022cfadfea1bf5844fcbdc1b1175567b13fd302 OP_EQUAL",
                "hex": "a9141022cfadfea1bf5844fcbdc1b1175567b13fd30287",
                "reqSigs": 1,
                "type": "scripthash"
            },
            "value": 11.950069
        },
        {
            "n": 1,
            "scriptPubKey": {
                "addresses": [
                    "MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu"
                ],
                "asm": "OP_DUP OP_HASH160 45fc13c9d3a0df34008291492c39e0efcdd220b8 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 0.001
        }
    ],

トランザクションを元帳にどうやって取り込むか

  • トランザクションを作る
  • Bitcoinネットワークに送る
    • Bitcoinクライアントはトランザクションを他のクライアントに送る
    • クライアントは見たことのないトランザクションを受信すると他のノードに送る
    • これにてP2Pネットワーク上にある大半のクライアントに数秒以内で到達する
    • 取引相手に到達すると、自分への支払いであると認識できる
      • アウトプットが自分の秘密鍵で復号できるため
      • 確認する
        • このトランザクションが正規の形式であるか
        • 未使用のインプットを使っているか
        • トランザクションをブロックに取り込むのに十分な手数料を含んでいるか
      • 確認できたらブロックに取り込まれるであろうと予想できる

もしやvoutにあるscriptPubKeyasm,hexなどを使えば、自分への支払いか受け取りかが判別できるのか?

秘密鍵はたぶんmpurseで入力するパスワードのことだろう。それを使ってasmだかhexだかを解析するのか?

そんなことは一言も書いてない。違うかな。

なんにせよ、さらに読み進めてみる必要がありそう。272ページもあるのか……。少しずつやろう。