暗号理論

キーペア

鍵ペアは秘密鍵と公開鍵で構成されます:

  • 秘密鍵: エンティティ に署名するために使用するランダムな 256-bit 整数
  • 公開鍵: キーペアの公開識別子。対となる秘密鍵で署名されたエンティティを証明します。

公開鍵は暗号理論によって秘密鍵から導出されます。Catapult は Twisted Edwards curveEd25519 と呼ばれるデジタル署名アルゴリズムと共に使用します。

catapult-server の crypto モジュール下に implementation があります。

アドレス

NEM アドレスは次のものからなる base-32 でエンコードされたトリプレットです:

  • ネットワークバイト
  • アカウントの公開鍵の 160-bit ハッシュ
  • アドレスのミスタイプを素早く確認するための 4 byte チェックサム

次のステップでは 公開鍵をアドレスに変換 します:

Address PublicKeyToAddress(const Key& publicKey, NetworkIdentifier networkIdentifier) {
        // step 1: sha3 hash of the public key
        Hash256 publicKeyHash;
        CatapultHash(publicKey, publicKeyHash);

        // step 2: ripemd160 hash of (1)
        Address decoded;
        crypto::Ripemd160(publicKeyHash, reinterpret_cast<Hash160&>(decoded[1]));

        // step 3: add network identifier byte in front of (2)
        decoded[0] = utils::to_underlying_type(networkIdentifier);

        // step 4: concatenate (3) and the checksum of (3)
        Hash256 step3Hash;
        CatapultHash(RawBuffer{ decoded.data(), Hash160_Size + 1 }, step3Hash);
        std::copy(step3Hash.cbegin(), step3Hash.cbegin() + Checksum_Size, decoded.begin() + Hash160_Size + 1);

        return decoded;
}
  1. 公開鍵の SHA3-256
  2. ripemd160 で (1) のハッシュを生成。
  3. ネットワーク識別バイトを (2) の前に追加する。
  4. 上記 (3) と (3) のチェックサムを結合する。

上記の説明通り、ブロックチェーンとの疎通無しにアドレスを作ることができます。ブロックチェーンは最低でも1つのトランザクションが関係するアドレスだけを追跡します。