Daily Archive2022-02-11

Solana in Rust & TypeScript

Solanaの開発環境について、動画を参考に動作確認とSolanaのウォレット、Phantomとの連携を試してみました。

https://github.com/solana-labs/example-helloworld

環境: Cargo 1.57.0, node 16.13.1 / WSL / Windows 11

インストール

sh -c “$(curl -sSfL https://release.solana.com/v1.9.5/install)”

export PATH=”/home/k/.local/share/solana/install/active_release/bin:$PATH”

solana config set –url localhost

solana-keygen new -o /home/k/.config/solana/id.json

solana-test-validator

Solana CLIをインストールしてデーモンが立ち上げます。そして別コンソールで、オンチェーンコード(Rust or C。ここではRustを選択)をビルド(SharedObject生成)、これをデプロイして、オフチェーンコードのTypeScriptを実行します。

npm install

npm run build:program-rust

solana program deploy dist/program/helloworld.so

npm run start

デプロイのとき、コインがないとエラーがでるので、エアドロップのコマンドを実行して受け取ります。(とりあえず10 SOL)

solana airdrop 10

これで実行されるのは、main.tsです。処理の詳細はhello_world.tsに記述されています。ここではコンソール実行していますが、TypeScriptで書かれているのでWebにもっていきやすいです。オンチェーンコードとオフチェーンコードがコンソールで一通り動作確認できるのは、使いやすいと感じました。

次に、Phantomウォレットとの連携ですが、ウォレットで秘密キーのimportができないので(ニーモニックのimportは当然できる、秘密キーのexportはできるのに・・なぜ)、ウォレットのニーモニックからキーペアを生成して、ここまでで生成したアカウントに上書きします。

参考

[recover] seed phrase .. でウォレットのニーモニックをコピペします。

ウォレットは、ローカルホストを選択します。ウォレットのアドレス(あれ、Localhostの表示がかぶっている^^ ; )とコンソールコマンドでアドレスが一致していることを確認します。また最近の活動はトランザクションIDなので、下記のようにコードを変更して確認できます。(TX: )

export async function sayHello(): Promise<void> { console.log('Saying hello to', greetedPubkey.toBase58()); const instruction = new TransactionInstruction({ keys: [{pubkey: greetedPubkey, isSigner: false, isWritable: true}], programId, data: Buffer.alloc(0), // All instructions are hellos }); let tx = await sendAndConfirmTransaction( connection, new Transaction().add(instruction), [payer], ); console.log("TX: " + tx); }
Code language: JavaScript (javascript)

このような記事を書くとき、いろいろと試しながらやるため手順が前後してしまい、わかりづらくて・・m(_ _)m

C言語でも記述できてしまうところが拡張性を考えたとき面白いのと、Rust + TypeScript の組み合わせはなかないいと思いました。

参考動画