replitでdiscord bot常時起動できなくなったので対応した件
IDE(統合開発環境)のreplitで、discordのbotを常時起動させていた。
常時起動させるには、一定期間ごとにサービスにpingを送るサービス(uptimerobot)を使ってもいいが、何かの拍子でbotが落ちることがあったので、
replitの常時起動(always on)の機能を使っていた。
以前は有料課金(Hacker plan以上)にするか、複数常時起動にしたい場合は個別に課金することで対応していた。
それが、今年(2024)に入ったタイミング?で従来の方法では常時起動できなくなった模様。
同じことを実現したい場合はプロジェクト(Repls)をデプロイする必要アリ。
デプロイの種類には3種類アリ
discord botには多分Reserved VMが向いてるっぽい。
↑プランを選択
[Always on]が付いていればbotの場合最安プランで良いかと
今回ハマったのが↑の「Run command」で、プログラムを起動するコマンドを設定する。
botはpythonで作っていて、最初に起動するファイルがmain.pyなので、今回は
python3 main.py
↑のように設定した。
「Deploy」ボタン押下で結構時間がかかるがデプロイが進行する。
エラーが出なければデプロイ成功で、後は後ろで勝手に起動している状態。
この状態で別に「Run」で起動すると、二重に起動した状態になるようなので注意。
以上。
NFTをエアドロップするには
送付先ウォレットアドレスを収集して、アドレス宛にNFTをエアドロップしたい。
今回はthirdwebを使用したケース。
エアドロップするNFTを用意する
エアドロップするNFT(ERC721)をミントしておく。
アップロードするだけではダメで、ミントしておく(各NFTにアドレスが設定される)必要がある。
エアドロップ元のコントラクトで承認作業を行う
NFTをミントしたコントラクトで、setApprovalForAllの設定を行う。
- operator:エアドロするコントラクトID
- approved:true
※この設定はエアドロが終わったら解除(OFF)に戻した方が良いかも?
エアドロップ設定
thirdwebで「Airdrop ERC721」を選択してデプロイ
Explorerタブを選択
AirdropERC721を選択
- Token Address:エアドロ元のコレクションのコントラクトアドレス
- Token Owner:コントラクトのオーナーのウォレットアドレス
- Contents:送り先のウォレットアドレスとトークンIDをペアでJSONを記述
エアドロ実行
実行して署名でエアドロ完了。
以上
thirdwebに脆弱性が見つかった件
英語のメールは基本無視しているのだけど、
今日thirdwebからのメールが来てて、タイトルに important とあったので、
何かいつもと違う気配を感じてXを覗いてみたら、
thirdwebのコントラクトに脆弱性が見つかったとのこと。
その時点でいくつかのプロジェクトは対応が済んでいたようで。
具体的な対応は以下のとおり。
と、簡単に言ってくれますが、
デプロイにもエアドロップにも相応のガス代(と手間)がかかるわけで、
ガス代は負担してくれるような情報もあるけど全員に対処できるとも思えない。
どうなるんだろうね。。
とりあえず、自分が担当するコントラクトをチェックする。
元のポストは↓
IMPORTANT
— thirdweb (@thirdweb) 2023年12月5日
On November 20th, 2023 6pm PST, we became aware of a security vulnerability in a commonly used open-source library in the web3 industry.
This impacts a variety of smart contracts across the web3 ecosystem, including some of thirdweb’s pre-built smart contracts.…
ポストから診断ツールにジャンプする。
そこでウォレットに接続してみると。。。
Vulnerable(脆弱)の文字が。
このまま強引に運用しても、何かあったら資産が無くなりかねないし、
ホルダーさんにも迷惑がかかるので、Lockの一択。
- Lockすると、スケジュールがクリアされる。
- メタデータは凍結する。
- コレクション名に「Locked」がつく
ちょっと待って、相当リスキーな行動を軽率にさせようとしてないか????
Lockしてデプロイ、エアドロ済の情報もあるにはあるけど、
そこまで慌ててやらないといけないことなのか。
個人のコレクションでもないので、決行していいものか確認しないと。
というわけで、個人のテストで作ったコントラクトがあったのを思い出したので、
実行してみる。
「Lock Contract」をクリック
ここでガス代がかかる。
Lock完了
「Capture snapshot」でスナップショット取得
安全なコントラクトをデプロイ
「Deploy Contract」でデプロイ
ここでもガス代発生
エアドロップ
旧コントラクトのNFTホルダーに、新コントラクトのNFTをエアドロップする
「AirdropTool」は↓の「Start Airdrop」で配布が始まる?
「Shareable claim page」はこれまでのようにClaim設定ページから配布する?
「Airdrop tool」で配布したいのだが、
「Start Airdrop」ボタンが押せない。
ガス代を肩代わりしてくれるウォレットがBackend Wallet Addressで、
そこに入っている額が「Backend Wallet Balance」で0になっている。
「Minimum Balance Required」以上入っていないと実行できないっぽい。
「Withdraw Funds」で補充できるようだが、押しても実行できない。。
同じ時間帯に同じ作業をしている方が多いと、常にウォレットがカラになってしまう?
どうにも進めないので一旦ここまで!
【NFT】ガスレスフリーミントできるようになっておこう
ガスレスフリーミントとは
現在はミント時のガス代が落ち着いてきたものの、まだバカにならない額。
イーサに拘らなければpolygonチェーンでも良いが、
ミントする側がPolygon(MATIC)を用意しなければならず煩わしい。
ならばPolygonで安いガス代をNFT発行側が負担してミントしてもらおう、というもの。
どうやるのか
流れは以下の通り
- Polygon(MATIC)を準備する。
- ThirdwebでNFTをデプロイする。
- NFTの価格を0にする(フリーミント)
- ThirdwebとOpenzeppelinを紐づける
この中で経験があるのは1~3
4が未体験なのでやってみる。Openzeppelinは、現在学習中のSolidityで使うライブラリ群の認識。
参考サイト
参考というか記事を購入しました。
なので詳細は記事を買って読んでください。。
やったこと概要
まずは対象のNFTをデプロイするところまで行う。
ここは特別なことは特にナシ
今回はERC1155でMumbaiでデプロイ
NFTを追加
ミント設定まで行う
SBTにしたいのでNon-Transfarsableとする
価格0MATICとする。
ここまではなんの変哲もないミント設定
大事なところ
ここからがガスレスフリーミントの大事なところ。
ポイントはOpenZeppelinでRelayerというガス代を入れておく箱を作っておいて、
そこからガス代を都度支払うように設定する。
それからAutoTaskというガス代をかわりに支払う仕組みを設定する。
ThirdWebにURI設定
↑でゴニョゴニョして取得したガスレスの仕組みが入ったURLを取得したら、
EmbedタブのGasless設定にURLを設定する。
これでガスレスでミントできる。
肝心なところがわからんよ!という方は先のリンクから記事を購入するなり独自に調査するなりしてください~
以上
【discord】ロール設定botの紹介【bot】
できました
製作していたbotがとりあえず動くカタチとなったので紹介します。
欲しかったbot
所属しておりますDAO【tomajoDAO】で、先日ジェネラティブNFTがリリースされた。
NFTの特徴としては、トマトを擬人化したキャラクターと都道府県ごとの農作物を組み合わせたものとなっている。
以下のプロパティを持つ。
- Character
- Event
- Nousakumotsu
- Sora
- Todoufuken
キャラクタは10種類で、各都道府県に3種類ずつ特産物がある。
所持しているNFTの組み合わせでロールを付与する特典を設けたい。
以下のようなロールを設定したい。
既存botでできたこととできないこと
CollabLandで可能なのは、2.の~をN枚持っていたら、というもの。
これ以外は設定をいじってみたけどできなかった。
どんなbot?
この他の条件でのロール設定を可能にするbotを作成した。
その名も「CryptoRoleDeliverer」ロール配達botというわけですね。
↑このゲボダセえアイコンが目印。
使い方
botをインストールして起動すると、使い方の通知が1日に一回流れる。
/crole_regist_waddr コマンドの後ろにNFTが入っているウォレットアドレスを指定して実行すると、チェック対象となる。
一定時間後チェックが実行されてロールが通知される。
/crole_remove_waddr コマンドでウォレットアドレスを解除する。
弱点
最大の弱点は、discordユーザとウォレットアドレスを正確に連携できないこと。
やろうと思えば他人のウォレットアドレスで登録できてしまう。
ロールを取得することで実質的な利益が得られてしまうような場合は使いにくいかも。
ただし、ロールを取得したら、誰にロールが付与されたかdiscordサーバ内に通知されるので、大概はバレると思う。
大規模サーバとかになってくると見逃しも発生するかも。
終わりに
というわけで今回必要な機能を備えたbotが一応完成。
追加機能も色々考えられるが、ひとまずここまで。
もし使ってみたいという方がいらっしゃればご連絡くださいー
以上
無いものは作る~discord ロール設定bot編~【製作中】
前回
CollabLandの機能でできるのかできないのかモジモジしたあげく、
できませんでした、というオチ。
CollabLand Compilation機能は、単にロールとロールを組み合わせて新たなロールをつけるというものだった。
目的のおさらい
所持しているNFTの組み合わせに応じてロールをつけたい。
例えばあるジェネラティブコレクションがあるとして、
Colorというプロパティがあるとする。
Colorには Red Green Blueの3種類があったとして、
Redを1枚、Greenを1枚以上持っていたらそのウォレットの持ち主のdiscordメンバーに特定のロールAをつける。
コンプリートという意味あいなら、Redを1枚、Greenを1枚、Blueを1枚以上それぞれもっていたらそれ用のロールをつけたい。
開発
環境:Replit
言語:Python
設定管理
NFTの条件をjson形式で管理する。色コンプリートなら以下の形式
'''
{
"description": "色コンプリート",
"contract_address": "0x99999999999999999999999999999",
"roll_id": 12345678901234567890,
"operator": "and",
"attributes": [
{
"name": "Color",
"value": "Red",
"number": 1
},
{
"name": "Color",
"value": "Green",
"number": 1
},
{
"name": "Color",
"value": "Blue",
"number": 1
}
]
}
複数設定したい場合は上記のような設定ファイルを必要なだけ用意する。
できたらまた報告します。
以上