永久クラウドArweaveのハマりポイント

Solana Metaplexでも採用されている、永久クラウドサービスの Arweave をJSで試したところ、いろいろハマったため、その時のメモ。

(参考)JSソースファイル

ハマったあとの完成版は以下に設置済み。使いやすいように、1ファイル・単機能で作成。

256hax/js/arweave

React版もあり。

256hax/full-stack/arweave

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もある。調べても詳細が発見できなかったが、おそらく公式に用意してくれているものっぽい?

URL: https://www.arweave.run/

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]

以下を試す。

  1. 残高不足の可能性があるため残高を増やす(http://127.0.0.1:1984/mint/Wallet Address/100000000000000)
  2. ArConnectやフロントエンド側の設定を変えた場合は情報が残るため、Walletを切ってから、ブラウザを再起動する。
  3. ArLocalを再起動する(これだけで直ったこともある)
  4. Macを再起動する(これだけで直ったこともある。このときはおそらくArLocal側の問題と思われる)