Yearly Archive 2022-04-29

Ethereum Remix & Github

Ethereum の開発環境RemixでSolidity を使った開発を、下記記事で以前試しましたが、

http://bitlife.me/bc/2022/01/09/

今回は、RemixとGithubアカウントを連携してより環境を充実させることと、より具体的に開発を進めるためにサンプルコードBallot.solを掘り下げてみました。

これは投票する項目をデプロイ時に登録して、投票権を与えたアカウントの投票させ、その結果一番多い投票があった項目を表示するものです。

最初登録する項目proposalNamesの与え方がよくわかりませんでしたが、動画(最下部)を参考にしました。

このように配列で与えるのですが、それも適当なデータではなく、きちんとした文字列である必要があり、下記コードで生成しました。

const ethers = require('ethers'); async function createBytes(args){ const name = args[0]; const bytes = ethers.utils.formatBytes32String(name); console.log("Bytes: ", bytes); }
Code language: JavaScript (javascript)

$ node createBytes.js name01
Bytes: 0x6e616d6530310000000000000000000000000000000000000000000000000000
$ node createBytes.js name02
Bytes: 0x6e616d6530320000000000000000000000000000000000000000000000000000

デプロイ時いちいちコピペするのが面倒なので、コードの中で与えるように変更しました。

https://github.com/systemsblue/Solidity-work01/blob/main/contracts/3_Ballot.sol

このような変更も今回 Remixのプラグイン、DGITを使ってできました。

Githubアカウント側の準備としては、Settings -> Developer settings -> Personal access tokes -> Generate new token でトークンを発行してこれを DGIT の Github Settings に貼り付けます。

あとはgitコマンドを使うようにメニューから実行していきます。

最初にもどってBallotの操作手順を追っていきます。

コンパイルするとコンストラクタの引数をなくしたので、ビルドすると上のように入力エリアがなくなります。これでDeployボタンをクリックします。(二つの名前が暗黙的に登録されます)

操作はACCOUNT(上の画像)を切り替えながら、ときにはアドレスをコピペして下記に貼り付け、ボタンをクリックしていきます。

操作は結構面倒です。

まずchairpersonで、投票の権限を与えるアカウントを確認して、このアカウントが選択されているときにgiveRightToVoteが使えます。ここに投票するアカウントのアドレスをコピペするのですが、ACCOUNTを切り替えてコピーし、chairpersonにまたもどしてgiveRightToVoteをクリックします。

投票できるアカウントが登録できたら、それぞれのACCOUNTに切り替えて投票します(Voteをクリック)。このときの値は2項目であれば、インデックスとして0と1になります。

winnerNameをクリックすると投票数が多い方の名前(といっても数値)が表示されます。

このサンプルはいろんなエッセンスを学ぶことができとても参考になります。IDEをWebアプリで使うことを考えると、Githubの連携も欠かせないと思いました。

CosmosとかPolkadotなどでもGithubアカウントが必要だったのですが、認証の意味とファイルの保存目的のような感じを受けました。Gitコマンドのように使えるこのプラグインはとても便利です。

参考動画

Astar Network

以前取り上げたPolkadotのバラチェーンであるAstar Networkについて、いろいろ試してみました。

http://bitlife.me/bc/2022/02/26/

基本的な使い方はこの「Substrate / Polkadot」で取り上げたとおりですが、「Solidity to WASM Compiler」というドキュメントからWASMについて調べたいと思ったのがきっかけです。

https://docs.astar.network/build/smart-contracts/wasm/solidity

WASMは一つのバイナリをいろいろな場所で動かすことができるため、最近とても興味を持って調べています。

まず結果からですが、SBYトークンが取得できず(枯れているみたい)うまくいきませんでした。(先週も今も) しかしそこに至る経緯をメモしておきたいので、このまま進めたいと思います。(やりたいことは最後の動画を参考にしました)

その前に、Astar Networkについて整理しますが、Stake Technologiesという会社で創業者が日本人ということもあり個人的にもとても応援しているプロジェクトです。dApp開発者が報酬を得られるdApp Stakingというものに興味を持っています。

あと名前がややこしいのですが、Polkadot/Kusama (メインネット/実験ネット)に相当するのが、Astar/Shiden で、Shibuyaはテストネットになります。実験ネットとテストネットは違い実験ネットのコインは購入する必要があります。(少額はFaucetで取得できるみたい(しかし今はできない?)) Plasm Networkという名前もさまざまなドキュメントで残っていますが、これはAster Networkの以前の名前のようです。

AstarにはWASMがアップロードするためのコントラクトの項目がなかったので、Shibuyaで作業することにしました。

ShibuyaのFaucetは、Discord で取得できという案内がありましたができず、Astarのポータルからもできませんでした。

下記コミュニティFaucetからはできましたが、SS58(ネイティブ)ではなくH160(EVM)でした。

https://www.as-faucet.xyz/en#

下記でコンバートしてEVMデポジットに入金が確認できたのですが、ポータルでSS58に変換することができず、WASMをデプロイするためのガス代として使用できませんでした。(EVMから引き出しでエラー。少額だから?)

https://shibuya.subscan.io/

では、前置きが長くなりましたが下記サイトを参考に環境構築(solidityコンパイラ)からやってみます。

https://docs.astar.network/build/smart-contracts/wasm/solidity

sudo apt install llvm openssl libxml2-dev
sudo apt-get install liblld-10-dev

いつものように、Ubuntu20.04にインストールましたが、llvmのバージョンがあわずバイナリーを使うことにしました。(13が必要でUbuntuでは10,11,12までしかなし)

wget https://github.com/hyperledger-labs/solang/releases/download/v0.1.10/solang-linux-x86-64
wget https://raw.githubusercontent.com/hyperledger-labs/solang/master/examples/flipper.sol

テストプログラムも取得しました。(やっている内容はビット反転ですね)

contract flipper { bool private value; /// Constructor that initializes the `bool` value to the given `init_value`. constructor(bool initvalue) { value = initvalue; } /// A message that can be called on instantiated contracts. /// This one flips the value of the stored `bool` from `true` /// to `false` and vice versa. function flip() public { value = !value; } /// Simply returns the current value of our `bool`. function get() public view returns (bool) { return value; } }
Code language: PHP (php)

コンパイルしてできた、flipper.contract ファイル をアップロードします。

スクリーンショットとは違いますが、実際のアカウントは、shibuya01を使用。

あと、警告も解消させています。

Walletからinjectしただけでは、EVMデポジットに送ることができず、JSONファイルであらためてインポートしました。

結局できたのは、SBYが取得できなかったため(H160(EVM)でなくSS58(ネイティブ)でないと上記に表示できない?)、Deployする直前までで、実行についてサイトにあるものをご参考ください。

へんな形になりましたが、開発がどんどんすすんでいる最中のお試しとしては、できなかったとして何もしないよりもできたとこだけ記録しておくということ大切だと思っています。

ポータルの使い方としては、Polkadotと同じなので、このあたり統一されていてとてもわかりやすいと思いました。

Avalanche Postman-collection

Exchange Chain (X-Chain), Platform Chain (P-Chain), Contract Chain (C-Chain) の3つのビルドインブロックチェーンをもつ、独特なしくみで高いパフォーマンスとEthereumとの互換性をもつAvalanche Platform。

Web APIで操作できるしくみは他のプラットフォームでも珍しくないのですが、Postmanの設定ファイルが用意されていることを動画(最下部)で知り便利だと思い試してみました。

しかしながら結果からいうと、Avalancheのテストノードが使える状態に同期するまでの時間がかかりすぎて(30時間以上かかるようで見積残り処理時間もなかなか減らずいつ終わるかわからない・・)、やろうとしていた動画のようなWallet間の送金はできませんでした。そのためいろいろとトライしたことの記録となります。

https://docs.avax.network/build/tutorials/nodes-and-staking/run-avalanche-node

上記を参考に、nodeの起動とcurlコマンドで送る手順が動画と同じことを確認できます。

./avalanchego –network-id=fuji –http-host 127.0.0.1

テストネットはFUJIというらしく(ここでも日本語が・・) このようにオプションを指定して起動します。(何もつけなければメインネット) ここではWSLでバイナリモジュールを使って起動。

次はPostmanをインストールして、下記から二つの設定ファイル(environment,collction)を読み込んで実行します。

https://github.com/ava-labs/avalanche-postman-collection

memo) ローカルアクセスのためにPostmanAgentが起動している必要あり

“Create a Keystore User”まではできますが、”Create an Address”は、上記ブートストラップがtrueにならないとできません。(これが30時間以上かかる?)

これとは別にWalletの準備をしました。

アドレスにC-ChainとX-Chainがあります。Xはネイティブ用で、CはEVM用でMetaMaskアドレスに送ることができます。

X-Chainに2 Avax、C-Chainに1 Avax送った結果です。上記Walletを作ると、X,C,P 3つのアドレスが作成されます。動画によるとPはステーキング用のようです。(アドレスはXとP部分以外は同じ文字列)

Postmanの前にもともとWallet-SDKを使って送金しようとたのですが、これもうまくいきませんでした。(うーん)

https://docs.avax.network/build/tools/avalanche-wallet-sdk/

下記メモです。

import { NetworkConstants, Network} from '@avalabs/avalanche-wallet-sdk'; これがうまくExportされないためExportされないためないため const net = require('./avalanche-wallet-sdk/dist/index.js'); テストネット切り替えなど部分的にはうまくいったものもあるが (node-fetchをクローバルにする方法などいろいろ試したりする方法などいろいろ試したり.jsの内容もいろいろ変えたり、 ts-nodeでバージョンを変えたりts-node-esmもためしたが同じ import {MnemonicWallet, BN} from '@avalabs/avalanche-wallet-sdk' これはうまくいくので(X,C,Pとも メインネットンネット(x-avax..., x-fuji...) XとPはこの文字以外は基本的に同じ字以外は基本的に同じ
Code language: JavaScript (javascript)

アドレス生成コード

import {MnemonicWallet, BN} from './avalanche-wallet-sdk/dist' const net = require('./avalanche-wallet-sdk/dist/index.js'); const mnemonic = `wedding ...... orient bicycle`; net.setNetwork(net.TestnetConfig); //net.setNetwork(net.MainnetConfig); let myWallet = new MnemonicWallet(mnemonic) console.log(myWallet.getAddressX()); console.log(myWallet.getAddressP()); console.log(myWallet.getAddressC());
Code language: JavaScript (javascript)

また以下のようにPaper Walletというのを出力できます。

気になったのが、ここのアドレスとWebに表示されているアドレスがXだけ違っていました.

うまくいかないことが多かったのですが、いろいろと理解は深まりました。また機会があれば続きをやりたいと思います。

参考動画

Enjin Platform

ERC1155というコントラクトを考案した、Enjin社。NFTの分野で進んでいる印象があります。

今回、NFTの登録、Enjin Walletの接続、GraphQLを使った情報の取得を試してみました。

また下記NFTについて、他のBlockchainとの比較が興味深い記事です。

Enjin SDKのページから、上部にあるリンクからKovanテストネットワークを選びます。

https://docs.enjin.io/sdks/getting-started

https://kovan.cloud.enjin.io/platform

アカウントの登録をして、プロジェクトを作成します。

このときiPhoneにも、Enjin Walletアプリをインストールします。

https://immersednow.medium.com/integrating-enjin-coin-enj-with-unity-using-the-enjin-unity-sdk-part-1-enjin-account-wallet-9ec9d263d227

Settingsで表示されるQRコードをアプリで読み取ると、Walletがリンクされます。

Walletへの入金は、KETHは下記から、

https://gitter.im/kovan-testnet/faucet

https://ethdrop.dev/

KENJはユーザサポートにメールで問い合わせ、Walletアドレスを知らせて入金してもらいました。(KETH, KENJは、ETH,ENJのKovanテストネットワーク用コイン)

ユーザサポートに聞きながらトライ&エラーをしたのでない画面があったり、前後している部分がありますが、FT,NFTの登録、トランザクションでのエラーを起こすときはKETHが足りないのも原因になるようです。

Webでの操作ごとにWallet側で承認の作成をしなくてはならないところは面倒に感じました。少なくともプロジェクトの作成、アセットの作成、アセットの発行(MINT)の3回必要。実は最初のMINTは成功したのですが、Tibit ProjのMINTは失敗しています。MINTに成功するとスマホにも表示されますが、表示できているのは最初のもの。(登録エラーのときもそうですが、エラーの原因がわかりづらい)

あとメモとしては、Walletを開発バージョンにしないと、KETH,KENJを表示しないため、設定画面のバージョン表示部分を10回タップする必要があります。

今回は、Enjin Platformのほんの一部ですが、Enjinを少しでも理解したかったので触ってみました。下記動画にはEnjin社のNFTに対する取り組みが詳しく説明されています。ポルカドットパラチェーン対応のEfinityについてはまた調べたいです。

NEAR Protocol

Nightshadeという独自シャーディングモデルによってスケーラビリティを向上させ高い性能を誇るNEAR Protocolの開発環境を試したみました。

参考:

https://coinpost.jp/?p=234911

https://coinpost.jp/?p=324304

下記Etherumの図がわかりやすかったので、拝借しました。
今回は、Examplesページ
“Rust & AssemblyScript Code Examples for building on NEAR”

https://near.org/examples/ から

NEAR Wallet Integrationを選びました。”Open in Gitpod” クリック(要Githubアカウント)

VS CodeライクなWebアプリが立ち上がり、開発環境一式が自動的にビルドされます。

“Open Browser”ボタンをクリックすると、フロントエンドのWebアプリが新しいWinodowで立ち上がります。(このときブラウザに許可をする)

Sign in すると、Walletとの接続を求められます。(必要になるアカウントの設定は済んでいるとする)

接続が終了すると、画面が変化。

“Say hi!”ボタンをクリックして、スマートコントラクトの呼び出し。

リンクをクリックしてスマートコントラクトが呼び出された様子を見てみる。

コードを見てみる。

上記3つのコードでやっていることは、なんとなく理解できそうです。

NEARというブロックチェーンから開発環境も含めて、実用性が高いという印象を受けました。(既存のWeb開発っぽい・・ブロックチェーンならではという部分のハードルが低そう・・) クロスチェーンに関する部分もまだ開発中ということで、まだまだ先が楽しみです。

参考動画

Terra LUNA

テラは、Cosmos のブロックチェーン開発エンジンTendermintによって開発されています。LUNAというネイティブトークン以外に、USTという担保なしのアルゴリズムによって法定通貨とペッグする、ステーブルコインも発行しており、下記www.terra.moneyにも”Programmable Money”とあるようにファイナンス関して先進的な印象をもちました。最近勢いがあります。

https://github.com/terra-money/LocalTerra

今回は、LocalTerraというローカルブロックチェーンを使ってテストしてみました。(ここにもterra-moneyとありますが、”money” 目立ちます)

環境) Docker, WSL / Ubuntu 20.04 / Windows 11

git clone –depth 1 https://www.github.com/terra-money/LocalTerra
cd LocalTerra

(私の環境では、docker-composeをアップデート /usr/local/bin)

sudo wget https://github.com/docker/compose/releases/download/v2.3.2/docker-compose-linux-x86_64

docker-compose up

これで一気にブロックチェーンの起動までいきます。新しいコンソールを開き、

docker-compose stop

で停止します。

LocalTerraの起動状況

起動したときのコンテナの状態

terrad statusなどのコマンドは、CLIから実行可能。

アカウントがあらかじめ用意されているので、LocalTerraに接続して、Terra Station Wallet (Chrome機能拡張)を作成する。

Chrome機能拡張

Rustの設定

https://docs.terra.money/docs/develop/dapp/quick-start/initial-setup.html

rustup default stable
rustup target add wasm32-unknown-unknown
cargo install cargo-generate –features vendored-openssl
cargo install cargo-run-script

Terrain インストール

sudo npm install -g @iboss/terrain

DApp イントール

https://docs.terra.money/docs/develop/dapp/quick-start/using-terrain-localterra.html#install-and-run-localterra

terrain new my-terra-dapp
cd my-terra-dapp
npm install

デプロイ

terrain deploy counter –signer validator

コンソールを使ってデプロイしたコントラクトにアクセス

フロントエンドアプリを使ってコントラクトにアクセス(http://localhost:3000/)

terrain sync-refs
cd frontend
npm install
npm start

Walletに接続して、カウンターをインクリメント(コンソールのつづきなので9)

“+”を押すと、Walletがひらく

インクリメント完了

increment, getCountのコード確認

Blockchain開発にRustという言語はとても重要な位置をしめていますね。USTのようなステーブルコインのしくみはここでは関与しませんでしたが、とても興味深いです。

これまで、USDT,USDCのように実物のドルの担保があるのが普通でしたが、アルゴリズムだけで実現したものを皆が信用するということは、すごいことだなと、単純に思います。いろんな金融商品を組み合わせてリスクヘッジしたりすることは投資の世界でよくあるようですが、こういうのもアルゴリズムがあるのでしょう。最近Blockchainを研究するとともに、ちょっとファイナンス関連にも興味をもつようになってきたような・・

Substrate / Polkadot

Cosmosと並び、異なるブロックチェーンのインターオペラビリティ(相互運用性)で注目を集めているPolkadotについて、試してみました。

インターオペラビリティは、Substrate というフレームワークで実装されますが、これを体験できるPlaygroundがあります。(Node Templateを使用)

https://docs.substrate.io/playground/

Githubアカウントでログインすると、VisualStudio(?)がWebで現れ、ブロックチェーンが起動します。ターミナルを開き、コンソールコマンドも実行できます。CTL-Cで停止でき下記コマンドで再起動できます。

./target/debug/node-template –dev –ws-external

再起動すると新規作成されるため、ブロックチェーンの更新を保持したい場合は、

./target/debug/node-template –dev –ws-external –base-path=/tmp/<任意>

とします。

メニューからPlayGroundを選択すると、新規タブでUI(DApp)が開きます。

6秒ごとに新規ブロックが作成されていきます。

デフォルトでPlaygroundをエンドポイントとしていますが、これ以外のネットワークにもスイッチできるようです。

開発アカウントと残高があかじめ用意されています。今回テストのため一番下の”Tibit”を追加しAliceから送金してみました。

次に今回やりたかった、ストレージへの保存と参照を動画を参考にトライしてみました。

後で説明しますが、doSomethingというメソッドに値を入力するようなイメージになります。

アカウントを作成するとき(説明を省略しましたが他の例にもれずニーモニックの保存やパスワード作成があります)に使用したパスワードを入力します。(開発アカウントの場合はなし)

次にチェーン状態を確認します。

確認できました。これを実行している箇所が以下になります。

動画では、これをカスタマイズしてタイトルやアカウントIDを保存できるようにしています。その際コードの更新を通知するために以下のバージョン情報をインクリメントするようです。

recent eventsでは、履歴をみることができます。

これは、新規でブロックチェーンを起動しても残っているようです。(Playgroundのセッションを終了すれば消えます)

まだ一部の機能しかさわっていませんが、実際の開発する様子がイメージでき、ツール類がよくできていると感じました。

Polkadotの実験ネットワークにKusamaというものがありますが、水玉(Polkadot)模様のアートで有名なアーティスト草間彌生氏からとられたものだといわれています。Blockchain界隈、日本にゆかりがあるものをよく目にします。もともとBlockchain論文の作者がサトシナカモトなのもそうですが、Cardanoプロジェクトの創始者も日本在住だったと聞いています。そのわりに日本の税制がこの業界に厳しく有能なベンチャーが海外に出てかざるをえない状況は皮肉なものです。Polkadotのパラチェーンを運営するAsterNetworkもその一つです。通貨というものが国家のあり方と密接にかかわっているからでしょう。こういった世の中の動きを見ているとこの業界が今とてもホットだということがよくわかります。

国家のあり方といえば、今週ロシアがウクライナの領土に侵攻しました。武力でNATOよりロシアに友好的な国家にすることが目的のようですが、こういう専制主義的、19,20世紀的なやり方に世界中の大勢の人は抵抗を感じるのではないでしょうか。非難するとともに即時撤退を願います。NFTなど物理的なモノからデジタルなモノに、物理的な領土からメタバースの土地に、会社などの組織からDAO(分散型自律組織)に価値感が移転しつつある非中央集権的なシステムBlockchainが、これだけ盛んになってきているのは、これからの時代を暗示しているからだと思います。ロシア・中国は特にマイニングをはじめとするBlockchainプロジェクトが盛んですが、これも皮肉です。

経済制裁によって取引が制限されると、Bitcoinなどの暗号通貨が使われるともいわれていますが、ウクライナに侵攻した途端、一時的にですが価値が暴落したことがまだリスク資産という位置づけであることのあらわれといわれています。

いずれにしろBlockchainをとりまく環境は、ホットであることは間違いないと考えます。

参考動画

Moralis Web3 Platform

これまでBlockchain自体の投稿が多かったのですが、もう一つ上位に位置するBlockchainを利用したアプリの開発プラットフォームについて、”Build Metaverse Unity Web 3.0 App with C#” というとても気になる動画を見つけたので試してみました。

Unityで作られたMetaverseのプログラムと各種ブロックチェーンを連携するライブラリの使い方の説明がされています。

Metaverseといえばアイテムの売買などでNFTが活用される典型的な例ですが、ここまでライブラリができているのかと、ちょっと驚きました。

ここではゲーム中に表示されるQRコードを読み取り、Walletと連携しています。連携できている証拠としてウォレットアドレスをキャラクタの上に表示します。

手順は、まずmoralis.io のアカウントを作り、接続するサーバの作成やブロックチェーンの選択をします。動画のとおりEthereum メインネットで、TrustWalletを使用して実践しました。

Unity側で必要な情報として、サーバは”Veiw Details”をクリックして、Server URL, Application IDを取得。

ブロックチェーンエンドポイントWeb3 Rpc Node URLは、Speedy Nodesから取得します。

iPhone App TrustWalletの設定から”WalletConnect”を選択し、カメラで上のQRコードを読み取ります。(このQRコードの元になっているのは下記ソースのURL。別のQRコードアプリで確認するとメタマスクの起動を要求された。)

Walletと連携後アドレスが表示されました。

QRコードを生成する部分は以下。

ログインが成功するとアドレス表示。

Unityは、プログラミング教育ブログなどでもよく使っており、C#でDAppが作れることで世界が広がります。

これまでのOSでいうところのクロスプラットフォーム開発が、もうブロックチェーンでも起きているということなのでしょうか、どのチェーンかということを意識せず、DAppが作ることができるようです。

この分野、急速に変化していることを感じます。

Starport / Cosmos

今回は、Cosmosの開発環境Starportについて試してみました。

参考: https://docs.starport.com/guide/hello.html

環境: Go 1.17.6, npm 8.1.2, node 16.13.1/Ubuntu20.4/WSL/Windows 11

インストール

sudo curl https://get.starport.network/starport! | bash

starport scaffold chain github.com/cosmonaut/hello
cd hello
starport chain serve

ひとまず動作確認。(AliceとBobのアドレスとニーモニックひかえる。二回目以降は以下のように表示しない)

参考ページにあるように、POSTでtitleとbodyを返すAPIを作成するためコマンド実行。

starport scaffold query posts –response title,body

コマンドを実行するとソースが自動的に変更・追加されます。(git diffで確認。下記は手動で変更)

x/hello/keeper/grpc_query_posts.go func (k Keeper) Posts(c context.Context, req *types.QueryPostsRequest) (*types.QueryPostsResponse, error) { //... return &types.QueryPostsResponse{Title: "Hello!", Body: "Starport"}, nil } x/hello/module.go import ( "encoding/json" "fmt" //.. "context" ... func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) }
Code language: JavaScript (javascript)

もう一度チェーン立ち上げ、下記URLをブラウザでアクセスします。(チェーンを立ち上げっぱなしでコード変更しても動いた)

http://localhost:1317/cosmonaut/hello/hello/posts

ちなみに下記コマンドでも動作するとありますが、そのような実行モジュールがみあたりませんでした。

hellod q hello posts

http://localhost:1317/ にアクセスしてAPIコンソールからも確認することができます。(それぞれクリックするとパラメータを入力する画面がでてきてリクエストを投げることができる)

ちなみにTendermint Node (http://localhost:26657/)は下記画面。

次に、フロントエンドを立ち上げて、AliceからBobに送金してみます。(下に参考動画: バージョンが違うためかコマンドが若干違うのと、上記の流れで作成しているのでネットワーク接続が動画どおりにできず)

cd vue
npm i
npm run serve

http://localhost:8080

AMOUNT 1 でBobに送金した後の画面。WalletはKeplrでChormoe Extensionのものを使用。(最初に控えたAliceのニーモニックを入力して作成)

次に、先ほどのAPIコンソールで、AliceとBobのBalanceを確認しました。

1 ATOM(?)送金されていることは確認しました。(小数入力できなかった)

この画面で、Cosmos Hubを選択しても何も変化が起きなかったためか、うまく接続できていないのかもしれません。(そのためにWalletの方には残高が反映されていない)

いろいろと試しながらやったため、手順になるようにスクリーンショットがとれず、エビデンスのみになってしまいました。

コマンド一つでブロックチェーンを作れてしまうのはなかなか強力なツールです。いろいろとやりたいことがでてきますが、今回はここまでとします。

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 の組み合わせはなかないいと思いました。

参考動画