次世代電子契約及び分散型応用ソフトウェア基盤#01

 2009年1月、Satoshi NakamotoがBitcoinのブロック鎖(blockchain)を最初に作動させたとき、同時に彼は当時未だ試されたことのなかった急進的な概念を2つ導入していた。1つは「Bitcoin」、即ち、固有の価値や中央発行者のような裏付けを持たずして価値を維持する分散型のP2Pオンライン貨幣である。中央銀行を必要としない貨幣であるという政治的な側面であれ、極めて激しい価格変動であれ、今までのところ、大衆の注目の大部分は貨幣単位としてのBitcoinという部分にあった。しかしながら、Satoshiの壮大な実験には同じく重要なもう1つの部分、即ち、取引(transaction)の順序に関して公衆が同意することを可能にする仕事証明(proof of work)に基づいたブロック鎖の概念があった。応用としてのBitcoinは先願制度と評することができる。ある存在が50BTCを有し、同一の50BTCを同時にA及びBに送金したならば、最初に承認された取引のみが処理されることになる。2つの取引について何れがより早く発生したのかを決定する固有の方法は存在せず、このことが何十年にも亘って分散型の電子貨幣の開発を阻害してきた。Satoshiのブロック鎖は最初の信用できる分散型の解決策であった。そして、現在Bitcoinの技術に対する関心は急激にブロック鎖の部分へと、即ち、ブロック鎖の概念を単なる貨幣以上のもののために使用する方法へと移り始めている。
 良く挙げられる応用としては、ブロック鎖上の電子資産を特別の用途のために作成される貨幣や金融商品を表現するために使用したり(「有色貨幣(colored coin)」)、根底となる物理的なモノの所有権を表現するために使用したり(「電子財産(smart property)」)、領域名(domain name)のような交換不可能な資産を表現するために使用したり(「Namecoin」)することや、分散型交換所、金融派生商品P2P賭博、ブロック鎖上における識別及び評価機能のような、より高度な応用がある。更に、重要な探求領域として「電子契約(smart contract)」がある。電子契約とは、予め制定された規則に従って電子資産を自動的に移動する機能である。例えば、「Aは1日にX貨幣単位まで引き出すことができ、Bは1日にY貨幣単位まで引き出すことができ、A及びBは共同して幾らでも引き出すことができ、AはBの引き出し能力を剥奪することができる」という形式の財務契約を締結することができるかもしれない。電子契約を敷衍したものが分散型自治体(decentralized autonomous organization:DAO)である。分散型自治体とは、長期的な電子契約であり、資産を保有し、組織全体の規則をコード化する。Ethereumが提供しようとしているものは、本格的なTuring完全(Turing-complete)の算譜言語(programming language)が組み込まれたブロック鎖であり、「契約」を作成するのに使用することができ、任意の状態遷移関数(state transition function)をコード化するのに使用することができる。使用者は、単に規則を論理的に数行のコードとして書き上げるだけで、如上の如何なる機能でも作成することができ、更には、我々が未だ嘗て想像したことのないような多くの機能を作成することができる。

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

第1回
第2回第3回

<新しい貨幣を生成する取引>
Bitcoin型の暗号貨幣においては、(全ての種類の)取引には1つ以上の取引入力(transaction input)と、1つ以上の取引出力(transaction output)が含まれます。
取引入力はどの取引出力を使用する(spend)かを表し、使用しようとしている取引出力の所有者の電子署名(digital signature、注:digital signatureと電子署名(electronic signature)は異なる概念ですが、本連載記事では同一視します)を含みます。
取引出力は貨幣の所有者(貨幣を保持する口座番号(address))とその額面価格を表します。
ある取引出力を使用する際には新たに作成した取引入力にその取引出力を結び付けます。当然ながら、既に取引入力が結び付けられている取引出力を別の新たに作成された取引入力に結び付けることはできません(もしこれが可能ならば、貨幣が二重使用(double-spend)できるということになります)。
即ち、Bitcoin型の暗号貨幣においては、貨幣の実体は未使用の取引出力(unspent transaction output:UXTO)です

CREACOINでも、基本的にはBitcoin型の取引入力及び取引出力の考え方を踏襲しますが、新しい貨幣を生成する取引には取引入力が1つも含まれないものとします。特に必要ではない為です。

(因みに、余談ですが、Bitcoinの、新しい貨幣を生成する取引には唯1つの取引入力が含まれます。新しい貨幣を生成する取引は(未使用の)取引出力を使用しようとしている訳ではないので、(新しい貨幣を生成する取引の)取引入力の、どの取引出力を使用するかを表す部分には無意味な無視できる値が格納されます。又、これから生成される貨幣に既に所有者が存在している筈もないので、(新しい貨幣を生成する取引の)取引入力には電子署名も必要ない筈なのですが、本来電子署名が格納される部分には追加の仕事証明の解(extra nonce)が格納されます。これは2バイト以上100バイト以下の任意の値であり、仕事証明の手続きの為に使用されます。尚、将来の拡張でもっと別のデータも格納するようにしようという話があります)。

取引出力を表すTransactionOutputクラスを作ります。
receiverPubKeyHashが貨幣の所有者を表します。Bitcoin型の暗号貨幣は貨幣の所有権が本人性と結び付かず、貨幣の所有者は(追加の情報がなければ本人性と結び付かない)口座番号として表されます。口座番号は楕円曲線DSAの公開鍵の暗号学的要約値です。対応する秘密鍵を知っている者しか有効な署名を作成することはできませんので、貨幣の所有権を間接的に言明する口座を表章するものとして利用することができます。
amountが貨幣の額面価格を表します。
口座番号を計算するのにどの暗号学的要約関数(又は、それらの組み合わせ)を採用するかは、未だ確定させないでおきます。

public class TransactionOutput<PubKeyHashType> : SHAREDDATA where PubKeyHashType : HASHBASE
{
    public TransactionOutput() : base(null) { }
 
    public TransactionOutput(PubKeyHashType _receiverPubKeyHash, CurrencyUnit _amount)
        : base(null)
    {
        receiverPubKeyHash = _receiverPubKeyHash;
        amount = _amount;
    }
 
    public PubKeyHashType receiverPubKeyHash { get; private set; }
    public CurrencyUnit amount { get; private set; }
 
    protected override Func<ReaderWriter, IEnumerable<MainDataInfomation>> StreamInfo
    {
        get
        {
            return (msrw) => new MainDataInfomation[]{
                new MainDataInfomation(typeof(PubKeyHashType), null, () => receiverPubKeyHash, (o) => receiverPubKeyHash = (PubKeyHashType)o),
                new MainDataInfomation(typeof(ulong), () => amount.rawAmount, (o) => amount = new CurrencyUnit((ulong)o)),
            };
        }
    }
}


今回は新しい貨幣を生成する取引を実装しますが、1つ以上の取引出力が必要なのは全ての種類の取引で共通しているので、共通する部分はTransaction抽象クラスに実装します。夫々の種類の取引に特有な部分だけを夫々の具象クラスで実装します。

Transaction抽象クラスを修正します。
outputsが1つ以上の取引出力を表します。

public abstract class Transaction<TxidHashType, PubKeyHashType> : TXBLOCKBASE<TxidHashType>
    where TxidHashType : HASHBASE
    where PubKeyHashType : HASHBASE
{
    public Transaction(int? _version) : base(_version) { }
 
    public Transaction(int? _version, TransactionOutput<PubKeyHashType>[] _outputs)
        : base(_version)
    {
        if (_outputs.Length == 0)
            throw new InvalidDataException("tx_outputs_empty");
 
        outputs = _outputs;
    }
 
    public TransactionOutput<PubKeyHashType>[] outputs { get; private set; }
 
    protected override Func<ReaderWriter, IEnumerable<MainDataInfomation>> StreamInfo
    {
        get
        {
            return (msrw) => new MainDataInfomation[]{
                new MainDataInfomation(typeof(TransactionOutput<PubKeyHashType>[]), null, null, () => outputs, (o) => outputs = (TransactionOutput<PubKeyHashType>[])o),
            };
        }
    }
}


新しい貨幣を生成する取引を表すCoinbaseTransactionクラスを実装します。
とは言え、新しい貨幣を生成する取引は1つ以上の取引出力しか含まないので、Transaction抽象クラスを継承(して、幾つかのプロパティをオーバーライド)するだけです(Bitcoinの場合、もう少し追加の機能があったりするのですが、取り敢えずは単純なものを考えましょう。必要なら後で追加実装すれば良いでしょう)。

public class CoinbaseTransaction<TxidHashType, PubKeyHashType> : Transaction<TxidHashType, PubKeyHashType>
    where TxidHashType : HASHBASE
    where PubKeyHashType : HASHBASE
{
    public CoinbaseTransaction() : base(0) { }
 
    public CoinbaseTransaction(TransactionOutput<PubKeyHashType>[] _outputs) : base(0, _outputs) { }
 
    protected override Func<ReaderWriter, IEnumerable<MainDataInfomation>> StreamInfo
    {
        get
        {
            if (Version == 0)
                return base.StreamInfo;
            else
                throw new NotSupportedException("coinbase_tx_main_data_info");
        }
    }
 
    public override bool IsVersioned { get { return true; } }
}

独自暗号貨幣を作ろう 第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) { }
}

独自暗号貨幣を作ろう 第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;
        }
    }
}

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

これから独自の暗号貨幣(cryptocurrency)を作る試みを連載していこうと思います。
コードはGitHubで公開します。
https://github.com/pizyumi/CREA


<方針1>
基本的にはBitcoinと同様の、仕事証明(proof of work)に基づく分散型の合意形成系を用いた暗号貨幣を作ります。
細かい部分に関してはBitcoinの改良を目指します。
Bitcoinのコードを利用せず、全て自分で書きます。
C#で書きます。
暗号貨幣の名称はCREACOIN(クレアコイン)とします。


<貨幣単位>
主貨幣単位(貨幣の額面価格の主たる単位)はcreacoin(CREA)とし、補助貨幣単位(貨幣の額面価格の補助的な単位)は1CREA=100yuminaとします(更に補助貨幣単位を公募するかも知れません)。貨幣の最小額面価格はBitcoinと同様に0.00000001CREAとします。便宜上、額面価格を保持する際には最小額面価格を単位として表現するものとします。

全ての貨幣単位(による額面価格)を表すCurrencyUnitクラス並びに主貨幣単位creacoin及び補助貨幣単位yumina(による額面価格)を表すCreacoinクラス及びYuminaクラスを作ります。
rawAmountが最小額面価格を単位として表した場合の額面価格です。
Amountがその貨幣単位による額面価格です。

public class CurrencyUnit
{
    public CurrencyUnit() { }
 
    public CurrencyUnit(ulong _rawAmount) { rawAmount = _rawAmount; }
 
    public ulong rawAmount { get; protected set; }
 
    public virtual decimal Amount { get { throw new NotImplementedException("currency_unit_amount"); } }
    public virtual Creacoin AmountInCreacoin { get { return new Creacoin(rawAmount); } }
    public virtual Yumina AmountInYumina { get { return new Yumina(rawAmount); } }
}
 
public class Creacoin : CurrencyUnit
{
    public Creacoin(ulong _rawAmount) { rawAmount = _rawAmount; }
 
    public Creacoin(decimal _amountInCreacoin)
    {
        if (_amountInCreacoin < 0.0m)
            throw new ArgumentException("creacoin_out_of_range");
 
        decimal amountInMinimumUnit = _amountInCreacoin * CreacoinInMinimumUnit;
        if (amountInMinimumUnit != Math.Floor(amountInMinimumUnit))
            throw new InvalidDataException("creacoin_precision");
 
        rawAmount = (ulong)amountInMinimumUnit;
    }
 
    public static decimal CreacoinInMinimumUnit = 100000000.0m;
 
    public override decimal Amount { get { return rawAmount / CreacoinInMinimumUnit; } }
    public override Creacoin AmountInCreacoin { get { return this; } }
}
 
public class Yumina : CurrencyUnit
{
    public Yumina(ulong _rawAmount) { rawAmount = _rawAmount; }
 
    public Yumina(decimal _amountInYumina)
    {
        if (_amountInYumina < 0.0m)
            throw new ArgumentException("yumina_out_of_range");
 
        decimal amountInMinimumUnit = _amountInYumina * YuminaInMinimumUnit;
        if (amountInMinimumUnit != Math.Floor(amountInMinimumUnit))
            throw new InvalidDataException("yumina_precision");
 
        rawAmount = (ulong)amountInMinimumUnit;
    }
 
    public static decimal YuminaInMinimumUnit = 1000000.0m;
 
    public override decimal Amount { get { return rawAmount / YuminaInMinimumUnit; } }
    public override Yumina AmountInYumina { get { return this; } }
}

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

これから独自の暗号貨幣(cryptocurrency)を作る試みを連載していこうと思います。
コードはGitHubで公開します。
https://github.com/pizyumi/CREA


<方針1>
基本的にはBitcoinと同様の、仕事証明(proof of work)に基づく分散型の合意形成系を用いた暗号貨幣を作ります。
細かい部分に関してはBitcoinの改良を目指します。
Bitcoinのコードを利用せず、全て自分で書きます。
C#で書きます。
暗号貨幣の名称はCREACOIN(クレアコイン)とします。


<貨幣単位>
主貨幣単位(貨幣の額面価格の主たる単位)はcreacoin(CREA)とし、補助貨幣単位(貨幣の額面価格の補助的な単位)は1CREA=100yuminaとします(更に補助貨幣単位を公募するかも知れません)。貨幣の最小額面価格はBitcoinと同様に0.00000001CREAとします。便宜上、額面価格を保持する際には最小額面価格を単位として表現するものとします。

全ての貨幣単位(による額面価格)を表すCurrencyUnitクラス並びに主貨幣単位creacoin及び補助貨幣単位yumina(による額面価格)を表すCreacoinクラス及びYuminaクラスを作ります。
rawAmountが最小額面価格を単位として表した場合の額面価格です。
Amountがその貨幣単位による額面価格です。


public class CurrencyUnit
{
    public CurrencyUnit() { }
 
    public CurrencyUnit(ulong _rawAmount) { rawAmount = _rawAmount; }
 
    public ulong rawAmount { get; protected set; }
 
    public virtual decimal Amount { get { throw new NotImplementedException("currency_unit_amount"); } }
    public virtual Creacoin AmountInCreacoin { get { return new Creacoin(rawAmount); } }
    public virtual Yumina AmountInYumina { get { return new Yumina(rawAmount); } }
}
 
public class Creacoin : CurrencyUnit
{
    public Creacoin(ulong _rawAmount) { rawAmount = _rawAmount; }
 
    public Creacoin(decimal _amountInCreacoin)
    {
        if (_amountInCreacoin < 0.0m)
            throw new ArgumentException("creacoin_out_of_range");
 
        decimal amountInMinimumUnit = _amountInCreacoin * CreacoinInMinimumUnit;
        if (amountInMinimumUnit != Math.Floor(amountInMinimumUnit))
            throw new InvalidDataException("creacoin_precision");
 
        rawAmount = (ulong)amountInMinimumUnit;
    }
 
    public static decimal CreacoinInMinimumUnit = 100000000.0m;
 
    public override decimal Amount { get { return rawAmount / CreacoinInMinimumUnit; } }
    public override Creacoin AmountInCreacoin { get { return this; } }
}
 
public class Yumina : CurrencyUnit
{
    public Yumina(ulong _rawAmount) { rawAmount = _rawAmount; }
 
    public Yumina(decimal _amountInYumina)
    {
        if (_amountInYumina < 0.0m)
            throw new ArgumentException("yumina_out_of_range");
 
        decimal amountInMinimumUnit = _amountInYumina * YuminaInMinimumUnit;
        if (amountInMinimumUnit != Math.Floor(amountInMinimumUnit))
            throw new InvalidDataException("yumina_precision");
 
        rawAmount = (ulong)amountInMinimumUnit;
    }
 
    public static decimal YuminaInMinimumUnit = 1000000.0m;
 
    public override decimal Amount { get { return rawAmount / YuminaInMinimumUnit; } }
    public override Yumina AmountInYumina { get { return this; } }
}

Namecoin及び.bitドメインとは何か?

What are Namecoins and .bit domains?の翻訳です。

 

 あなたは恐らくNamecoinという名前のデジタル通貨を聞いたことがないのではないだろうか? NamecoinはBitcoinソースコードを元にして作られており、実際のところ、この2つの通貨は殆ど同一である。しかし、Bitcoinが誰によっても停止することのできない分散型の通貨であるのと同様に、Namecoinは分散型のドメイン名システム(DNS)、すなわち、ウェブにおけるURLの基盤を提供する。そして、分散型のDNSはインターネット検閲を防止することができる。

DNSとは何か?
 我々はよくブラウザや電子メールプログラムにcoindesk.comのような文字列からなるアドレスを入力しているが、インターネットはこのような文字列からなるアドレスを直接使って動作しているのではない。実際のところ、インターネットはIPアドレスと呼ばれる数値によって表現されるアドレスを使って動作している。それは我々が電話番号を使って電話するようなものである。ここで問題となるのは番号は覚えにくいということである。そこで、インターネットの利用をより容易なものとするため、インターネットの広範囲を網羅するアドレス帳が作られた。それがドメイン名システム(DNS)である。
 ブラウザにアドレスを入力すると、実際のところ、計算機やモバイル装置はDNSサーバに問い合わせを行っている。目的のサーバからデータを取得するためには、目的のサーバのIPアドレスを知る必要があるのである。たとえば、ブラウザにgoogle.comと入力すると、計算機はGoogleIPアドレスを知るためにDNSサーバに問い合わせを行い、DNSサーバは173.194.70.113のような数字を返す。
 ドメインの末尾の部分、たとえば、.comは最上位ドメインTLD)と呼ばれる。TLDドメイン名システムにおいて中心的な役割を果たす機関によって管理されている。たとえば、.comドメインは米国にあるICANNが管理している。このような機関は、登録機関として知られている独立した企業がドメイン名の注文を受け付け、顧客サービスを行うことを許可している。
 あるウェブサイトに対して不満があっても、そのウェブサイトの処遇に関して最終的な発言力があるのはTLDを管理している機関である。現実には、殆どの場合、弁護士や著作権者などは単にドメインの登録業者に連絡を行うだけであるが、機関から命令が下る可能性が潜在的に存在するという点は、検閲に苦しめられている集団にとって懸案事項に他ならない。

分散化はどのようにして役立つのか?
 分散型DNSの意味するところは、如何なる機関によっても所有されることのないTLDを作ることができるということと、DNSの索引表がP2Pシステムによって共有されるということである。我々一般人のために分散型DNS用に特別に作られたDNSサーバソフトウェアを無償で動かしてくれる者がいる限り、我々はいつでも分散型DNSによって管理されているドメインに接続することができる。そうなると最早機関は、物理的なサーバを没収する他に、P2PTLDの動作に影響を与えるような制限を課すことができなくなる。

暗号通貨と何の関係があるのか?
 ビットコインの仕組みはP2Pシステムを必要とする。P2Pシステムの参加者が一連の取引を継続的に検証しているため集中的な管理を必要としないのである。ビットコインプロトコルを改良して、この仕組みをDNSに直接適用した結果がNamecoin(NMC)と呼ばれるものである。最も重要なのは、ビットコインとは別の新しい起源ブロックが作成されたという点である。そのため、ビットコインとは別の完全に新しいブロック鎖が生成されることになる。このようにすることで、NamecoinとBitcoinが相互作用したり、互いに妨げ合ったりすることがないようにすることができる。次に重要なのは、Namecoinの開発者が別の新しいDNSが必要になる場合のことを考えて複数の種類の取引の型を用意したということである。2100万枚以上の貨幣が生成されることはないということと、暗号学的な問題が解かれて新しいブロックが生成される度に50枚の貨幣が生成されるということは、ビットコインと同様である。

.bitドメインを登録するためにNamecoinを使用する方法
 .bitドメインドメイン2.0と呼ばれている名前空間の最初で唯一のTLDである。新しいドメインを登録したり、既存のドメインを更新したりするのに必要な動作は、上述の新しい種類の取引を用いてNamecoinプロトコルに組み込まれている。
 Namecoinの取引には3種類のものがある。
  ・name_new・・・登録費用は0.01NMCである。この取引はドメイン固定費用の前注文を構成する。
  ・name_firstupdate・・・登録費用は0NMCである。この取引はドメインを登録し、ドメインを使ったウェブサイトを閲覧できる状態にする。
  ・name_update・・・登録費用は0NMCである。この取引はドメインの更新及び譲渡のために使用される。
 全てのNMCの取引には0.005NMCの手数料が課される。
 結局のところ、Namecoinシステムはドメインを使用したい者が自分でドメインを登録するという形態を取っているが、ドメインを登録するために利用することができる外部サービスも幾つか存在している。このようなサービスではBTC払いでドメイン登録の処理を依頼することができる。更には、ドメインの詳細の変更やドメインの自動更新を分かりやすいインターフェイスを使って行うことができる。
  ・http://register.dot-bit.org/
  ・Namecoin.com
  ・Dotbit.me

.bitドメインのウェブサイトを閲覧する方法
 Namecoin.comは少なくとも450のドメインを登録したと主張している。Bitcoin Contactのウェブサイトによると、全部で7万7000の登録された.bitドメインが存在する。それは良いとして、これらのドメインは標準のDNSの一部ではないため、単にブラウザにwikileaks.bitのようにドメインを入力しただけではウェブサイトを閲覧することができない。
 幸いにも、ブラウザにおけるDNS要求を正常に処理する代理ウェブサーバがある。更に閲覧を容易にするために、Namecoin.comを使用するFirefox及びChrome用の拡張機能がある。

NamecoinとBitcoinはどのようにして相互補完するのか?
 この2つのデジタル通貨が相互作用することはないが、実際のところ、これらは同一の種類の数学的な問題に依拠している訳である。そのため、Bitcoinを採掘するために使用することができる装置はNamecoinを採掘するためにも使用することができる。しかも、混合採掘と呼ばれる、採掘機器が暗号学的な問題に対する可能性のある解を発見した場合に、BitcoinとNamecoin両方のブロック鎖に問い合わせを行うように設定する方法もある。Dot-bitウィキではこの方法を当選確率を上げるために同一の券を使って2つの宝くじに参加する方法と表現している。

これはあなたにどのような影響を与えるのか?
 読者の99%は.bitドメインのウェブサイトやサービスを作成する必要がないだろう。しかし、諺にもあるように、情報は力である。そのため、.bitドメインのウェブサイトや電子メールアドレスに接続することができるということは重要である。
 この技術が他の技術と同様に濫用され得るというのは確かである。そうであるから、良い点悪い点を知るために.bitドメインのウェブサイトやサービスを閲覧することができなければならないのである。
 しかし、何より重要なのは、.bitドメインのウェブサイトを閲覧することができるということは、正当な意見を有する人々の口を封じようとする企てが成功しにくいということである。