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

第1回
第2回

<ブロック>
ブロックとは、仕事証明の対象となるものであり、至極簡単に言えば、取引の集まりに仕事証明に必要な幾つかの情報を添付したものです。
採掘者(miner)はブロックに対して仕事証明(十分な量の計算を実行したという証明)を行い、新しい貨幣を生成する取引をブロックの中に格納することによって報酬を得ます(又、他のノードから受信した(或いは、自己が作成した)貨幣を移動する取引を格納することによってその取引に結び付けられている取引手数料も得ます)。
仕事証明には十分な量の計算が必要であり、必要な計算量はネットワーク全体で平均して一定の時間毎に1個の新しい有効な(適切な仕事証明が行われている)ブロックが生成されるように調整されます。そのため、ある期間に(新しい貨幣を生成する取引として)生成される新しい貨幣も又(平均して)一定となる訳です。

さて、ブロックはブロック識別子(block identifier)によって識別されます。ブロック識別子はブロックを直列化したものの暗号学的要約値とします。
どの暗号学的要約関数(又は、それらの組み合わせ)を採用するかは、未だ確定させないでおきます。

前回は、全ての種類の取引を表すTransaction抽象クラスを作りましたが、取引とブロックには多くの共通点があります。

上述したように、ブロックはブロック識別子を有し、一方で、取引は取引識別子を有します。何れの識別子も夫々を直列化したものの暗号学的要約値です。
更に、取引とブロックは双方が(将来の変更のために)バージョン管理を必要とし、有効であるか又は無効であるか判定できる必要があります(無効な取引やブロックはネットワークから排除されることになります)。

そこで、(はっきり言ってしまえば別々に実装するのが面倒なので)取引とブロックで共通の処理を一遍に実装するためのTXBLOCKBASE抽象基底クラスを作ることにしましょう。
取引とブロックという、概念的に異なるものに同一の基底クラスを継承させるのはオブジェクト指向的には若干宜しくないかも知れませんが、まあ良いでしょう。

という訳で、新たにTXBLOCKBASE抽象基底クラスを作り、前回Transaction抽象クラスの中で実装した内容を移動させます。
更に、取引又はブロックが有効であるか否かを判定するIsValid仮想プロパティを実装します。

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


全ての種類のブロックを表すBlock抽象クラスも作ってしまいましょう。

public abstract class Block<BlockidHashType> : TXBLOCKBASE<BlockidHashType> where BlockidHashType : HASHBASE
{
    public Block(int? _version) : base(_version) { }
}