「Scrooge Coin 取引の有効性確認」の続きです.
ここでは, 前回まで見てきた Scrooge Coin 取引の理論を Java で実装してみます.
これは Princeton 大学の講義 “Bitcoin and Cryptocurrency Technologies” のプログラミング課題の1つです.
下表に, 使用するクラス一覧とその説明を纏めました.
表1 クラスの仕様 (概要)
File | Description |
---|---|
Crypto.java | 電子署名の有効性を確認する verifySignature() メソッドを含んだ Crypto クラス. |
Transaction.java | Scrooge Coin の取引を表す Transaction クラス. 内部クラスに Transaction.Outputと Transaction.Input がある. |
TxHandler.java | 取引の有効性を確認する isValidTx() メソッドと, 各取引の有効性を確認し受け入れた取引について 現在の UTXO プールを更新する handleTxs() メソッドを含んだ TxHandler クラス. |
UTXO.java | Unspent Transaction Output を表す UTXO クラス. フィールドとして, UTXO が発生した取引のハッシュ値と, その取引内の対応するインデックスが含まれる. |
UTXOPool.java | UTXO たちの現在のコレクションを表し, 各 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 取引の有効性確認 – NAKAGAWA's Website