アカウントと暗号鍵

Casperブロックチェーンが使用しているアカウントベースモデルは、特定のPublicKey(公開鍵)のAccountHashによって指定されたユニークなものです。

ブロックチェーンでの取引は、アカウント作成に用いた公開鍵のキーペアで暗号署名されたデプロイの形式がデフォルトとなっています。

Casperのプラットフォームでは、アカウント作成とトランザクションの署名には2つのタイプの鍵が使用されています。

  • ed25519 鍵は、エドワーズ曲線デジタル署名アルゴリズム (EdDSA)を使用しています。
  • secp256k1 鍵は、一般的にはイーサリアムの鍵として知られています。

どちらのフォーマットを使用しても鍵を生成できますし、既存のイーサリアムの鍵を使用することも可能です。

Casperのコマンドラインクライアントを用いて公開鍵からアカウントハッシュを生成することも可能です。

アカウントと鍵の生成

Casperブロックチェーンのアカウント作成時に暗号鍵のペアが生成され、それはCasper コマンドラインクライアントブロックエクスプローラ(cspr.live)を使用する際に必要となります。

💡NOTE

出来ればオフラインの安全な場所に鍵を保存してください。

Option 1: Casper Clientを用いた鍵の生成

 Casper コマンドラインクライアントを用いた両方のタイプの鍵によるアカウントセットアップ方法について説明しています。

EdDSA 鍵

P-256カーブのECDSAアルゴリズムを使用するSecp256k1を生成する為には、以下のステップに従ってください。

mkdir ed25519-keys
casper-client keygen ed25519-keys/
tree ed25519-keys/

下記の tree コマンドの出力サンプルは、ed25519-keysフォルダー内のコンテンツを表示しています。

ed25519-keys/
├── public_key.pem
├── public_key_hex
└── secret_key.pem

0 directories, 3 files

生成されたファイルの詳細は下記のとおりです。

  1. public_key.pem:  PEMに符号化された公開鍵
  2. public_key_hex:  16進数に符号化された文字列の公開鍵
  3. secret_key.pem:  PEMに符号化された秘密鍵

Ed25519鍵のpublic-key-hexは、01で始まり66バイト長となっています。

cat ed25519-keys/public_key_hex
011724c5c8e2404ca01c872e1bbd9202a0114e5d143760f685086a5cffe261dabd

ECDSA鍵

下記ステップに従って、一般的にイーサリアム鍵として知られているsecp256k1鍵をCasper command-line clientで生成してください。

mkdir secp256k1-keys
casper-client keygen -a secp256k1 secp256k1-keys/
tree secp256k1-keys/

tree コマンド出力サンプルは、secp256k1-keysフォルダー内のコンテンツを表示しています。

secp256k1-keys/
├── public_key.pem
├── public_key_hex
└── secret_key.pem

0 directories, 3 files

Secp256k1鍵のpublic-key-hexは、02で始まり68バイト長となっています。

cat secp256k1-keys/public_key_hex
020287e1a79d0d9f3196391808a8b3e5007895f43cde679e4c960e7e9b92841bb98d

💡NOTE

アカウントの鍵を生成後、アカウントのパースに資金を投入しアカウント作成の処理を完了となります。

Option 2: ブロックエクスプローラでの鍵生成

このオプションはブロックエクスプローラを持っているネットワーク上で利用できます。

例えば、公式のTestnetでは、CSPR.liveブロックエクスプローラが利用可能であり、下記の説明ではそれを使用することを前提としています。

Casper WalletLedgerを使ってアカウント作成を始めます。

⚠CAUTION

Casper Signerは、Casper Walletに置き換わり廃止となります。CasperアカウントをCasper Walletに移行することを推奨しています(参照)。

アカウントの資金投入

アカウントを作成しアカウントのメインパース(メインのお財布)にトークンを付与すれば、セットアップは完了です。

💡NOTE
アカウントのメインパースへトークンを付与するまでは、ブロックチェーン上には存在していないものとなります。

既存のイーサリアム鍵の使用

Casperにて既存のイーサリアム鍵を使用することも可能です。下記に、イーサリアム鍵のセットサンプルとそのアドレスを記載しています。

Address:0x7863B6F7232D99FF80B74E4C8BB3BEE3BDE0291F
Public key:0470fecd1f7ae5c1cd53a52c4ca88cd5b76c2926d7e1d831addaa2a64bea9cc3ede6a8e9981c609ee7ab7e3fa37ba914f2fc52f6eea9b746b6fe663afa96750d66
Private key:29773906aef3ee1f5868371fd7c50f9092205df26f60e660cafacbf2b95fe086

既存のイーサリアム鍵を使用するには、Casperの仮想マシン(VM)に鍵のタイプがsecp256k1であることを知らせる必要があります。その為、下記例にあるように16進数の公開鍵の接頭辞は02となっています。

Casper コマンドラインクライアントは、参考例にてその説明を提供しています。

例:

下記トランザクションでは、10 CSPRを送信しています。

casper-client transfer \
--transfer-id 1234567 \
--node-address http://localhost:7777 \
--chain-name casper \
--target-account 020470fecd1f7ae5c1cd53a52c4ca88cd5b76c2926d7e1d831addaa2a64bea9cc3ede6a8e9981c609ee7ab7e3fa37ba914f2fc52f6eea9b746b6fe663afa96750d66 \
--amount 10000000000 \
--secret-key <path-to-secret_key.pem> \
--payment-amount 100000000

💡TIP

支払い合計額は、各コントラクトとネットワークの chainspec 次第で変化します。

Casper コマンドラインクライアントは、このアカウントからDeployを送る為にはPEM形式の秘密鍵が必要となります。既存のイーサリアム鍵をコマンドラインクライアントで使用したい場合は、PEM形式へのコンバージョンが必要となります。

下記は、key encoderとNode.jsを使用してPEMファイルを生成するJS スクリプトの例です。下記に従って、これらのコンポーネントをインストールしてください。

sudo apt install nodejs
npm install key-encoder

そして、vinanoを使用してJSスクリプトのconvert-to-pem.jsを作成してください。

var KeyEncoder = require("key-encoder"),
    keyEncoder = new KeyEncoder.default("secp256k1");
let priv_hex = "THE SECRET KEY TO ENCODE";
let priv_pem = keyEncoder.encodePrivate(priv_hex, "raw", "pem");
console.log(priv_pem);

Node.jsを使用してスクリプトを実行し、秘密鍵に名前を付けてください。

node convert-to-pem.js > eth-secret.pem

秘密鍵を参照するには、cat <filename>: を使います。

cat eth-secret.pem

下記が、秘密鍵のコンテンツの出力サンプルです。

-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIBjXY+7xZagzTjL4p8bGWS8FPRcW13mgytdu5c3e556MoAcGBSuBBAAK
oUQDQgAEpV4dVaPeAEaH0VXrQtLzjpGt1pui1q08311em6wDCchGNjzsnOY7stGF
tlKF2V5RFQn4rzkwipSYnrqaPf1pTA==
-----END EC PRIVATE KEY-----

Option 3: OpenSSLを使用した鍵の生成

openssl暗号化ツールキットを用いたCasperクライアントを使用せずに鍵を生成できます。以下のコマンドは、Linuxのオペレーションシステム上にてEd25519鍵を生成する際にのみ有効です。

secret_key.pemファイルの生成

openssl genpkey -algorithm ed25519 -out secret_key.pem

secret_key.pemファイルからの公開鍵の生成

デフォルトの Ed25519 鍵では、以下のコマンドにて public_key.pem と public_key_hex を生成できます。

openssl pkey -in secret_key.pem -pubout -out public_key.pem

{ echo -n 01; openssl pkey -outform DER -pubout -in "secret_key.pem" | tail -c +13 | openssl base64 | openssl base64 -d | hexdump -ve '/1 "%02x" ' | tr -d "/n"; } > public_key_hex

アカウントハッシュの生成

公開鍵のアカウントハッシュ生成は、Casperクライアントのオプションである account-address を使用します。public-key の引数は、適切にフォーマットされた公開鍵でなくてはなりません。公開鍵はファイルから読み取ることができ、そのファイルは、keygenコマンドであるpublic_key_hex or public_key.pemから生成された2つのファイルの内の1つであるはずです。

casper-client account-address --public-key <FORMATTED STRING or PATH>

メインパースのURefの見つけ方

Casper CLI クライアント、もしくはブロックエクスプローラを用いて、アカウントのメインパースを識別しているURefを見つけることが出来ます。

Casper CLI クライアントの使用

casper-client の場合は、get-account-info サブコマンドを使用します。

casper-client get-account-info \
--node-address <HOST:PORT>  \
--public-key <FORMATTED STRING or PATH>
  1. node-address – ネットワーク上にいるピアのIPアドレス。MainnetかTestnet上にいるノードのJSON-RPCサーバのデフォルトポートは、7777です。
  2. public-key – 適切にフォーマット化された公開鍵。公開鍵は、パスを引数としてファイルに入力している場合は、代わりに公開鍵をファイルから読み取ることになります。そのファイルは、keygenのサブコマンドである “public_key_hex” もしくは “public_key.pem” を介して生成された2つの公開鍵ファイルの内の1つとなります。
  • コマンドと出力のサンプル
    casper-client get-account-info --node-address http://65.21.75.254:7777  --public-key 0202ceafc0aa35f5a7bdda22f65c046b9b30b858459e18d3670f035839ad887fe5db
    {
      "id": -2018234245556346849,
      "jsonrpc": "2.0",
      "result": {
        "account": {
          "account_hash": "account-hash-0ea7998b2822afe5b62b08a21d54c941ad791279b089f3f7ede0d72b477eca34",
          "action_thresholds": {
            "deployment": 1,
            "key_management": 1
          },
          "associated_keys": [
            {
              "account_hash": "account-hash-0ea7998b2822afe5b62b08a21d54c941ad791279b089f3f7ede0d72b477eca34",
              "weight": 1
            }
          ],
          "main_purse": "uref-974019c976b5f26412ce486158d2431967af35d91387dae8cbcd43c20fce6452-007",
          "named_keys": []
        },
        "api_version": "1.4.15",
        "merkle_proof": "[29712 hex chars]"
      }
    }
    

詳細については、以下のhelpコマンドを実行してください。

casper-client get-account-info --help

ブロックエクスプローラの使用

cspr.live ブロックエクスプローラ上の項目にあるAccountを開き、Raw Data セクションを広げてください。main_purse のフィールドを見つけたら、対象のURefを探してください。Raw Dataセクションに何もデータがない場合は、アカウントに資金投入がまだされていないということです。