Qaupot Blog
Software Engineering, Trip

この文書はコンピューター工学知識が一部必要です。

Transaction

Transactionは電子決済やコンピュタ工学のDatabase Transactionをイメージするのができます。

’AがBに$100を支払った’と言うTransactionがあるのら、下の定義が成立します。

  • 支払人 (payer)
  • 受取人 (payee)
  • 資産 $100

Bitcoinは”Payment System”に近いから、上の定義に似ている形を持ちますが、 Ethereumのケースは"World's Computer"と言う言葉通り、”Computing System”に近い、コンピュター工学のDatabase Transactionに似ている定義を持ちます。

Bitcoin Unspent Transaction Output (UTXO)

BitcoinはTransactionを処理する時、UTXOを使用します。

上の内容を改めて見ると、下と同じだと解ることができます。

  • 支払人 (payer) : Transaction Input
  • 受取人 (payee) : Transaction Output
  • 資産 $100 : Transaction Amount

Unspent Transaction Outputはまだ消費していないOutputの意味になります。

一つのTransactionは多数のInputと多数のOutputで構成されて、 Bitcoinの全TransactionはCoinBase(新規発行)を除外すると、Input Amount - Output Amount - Fee = 0にならなければなりません。

  • 上の定義に従って,BitcoinはFeeを別のデータで表記していません。代わりに、Input Amount - Output AmountをFeeで扱いします。計算で間違いがある時、過多料金を支払う事になる時も有ります。

Bitcoin Raw Transaction

例はHeight 1のTransaction ( 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098 ) Hexです。

01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0104ffffffff0100f2052a0100000043410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac00000000
Name Byte Description Example
Version 4 バージョン 01000000
Input Count 1 Input 01
(Countほど繰り返し)
Input - TxID 32 どのTxを消費(Spent)するのか 00000000 ...
Input - VOut 4 ffffffff
Input - Script Size 1 scriptの長さ 07
Input - Script Var script 04ffff001d0104
Input - Sequence 4 (非利用) ffffffff
(繰り返しエンド)
Output Count 1 Output 01
(Countほど繰り返し)
Output - Value 8 Little Endian Satoshi 00f2052a01000000
Output - Script Size 1 scriptの長さ 43
Output - Script Var script 410496b5 ...
(繰り返しエンド)
Lock Time 4 0ならば, ロックなし 00000000
  • Lock Time :
    • 500,000,000 以上なら,Unix Timeで解析になります。
    • 500,000,000 以下なら,Block Heightで解析になります。
  • Value : Little Endianです。注意しましょう。
    • 00f2052a01000000をLittle Endianで読むと000000012a05f200になります。
    • 12a05f200 (Hex) = 5000000000 (Decimal) satoshi = 1 BTC.

Bitcoin Transaction Script

Raw Transactionの構成を見ると、payerやpayee定期が有りません。Addressも登場しないです。秘密はScript中に隠れています。

ScriptはBitcoinで動くプログラムで、色んな命令コードで構成されています。 プログラミング的にはBitcoin Machineの上で動くScriptだと表現できます。

Op Code目録はここでは説明しません。Scriptに付いて詳しい内容は Bitcoin Wiki を確認お願いします。

例は有名なscriptの中pay-to-pubkey-hashと言う名前を持っているscriptです。

scriptPubKey (Output Script) : OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig (Input Script) : <sig> <pubKey>

(Reference : Bitcoin Wiki)

例はAがBへ送金するケースを表現します。

  • BはAへ自分のAddressを知らせます。
  • AはBへ自分のまだ使っていない資産を使用して新しい資産を作ります。

改めて見ると、

  • BはAへ自分の”pubKeyHash”を知らせます。
  • AはBへ自分のUTXOをInputとして、Bが次Inputで使うことができる新しいOutputを作ります。
    • その時、AのUTXOを消費する為、”sig”と”pubKey”を入力します。
    • 当たり前ですが、Outputに必要な”sig”と”pubKey”を知らない人はことUTXOを使うことができません。

Outputに必要なInputが提供すると,Bitcoinで実行され,Transactionが処理されます。

Stack Script
Empty. <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
<sig> <pubKey> <pubKey> OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
<sig> <pubKey> OP_CHECKSIG
true Empty.
(Reference : Bitcoin Wiki)

Comparing of Bitcoin and Ethereum Transaction

EthereumはUTXOを使用しません。代わりに、Transactionにsenderとreceiverが明視的に書きされます。

UTXO構成はTransaction互い連結されていますので、別のTransaction実行順序を管理する必要がないメリットが有ります。

  • Transactionが所立する為、Transactionがレファレンスしている全てのTransaction Outputがまだ消費していないことが必要です。
  • すでに消費しているTransaction Outputを元には他のTransactionを作るのができません。

EthereumはTransaction互いに関係なしです。Addressのstateを利用して、ラースト状態を確認します。

  • その代わり、順次に増加するNonceを指定してTransactionを処理番を決めます。
  • 例) Nonce 3はNonce 1とNonce 2が処理された後処理できます。次のNonceは4です。

Transaction Propagation (Transaction伝播)

Transactionを作った後にはBlockchain Networkへ伝播して他の参加者から検証と承認を貰うことが必要です。

最初Transactionを作ったNodeと伝播されたNodeは自分と繋がっている他のNodeへTransactionを伝播します。 Transactionを伝播されたNodeも自分と繋がっている他のNodeへTransactionを伝播します。

Reference

  • この文書は韓国語文書から翻訳されています。韓国語文書が原文になります。
  • Bitcoin Wiki
이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.