独自暗号貨幣を作ろう 第2回

第1回

<取引>
新しい貨幣の生成や(既存の)貨幣の移動は、Bitcoinと同様に、「取引(transaction)」という形で表すことにします。
取り敢えず、2種類の取引を考えます。

 1.新しい貨幣を生成する取引(coinbase transaction)
 2.貨幣を移動する取引(貨幣の所有者を変更する取引)

全ての種類の取引を表すTransaction抽象クラスを作ります。

public abstract class Transaction { }


取引は取引識別子(transaction identifier:TXID)によって識別されます。取引識別子は取引を直列化(serialize)したものの暗号学的要約値(cryptographic hash value)とします。

どの暗号学的要約関数(cryptographic hash function)(又は、それらの組み合わせ)を採用するかは、未だ確定させないでおきます。
あらゆる種類の要約関数による要約値を表すHASHBASE抽象クラスを作ります。

public abstract class HASHBASE : SHAREDDATA, IComparable<HASHBASE>, IEquatable<HASHBASE>, IComparable
{
(中略)
}


SHAREDDATA抽象クラスはオブジェクトを直列化するための独自基底クラスです。
取引を直列化するのにSHAREDDATA抽象クラスの機能を使うので、Transaction抽象クラスはSHAREDDATA抽象クラスを継承します。バージョンを指定できるようにしておきます。

public abstract class Transaction<TxidHashType> : SHAREDDATA where TxidHashType : HASHBASE
{
    public Transaction(int? _version) : base(_version) { }
}


これで、取引を直列化できますので、Id仮想プロパティを実装します。SHAREDDATA抽象クラスを継承しているので、ToBinaryメソッドで直列化できます。取引の内容が変更された場合には、isModifiedフィールドを真にしなければおかしなことになります。

public abstract class Transaction<TxidHashType> : SHAREDDATA where TxidHashType : HASHBASE
{
    public Transaction(int? _version) : base(_version) { }
 
    protected bool isModified;
 
    protected TxidHashType idCache;
    public virtual TxidHashType Id
    {
        get
        {
            if (isModified || idCache == null)
                idCache = Activator.CreateInstance(typeof(TxidHashType), ToBinary()) as TxidHashType;
            return idCache;
        }
    }
}