Scrooge Coin 取引の実装

Scrooge Coin 取引の有効性確認」の続きです.

ここでは, 前回まで見てきた Scrooge Coin 取引の理論を Java で実装してみます.
これは Princeton 大学の講義 “Bitcoin and Cryptocurrency Technologies” のプログラミング課題の1つです.

下表に, 使用するクラス一覧とその説明を纏めました.

表1 クラスの仕様 (概要)

FileDescription
Crypto.java電子署名の有効性を確認する verifySignature() メソッドを含んだ Crypto クラス.
Transaction.javaScrooge Coin の取引を表す Transaction クラス.
内部クラスに Transaction.Outputと Transaction.Input がある.
TxHandler.java取引の有効性を確認する isValidTx() メソッドと, 各取引の有効性を確認し受け入れた取引について
現在の UTXO プールを更新する handleTxs() メソッドを含んだ TxHandler クラス.
UTXO.javaUnspent Transaction Output を表す UTXO クラス.
フィールドとして, UTXO が発生した取引のハッシュ値と, その取引内の対応するインデックスが含まれる.
UTXOPool.javaUTXO たちの現在のコレクションを表し,
各 UTXO から対応する取引の出力へのマップを含む UTXOPool クラス.

今回は, 次のような API を実装する TxHandler クラスを作成します.
ただし, ここでは処理の流れを分かりやすく表現するために擬似コードで書きました.

public class TxHandler {

    Declares the field utxoPool;

    public TxHandler(UTXOPool utxoPool) {
        Initializes the field utxoPool with the argument value utxoPool;
    }

    public boolean isValidTx(Transaction tx) {
        Declare the HashSet with UTXO type;
        Initializes the input value is 0.0;
        Initializes the output value is 0.0;

        Loop i = 0, 1, ..., number of elements stored in the input of tx
            Creates a new UTXO corresponding to the output 
            with index outputIndex in the transaction whose hash is prevTxHash;

            if (!all outputs claimed by tx are in the current UTXO pool) {
                return false;
            }

            if (!the signatures on each input of tx are valid) {
                return false;
            }

            if (UTXO is claimed multiple times by tx) {
                return false;
            }
            Adds the UTXO to Set;
            Adds the previous output value to the input value;
        End i Loop

        Loop i = 0, 1, ..., number of elements stored in the output of tx
            if (!all of txs output values are non-negative) {
                return false;
            }
            Adds the value to the output value;
        End i Loop

        if (output value > input value) {
            return false;
        }

        return true;
    }

    public Transaction[] handleTxs(Transaction[] possibleTxs) {
        Declares the HashSet with Transaction type;

        Loop i = 0, 1, ..., number of elements stored in the possibleTxs
            if (transaction is valid) {
                Adds the transaction to Set;

                    Loop i = 0, 1, ..., number of elements stored in the input of transacion
                        Creates a new UTXO corresponding to the output with 
                        index outputIndex in the transaction whose hash is prevTxHash;
                        Removes the UTXO from the utxoPool;
                    End i Loop
                    Loop i = 0, 1, ..., number of elements stored in the output of transacion
                        Creates a new UTXO corresponding to the output with 
                        index i in the transaction;
                        Adds a mapping from UTXO to transaction output to the utxoPool;
                    End i Loop
            }
        End i Loop

        return a valid transaction array;
    }
}

Scrooge Coin 取引の実装 Read More »

Scrooge Coin 取引の有効性確認

Scrooge Coin の取引形態」の続きです.

まず, Scrooge Coin 取引のデータ構造について説明します.

全ての取引は, 複数の入出力から構成されます.
取引の出力は, 金額とそれが支払われる受信者のアドレス (公開鍵) で構成されます.
取引の入力は, 対応する出力を含む前の取引のハッシュ値, その取引におけるこの出力のインデックス (0から始まる整数),
およびコインの所有者の電子署名で構成されます.

入力が有効であるためには, それに含まれる署名が本取引に対する有効な署名でなければなりません.
コインの所有者が自分のコインを消費することに同意していなければ, 取引は無効となります.


図1 Scrooge Coin 取引のデータ構造

ここで, 取引1は, CreateCoins 取引であり, 新規コインを作成するものであるため, 入力を持ちません.
そして, 最初の所有者にコインを出力します.
また, これは新規コインを作成する取引のため, 署名は不要です.
取引2および3は, PayCoins 取引であり, 入出力から構成されています.

次に, Scrooge Coin 取引が有効であるためには, どの様なことを確認すれば良いか見てみましょう.
以下5つの条件が満たされれば, PayCoins 取引は有効であると宣言されます:

  1. 取引が要求する全ての出力は, 現在の UTXO プールにある,
  2. 取引の各入力の署名は有効である,
  3. 取引によって複数回要求された UTXO はない,
  4. 取引のすべての出力金額は非負である,
  5. 取引の入力金額合計は, 出力金額合計以上であり, それ以外は偽である.

ここで, UTXO (Unspent Transaction Output) とはブロックチェーンに記録された未消費コインを意味し,
その集まりを UTXO プールと呼びます.
つまり一連の取引の流れにおいて, 取引の出力 (Transaction Output) は,
誰も消費していない (Unspent) コインと捉えることができます.
そして, その出力は次の受信者にとっては入力となります.
その取引が入力として消費されると, UTXO プールから削除されます.

有効な取引を Scrooge がブロックに追加してブロックチェーンに連結することで,
この取引が行われたことを誰でも知ることができるようになります.

Scrooge Coin 取引の実装」に続きます.

Scrooge Coin 取引の有効性確認 Read More »

Scrooge Coin の取引形態

単純な仮想通貨 Scrooge Coin のブロックチェーン」の続きになります.

ここでは, Scrooge Coin の取引形態について説明します.
Scrooge Coin には2種類の取引があります.

1. CreateCoins 取引
この取引では, 1度の取引で複数のコインを作成することができます.
全てのコインには, シリアル番号, 金額, 受信者 (最初の所有者の公開鍵) の情報があります.
つまり, この取引形態では, 複数の新規コインを作成し, それを最初の所有者に与えることができます*1.

*1 CreateCoins 取引は, Bitcoin で言うところの Coinbase 取引に似ています.

各コインのシリアル番号は, 例えば coinID12(0) で表し, 取引12で作成された1番目のコインを意味します.
Scrooge Coin の定義により, CreateCoins 取引は, Scrooge が署名する限り, 常に有効です.

図1 CreateCoins 取引

2. PayCoins 取引
この取引では, 幾つかのコインを消費して破棄し, 同じ金額の新規コインを作ります.
そのコインは別の人 (公開鍵) のものになる可能性もあります.

各新規コインには, CreateCoins 取引と同様にシリアル番号, 金額, 受信者の情報があります.

さらにこの取引では, コインを支払う全員が署名しなければならず,
コインの消費を許可するために, 消費されるコインの所有者の全ての署名が必要となります.

図2 PayCoins 取引

ここで, PayCoins 取引で見たように, Scrooge Coin 自体は不変であることに注意しましょう.
つまり分割や結合されることはなく, 各コインは1取引の中で1度だけ作成され, 将来の別の取引で消費されます.

しかし, PayCoins 取引を使えば, コインの分割や結合ができるのと同じ効果が得られます.
例えば, 自分が所有している2コインを結合するためには,
その2コインを消費すると共に消費合計金額と同じ新規コインを1つ作るような取引を作成します.
この場合, その新規コインの受信者を自分自身に指定すれば良いことになります.

Scrooge Coin 取引の有効性確認」に続きます.

Scrooge Coin の取引形態 Read More »