はじめに
このドキュメントは、caver-js v1.5.0以上を使用している開発者向けです。
前提条件
依存関係
caver-jsライブラリを使用するには、以下のパッケージが必要です。
注意 caver-jsはNode.jsのバージョン12と14で動作します。 推奨バージョンは以下の通り:
異なるバージョンのNode(例えば、Node v15)を使用している場合は、Node Version Manager(nvm)を利用して、caver-jsでサポートされているバージョンをインストールして使用してください。
インストール
試すには、以下のコマンドを使ってnpmでcaver-jsをインストールする:
npm install caver-js
注意:package.jsonファイルは同じインストールパスに存在する必要があります。 存在しない場合は、
npm initで
package.json` を生成することができる。
特定のバージョンのcaver-jsをインストールするには、以下のコマンドを試す:
npm install caver-js@X.X.X
caver-jsで始める
caver-jsのインストールが完了したら、caver-jsを使ってkaiaノードに接続します。
以下の例を実践するには、まず作業ディレクトリにテスト・ファイルを作成する。
touch test.js
作業ディレクトリにtest.js
ファイルが作成されているのが見えるだろう。
test.jsに以下のコードを書く。
// test.jsconst Caver = require('caver-js')const caver = new Caver('https://public-en-kairos.node.kaia.io/')async function testFunction() { const version = await caver.rpc.klay.getClientVersion() console.log(version)}testFunction()
上記のコードを実行すると、次のような結果が得られる。
$ node ./test.jskaia/v1.4.0/linux-amd64/go1.14.1
上記のようなconsole.logの出力が表示され たら、以下のステップに進んでください。 バージョン番号は、接続されているkaiaノードのバージョンによって異なる場合があります。
kaiaノードへの接続
以下の例のように、caver-jsモジュールをインポートし、Kairosテストネットのkaiaノードに接続することができます:
const Caver = require('caver-js')const caver = new Caver('https://public-en-kairos.node.kaia.io/')
ENを使用している場合は、以下のようにホストとポートを変更することで、自分のノードに接続することができます:
const Caver = require('caver-js')const caver = new Caver('https://your.en.url:8651/')
キーホルダーの管理
Keyring は、kaiaアカウントのアドレスと秘密鍵を含む構造体である。
Keyring は、保管する鍵の種類によって3種類に分類される:SingleKeyring は1つのアドレスと1つの秘密鍵を保管するタイプ、MultipleKeyring は1つのアドレスと複数の秘密鍵を保管するタイプ、RoleBasedKeyring はロールごとに1つのアドレスと1つ以上の秘密鍵を保管するタイプである。
SingleKeyring は内部に key
プロパティを定義し、この key
は1つの秘密鍵を格納する。
MultipleKeyring は内部で keys
プロパティを定義しており、この keys
は複数の秘密鍵を格納するための配列として実装されている。
RoleBasedKeyring で定義されている keys
プロパティは2次元配列として実装されており、各role に対して複数のキーを含めることができます(空の keys
は [ [], [], [] ]
のようになります)。 配列の最初の要素には roleTransactionKey
に使用する秘密鍵、2 番目の要素には roleAccountUpdateKey
に使用する秘密鍵、3 番目の要素には roleFeePayerKey
に使用する秘密鍵が格納される。
キーホルダーの作成
シングルキーリングの生成
以下のように、1つのキーホルダーをランダムに生成することができます。
// test.jsconst Caver = require('caver-js')const caver = new Caver('https://public-en-kairos.node.kaia.io/')async function testFunction() { const keyring = caver.wallet.keyring.generate() console.log(keyring)}testFunction()
上記のコードを実行すると、次のような結果が得られる。
$ node ./test.jsSingleKeyring { _address:'0x3d263c3c0df60c5516f932d244531742f45eed5c', _key:PrivateKey { _privateKey: '0x{private key}' }.}
実行結果を上に示す。 インスタンス内部で定義されたメンバ変数には、keyring.address
とkeyring.key
を通じてアクセスできる。
秘密鍵からSingleKeyringを作成する
また、特定の秘密鍵を所有している場合は、以下のようにキーホルダーを作成するために使用することができます。
// test.jsconst Caver = require('caver-js')const caver = new Caver('https://public-en-kairos.node.kaia.io/')async function testFunction() { // Create a keyring from a private key const keyringFromPrivateKey = caver.wallet.keyring.createFromPrivateKey('0x{private key}') console.log(keyringFromPrivateKey)}testFunction()
上記のコードを実行すると、次のような結果が得られる。
$ node ./test.jsSingleKeyring { _address:'0xf5a9079f311f9ec55170af351627aff0c5d2e287', _key:PrivateKey { _privateKey: '0x{private key}' }. }
caver.wallet.keyring.createFromPrivateKey
の結果は、上記のcaver.wallet.keyring.generate
の結果と同様に、アドレスが定義されたSingleKeyringインスタンスとなり、keyring.key
の中の[PrivateKey]インスタンスが生成されます。
秘密鍵とアドレスを持つSingleKeyringの作成
kaiaアカウントの秘密鍵がアドレスから切り離されている場合、以下のように指定されたアドレスと指定された秘密鍵を使ってキーリングを作成することができます。
// test.jsconst Caver = require('caver-js')const caver = new Caver('https://public-en-kairos.node.kaia.io/')async function testFunction() { // Create a keyring with an address and a private key const keyring = caver.wallet.keyring.createWithSingleKey('0x{address in hex}', '0x{private key}') console.log(keyring) // Create a keyring from a KlaytnWalletKey const keyringFromKlaytnWalletKey = caver.wallet.keyring.createFromKlaytnWalletKey('0x{private key}0x{type}0x{address in hex}') console.log(keyringFromKlaytnWalletKey)}testFunction()
以下のようにコンソールでコードを実行する。
$ node ./test.jsSingleKeyring { _address:'0x17e7531b40ad5d7b5fa7b4ec78df64ce1cb36d24', _key:プライベートキー { _privateKey: '0x{private key}' }。}SingleKeyring { _address:'0x17e7531b40ad5d7b5fa7b4ec78df64ce1cb36d24', _key:プライベートキー { _privateKey: '0x{private key}' }。}
複数の秘密鍵を持つMultipleKeyringの作成
複数の秘密鍵を使用したい場合は、アドレスと複数の秘密鍵を使用してMultipleKeyringを作成することができます。 以下の例は、複数の秘密鍵を持つMultipleKeyringの作成方法を示している。
// test.jsconst Caver = require('caver-js')const caver = new Caver('https://public-en-kairos.node.kaia.io/')async function testFunction() { // Create a keyring with an address and private keys const keyring = caver.wallet.keyring.createWithMultipleKey('0x{address in hex}', [ '0x{private key1}', '0x{private key2}' ]) console.log(keyring)}testFunction()
上記のコードを実行すると、次のような結果が得られる。
$ node ./test.jsMultipleKeyring { _address:'0x17e7531b40ad5d7b5fa7b4ec78df64ce1cb36d24', _keys:[ PrivateKey { _privateKey: '0x{private key1}' }, PrivateKey { _privateKey: '0x{private key2}' }. ]}
ご覧のよう に、_keys
は配列の中に複数のPrivateKeyインスタンスを持っている。 インスタンス内部で定義されたメンバ変数には、keyring.address
とkeyring.keys
を通じてアクセスできる。
秘密鍵によるRoleBasedKeyringの作成
役割](../../../learn/accounts.md#roles)ごとに異なる秘密鍵を使用するには、代わりに caver.wallet.keyring.createWithRoleBasedKey
を使用します。 配列の各要素は、RoleBasedKeyring に記述されている役割を表します。 以下の例は、役割ごとに異なるキーから RoleBasedKeyring インスタンスを作成する方法を示しています。
// test.jsconst Caver = require('caver-js')const caver = new Caver('https://public-en-kairos.node.kaia.io/')async function testFunction() { // Create a keyring with an address and private keys defined by each roles const keyring = caver.wallet.keyring.createWithRoleBasedKey('0x{address in hex}', [ [ '0x{private key1}', '0x{private key2}', '0x{private key3}' ], [ '0x{private key4}'], [ '0x{private key5}', '0x{private key6}' ], ]) console.log(keyring)}testFunction()
上記のコードを実行すると、次のような結果が得られる。
$ node ./test.jsRoleBasedKeyring { _address:'0x17e7531b40ad5d7b5fa7b4ec78df64ce1cb36d24', _keys:[ [ PrivateKey { _privateKey: '0x{private key1}' }, PrivateKey { _privateKey: '0x{private key2}' }, PrivateKey { _privateKey: '0x{private key3}' } ], [ PrivateKey { _privateKey: '0x ' } ]. ], [ PrivateKey { _privateKey: '0x{private key4}' } ], [ PrivateKey { _privateKey: '0x{private key5}' }, PrivateKey { _privateKey: '0x{private key6}' } ]. ] ]}
上の出力を見ると、keys 配列の最初の要素である roleTransactionKey
には 3 つの PrivateKey インスタンスがあり、2 番目の要素である roleAccountUpdateKey
には 1 つの PrivateKey インスタンスがある。 配列の最後の要素である roleFeePayerKey
には2つの PrivateKey インスタンスがある。
注意:キーリング(caver.wallet.keyring)やウォレット(caver.wallet)に関連する関数を呼び出しても、実際のkaiaブロックチ ェーンプラットフォーム(kaia)には影響しません。
caver-jsにキーリングを追加する
caver-jsが提供するインメモリ・ウォレットを使えば、簡単にキーリングを使うことができる。 以下の例では、Kaia Wallet からエクスポートしたキーリング・インスタンスとキーストア・ファイルを使って、キーリングをウォレットに追加する方法を説明します。
開発時には、実際の資金とは関係のないアカウントを使うのがベストプラクティスだ。 これを行う良い方法は、新しいブラウザプロファイル(Chrome、Brave、Firefoxなど)を作成し、そのブラウザにカイアウォレットをインストールし、このウォレ ットにお金を送らないことです。
// test.jsconst Caver = require('caver-js')const caver = new Caver('https://public-en-kairos.node.kaia.io/')async function testFunction() { // Using a keyring instance const keyring = caver.wallet.keyring.generate() caver.wallet.add(keyring) console.log(caver.wallet.getKeyring(keyring.address)) // Using a keystore file const decrypted = caver.wallet.keyring.decrypt({ version: 4, id: '9c12de05-0153-41c7-a8b7-849472eb5de7', address: '0xc02cec4d0346bf4124deeb55c5216a4138a40a8c', keyring: [ { ciphertext: 'eacf496cea5e80eca291251b3743bf93cdbcf7072efc3a74efeaf518e2796b15', cipherparams: { iv: 'd688a4319342e872cefcf51aef3ec2da' }, cipher: 'aes-128-ctr', kdf: 'scrypt', kdfparams: { dklen: 32, salt: 'c3cee502c7157e0faa42386c6d666116ffcdf093c345166c502e23bc34e6ba40', n: 4096, r: 8, p: 1 }, mac: '4b49574f3d3356fa0d04f73e07d5a2a6bbfdd185bedfa31f37f347bc98f2ef26' } ] }, 'password') caver.wallet.add(decrypted) console.log(caver.wallet.getKeyring(decrypted.address))}testFunction()
コンソールで実行する。
$ node ./test.jsSingleKeyring { _address:'0x66391720b488a3fb2c7c69d99cd4cd6e23ca18e3', _key:プライベートキー { _privateKey: '0x{private key}' }。}SingleKeyring { _address:'0xc02cec4d0346bf4124deeb55c5216a4138a40a8c', _key:PrivateKey { _privateKey: '0x{private key}' }.}
上の出力を見ると、caver.wallet
にキーリングを追加した後、caver.wallet
からキーリングを問い合わせることができる。
使用するアドレスと秘密鍵があれば、簡単にキーリングを作成し、caver.wallet.newKeyring を介して、caver.wallet に直接追加することができます。
// test.jsconst Caver = require('caver-js')const caver = new Caver('https://public-en-kairos.node.kaia.io/')async function testFunction() { // Add to wallet with an address and a private key const addedSingle = caver.wallet.newKeyring('0x{address in hex}', '0x{private key1}') console.log(caver.wallet.getKeyring(addedSingle.address)) // Add to wallet with an address and private keys const addedMultiple = caver.wallet.newKeyring('0x{address in hex}', ['0x{private key2}', '0x{private key3}', '0x{private key4}']) console.log(caver.wallet.getKeyring(addedMultiple.address)) // Add to wallet with an address and private keys defined by each roles const addedRoleBased = caver.wallet.newKeyring('0x{address in hex}', [ ['0x{private key5}', '0x{private key6}', '0x{private key7}'], ['0x{private key8}', '0x{private key9}'], ['0x{private key10}', '0x{private key11}'] ]) console.log(caver.wallet.getKeyring(addedRoleBased.address))}testFunction()
上記のコードを実行すると、次のような結果が得られる。 上記コードの実行結果を以下に示す。 秘密鍵を指定して caver.wallet.newKeyring
を実行すると、秘密鍵を1つ持つKeyringインスタンスが作成され、caver.wallet
に追加される。 複数の秘密鍵の場合、複数の秘密鍵を持つKeyringインスタンスが作成されます。 ロールごとに1つ以上の秘密鍵を引数として渡すと、ロールごとに異なる秘密鍵を持つKeyringインスタンスが作成され、caver.wallet
にも追加されます。
$ node ./test.jsSingleKeyring { _address:'0x651f6ae6b45750082b22805583acc989399c6552', _key:PrivateKey { _privateKey: '0x{private key1}' }.}MultipleKeyring { _address:'0xce3ee92aeb4d600a41c98bdf92e8b337e186bf58', _keys:[ PrivateKey { _privateKey: '0x{private key2}' }, PrivateKey { _privateKey: '0x{private key3}' }, PrivateKey { _privateKey: '0x{private key4}' }. ]}RoleBasedKeyring { _address:'0x626d5b94ec76a105c5afa370bb7e59050a22b8b5', _keys:[ [ PrivateKey { _privateKey: '0x{private key5}' }, PrivateKey { _privateKey: '0x{private key6}' }, PrivateKey { _privateKey: '0x{private key7}' } ], [ PrivateKey { _privateKey: '0x ' ], [ PrivateKey { _privateKey: '0x{private key8}' }, PrivateKey { _privateKey: '0x{private key9}' } ], [ プライベートキー { _privateKey: '0x{private key10}' }, プライベートキー { _privateKey: '0x{private key11}' } ]. ] ]}
caver.wallet.add
または caver.wallet.newKeyring
は、caver.wallet
にKeyringを追加した後に、Keyringのインスタンスを返します。