Solana Metaplexでも採用されている、永久クラウドサービスの Arweave をJSで試したところ、いろいろハマったため、その時のメモ。
Agenda
(参考)JSソースファイル
ハマったあとの完成版は以下に設置済み。使いやすいように、1ファイル・単機能で作成。
React版もあり。
Arweaveのシステム全体像
Solanaとは異なるブロックチェーンという考え方がわかりやすい。
ArweaveのARトークンを保管するためのウォレットアドレスがあり、このアドレスからARトークンを支払って、Arweaveにデータが永久に格納できる。
また、ウォレットアドレス間の送受金も可能。
Arweaveのツールとコミュニティ
公式 Arwaeve
Arweaveの基本開発用。JSで動く。
開発ツール: GitHub - arweave-js
ドキュメント: HTTP API
コミュニティ: Community
ArLocal
Texturyが提供しているローカルノード用ツール。ローカル開発する場合は必須。
開発ツール: GitHub - arlocal
コミュニティ: Discord (最下部にリンクあり。Discordの#welcomeでチェック入れる必要あり)
ArConnect
th8taが提供しているArweave用ウォレットのアドオン。フロントエンドで動かす場合には必要。
ウォレット: ArConnect
ドキュメント: GitHub - ArConnect
コミュニティ: Discord (下部にリンクあり)
ArweaveのDevnet/Testnetが見つからない
ArweaveのDiscordを見る限り、用意されていないようだった。MetaplexはDevnetでもArweaveにアップロードしてくれるが、おそらくMetaplexがARコストを払っていると思われるとのこと。
ArLocal(ローカル専用)
その代わりに、ローカルで動く ArLocal があるため、これを使えば開発は可能。
Testnet(RedStone Finance)
どうしても、Devnet/Testnetを利用したい場合は、 RedStone Finance が好意で用意してくれている環境も利用可能。
URL: https://testnet.redstone.tools/
const arweave = Arweave.init({
host: 'testnet.redstone.tools',
port: 443,
protocol: 'https'
});
Testnet(Arweave)
www.arweave.runというTestnetもある。調べても詳細が発見できなかったが、おそらく公式に用意してくれているものっぽい?
const arweave = Arweave.init({
host: 'www.arweave.run',
port: 443,
protocol: 'https'
});
なお、arweave.devというクラスターも見つけたが、これは正常に動作しなかったため、おそらくTestnetのみ用意されていると思われる。
Arweaveのトランザクションの流れ
Solanaと同じで、以下のような流れになる。
1. コネクション接続(URLやポート)
2. ウォレットアドレス生成/読込
3. Airdrop(ArLocalではMint Blanaceと表現)
3. トランザクション作成
4. トランザクション署名(sign)
5. トランザクション送信(post/getUploader)
6. トランザクションのマイニング
ARのArLocalへのウォレット接続方法
ウォレットはJSかブラウザのアドオンがある。
ブラウザのアドオンだと、 Arweave公式ウォレット もあるが ArConnect が有名のようで、開発しやすいようになっている(?)ためか、開発者に人気のように見える。
ArConnectを利用した場合、ArLocalに接続するためには以下の設定が必要。
ArConnect起動 > Settings > Arweave Config で以下を入力
Host: 127.0.0.1
Port: 1984
Protocol: http
ArConnectでウォレット作成ができない
ArConnectでウォレット新規作成しても、以下の画面のままとなっていて、なにも起きないため、作成がどうなっているのかわからない。
非常にわかりにくいが、画面表示は変わっていなくても、アドオンのArConnectを表示してみると、ちゃんとウォレットアドレスが作成されている。
(最初、新規作成されていることに気づかず、この画面で何個もアドレスを新規作成してしまった)
トランザクション送信すると403エラー
残高不足。ArLocalを起動して以下にアクセスするとエアドロップできるため、残高を増やす。
http://127.0.0.1:1984/mint/<AR WALLET ADDRESS>/<AIRDROP AMOUNT>
トランザクション送信するとMemory Leakエラー
ArLocalを起動していろいろ開発検証していたところ、410エラーが出たり、ArLocalを止めるとすると、以下のようなエラーが出て、挙動が不安定になった。
MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added to [Server]. Use emitter.setMaxListeners() to increase limit
原因不明だが、これが発生するとトランザクション送信(post/getUploader)がすべて通らなくなった。その場合はMacの再起動で解決した。
変なURLを叩いたり、おかしなソースコードを書いたときに発生するような気がする。
トランザクション送信すると410エラー
トランザクション送信すると以下のエラー。
Uncaught (in promise) Error: Error signing transaction: Error: Unable to upload transaction: 410, [object Object]
以下を試す。
- 残高不足の可能性があるため残高を増やす(http://127.0.0.1:1984/mint/Wallet Address/100000000000000)
- ArConnectやフロントエンド側の設定を変えた場合は情報が残るため、Walletを切ってから、ブラウザを再起動する。
- ArLocalを再起動する(これだけで直ったこともある)
- Macを再起動する(これだけで直ったこともある。このときはおそらくArLocal側の問題と思われる)