Open9
blockchain開発学習日記
Solidityの勉強
08/18
Ethereumを使ったスマートコントラクトでのHelloWorld的DAppを実装する
- SolidityとEthereumによる実践スマートコントラクト開発に沿って実装
- truffleのインストール
- TDDでやる
- ブロックチェーン上でテキストを格納し、そのテキストをブラウザ上で表示するという簡単なもの
- MetaMaskで予めログインする
- コントラクトをデプロイしたアドレスからでないとテキストを編集できないようにする
コントラクトのローカルネットワークへのデプロイ
- Ganacheを使った
- ローカルでブロックチェーンを作成し、Ganacheが自動で作成したアドレスのMnemonicフレーズでMetamaskにインポートする
- このときローカルホストのネットワークは手動でローカルのURLなどを入れないといけなかった
- Webクライアントはweb3.jsを経由して、テストネットワークに接続する
テストネットワークへのデプロイ
以下の2つを試した
- Goerli
- https://goerli-faucet.slock.it/ からテスト用etherを取得しようとしたがエラーになった
- Rinkeby
- infra.io が発行したURLを使ってテストネットにデプロイした
- etherがなかったがデプロイできた。ガス代はデプロイのときにもかかる理解だったが謎
次はERC-20の仕様を実装してみる
08/22
学習メモ
- hardhatが今は主流っぽい
- https://hardhat.org/
- tsサポートがいいなと思った
- alchemyのチュートリアルが良い
- metamaskの秘密鍵エクスポート
- web3エンジニアの開発ツールの紹介
- ノードプロバイダーの比較記事
- Infura.io、Alchemy
- https://morioh.com/p/d8629a2f234b
- window.ethereumはMetamaskがブラウザにインストールされていると使えるようになる
- goerliの蛇口はここ
- polygonについて
- https://www.coindeskjapan.com/137368/
- ethereumのレイヤー2のネットワーク
- openzeppelin
- foundry というDapps開発ツールがあるのを知った
- ERC20の実装には、openzeppelinよりもgas optimzedされた solmateというのがあるらしい
アウトプット
- alchemyのチュートリアルをひたすらやった
- ERC-20に準拠するコントラクトをGoerliにデプロイした
08/23
学習メモ
- DeFiとCeFiの違い
- https://hedge.guide/cryptocurrency/guide/difference-between-defi-and-cefi
- CeFiは中央集権型金融、DeFiはブロックチェーンを利用した金融アプリケーション
- CeFiは規制の対象となってしまっているらしい
- coinbaseの学習用記事が参考になりそう
- lightning networkについての説明
- https://www.coinbase.com/ja/learn/crypto-basics/what-is-lightning
- Twitterではstrikeというライトニングネットワークに対応しているビットコイン決済サービスを使っている。
- エルサルバドルではChivoというウォレットを採用
- 管理ウォレットと自己管理ウォレットがある
- 管理ウォレットは、秘密鍵を管理してくれたり初心者向き
- 自己管理ウォレットは、秘密鍵は自分で管理する必要があり経験者向け
- EOAとコントラクトアドレス
- https://pol.techtec.world/blockchain-usecase/ethereum/ethereum-account-transaction
- コントラクトにもアドレスはあるが送金できるわけではないという話
- web3事例調査
- FiNANCiE
- スポーツチームのサポートができるサービス
- スポーツチームごとにトークンが発行されていてそれをサービス内通貨であるポイントを使って購入できるという感じ
- おそらくアカウントとEthereumウォレットとは直接紐付いておらずアカウントのIDとどのチームにそれだけtokenを保有しているかがマッピングされたものがコントラクトに格納されているのではないか
- 各チームのトークンは発行上限が決められていた
- Opensea
- アカウント作って登録して、NFT出品までしてみた
- Metamaskアカウントでログインする感じなのでいわゆるDappぽい感じ
- ちょこちょこ署名をする必要があるが、ここで何をしているのかイマイチわからない
- GANMAコミュニティ
- https://ganma-community.com/welcome/aymNltm8ChEzglwQW89n
- 漫画の限定アイテムがNFTとして保有できるみたいな感じなのかな
- これもFiNANCiEと同様アプリ内通貨(コイン)があってそれでアイテム(これが多分NFT?)を購入するみたいな体験
- STEPN
- Soranaウォレットがプリインストールされている
- Sorare
- ethレイヤー2のネットワーク https://starkware.co/ を使っているらしい
- 感想
- 事例がやはり少なくどういうユーザー体験としてweb3系の機能を提供すればいいかを考えないといけないと思った
- FiNANCiE
- この記事の完成度が高い
- solidityチートシート(使えそう)
- Alchemyで使える他のチェーンを試してみたい
- Polygon
- Arbitrum
- Optimism
- Solana
- ethのaddress生成について
- https://betterprogramming.pub/programmatically-create-an-ethereum-wallet-with-python-and-infura-c378dda3e19c
- https://scrapbox.io/sushiether/Ruby_で_Ethereum_の秘密鍵・アドレスを生成
- https://www.reddit.com/r/ethdev/comments/70zxj5/best_way_to_programmatically_create_new_eth/
- https://www.quicknode.com/guides/web3-sdks/how-to-generate-a-new-ethereum-address-in-python
- https://www.edureka.co/community/171173/generate-ethereum-addresses-wallet-using-public-bitcoinj
- web3.jsなどのweb3ライブラリを使えばaddress生成ができるみたい
- こんなSNS的なサンプルアプリを作りたい
- アプリのアカウントを作ったら、ethアドレスを生成してそのアカウントに紐付けられる
- フロントエンドから自分が保有しているトークン量の閲覧が可能
- 他のユーザーに保有しているトークンを送れる
- テキストを投稿するたびに文字数に応じたトークンが付与される
- Metamaskなどのサードパーティウォレットにインポートができる
アウトプット
08/28
学習メモ
- サーバーサイド側の実装について調べる。ユーザーの秘密鍵生成などをサーバー側でやってウォレットをあらかじめ用意しておくといった実装が可能がどうかを知りたい
-
https://dasshshsd.hatenablog.com/entry/2022/03/05/132201
- サーバー側でprivate keyを使ってトランザクション処理を実行することが可能
-
https://dasshshsd.hatenablog.com/entry/2022/03/05/132201
- ethereumにはExecutionLayerクライアントとConsensusLayerクライアントの2つがあるらしい
- https://www.alchemy.com/overviews/execution-layer-and-consensus-layer-node-clients
- 実行層クライアントでは、Gethが一番メジャー(https://geth.ethereum.org/)
- (サーバーサイドはGoで実装するのが良いのだろうか)
- Loadstarというjs製のコンセンサスレイヤークライアントがあるらしい
- web3.jsはサーバーサイドで使えるのか
- https://github.com/ChainSafe/web3.js
- web3.jsはwindow.ethereumを使ってnodeへのアクセスを行うように見えるためMetamaskがインストールされているブラウザ側でないと使えない雰囲気がある
- https://stackoverflow.com/questions/72889204/how-to-sign-messages-on-the-server-side-using-web3
- https://stackoverflow.com/questions/67736753/using-local-private-key-with-web3-js
- ethers.jsで実現できるかもしれない
- Nativeアプリでweb3を実装できるのかどうか
- https://betterprogramming.pub/is-web3-native-mobile-app-possible-b0497da964ad
- iOSのウォレット接続アプリ
- 上記はまだ完全に動かないが、今後改善されていくはず
- https://morioh.com/p/7c29e59b851d
- web3開発のSaaS
アウトプット
08/29
学習メモ
- ウォレットの作成はethers.jsでできる
- Polygonを試す
- 通貨はMATIC
- これを参考にする
- polygonのトランザクションを見る
- ProviderとSignerの話
- https://zenn.dev/odan/scraps/69845ce19d74c7
- ProviderはEthereumのノードと接続する際に署名するやつ
- Signerはメッセージを送信する際に署名するやつ
- WalletはSignerの実装になる
- NFT実装のキャッチアップ
- solidityのusingキーワード
- DeFiの事例
- NFTのメタデータの登録は Pinata というサービスが使えるらしい
- ERC-20のdecimalsの説明
- Solidityのコードを自動生成してくれるツール
- Starkwareというレイヤー2ソリューションでは、Cairoという言語を使ってコントラクトを書くらしい
コード
コントラクトの実行スクリプト
const alchemy = new hre.ethers.providers.AlchemyProvider(
'maticmum',
ALCHEMY_API_KEY,
) // JSON RPCプロバイダを取得
const userWallet = new hre.ethers.Wallet(PRIVATE_KEY, alchemy) // 秘密鍵とJSONPRCプロバイダを使ってウォレットを初期化
const Greeter = new hre.ethers.Contract(CONTRACT_ADDRESS, abi, userWallet) // コントラクトアドレス,コントラクトのABI,ウォレットを使ってコントラクトのインターフェースを初期化
const tx = Greeter.setGreeting('hoge') // コントラクトのトランザクションを発行
await tx.wait() // トランザクションの完了を待つ(マイニングされるのを待つ)
ウォレットの作成スクリプト
const wallet = hre.ethers.Wallet.createRandom()
const userWallet = new hre.ethers.Wallet(wallet.privateKey, alchemy)
const Greeter = new hre.ethers.Contract(CONTRACT_ADDRESS, abi, userWallet)
アウトプット
- HollyTokenというERC20トークンをPolygonMumbaiテストネット上に発行した
- hardhatでスクリプト実行してdeployerのアドレスから新たに作成したアドレスに0token付与するトランザクションを実行した
- https://github.com/youmitsu/holly-token
- NFTをPolygonMumbaiにデプロイした
- mintのトランザクション
08/30
学習メモ
- モバイルアプリとの連携を調べる
- openseaアプリだとプロフィール画面に「ConnectWallet」ボタンがあって、これをタップするとMetamaskアプリが起動して、所有しているNFTがOpenseaアプリ上に表示される
- これはつまり、openseaのアカウントとNFTは紐付いていなくてあくまでもethereumのアドレスに対してNFTが紐付いていることを示していると解釈した
- Metamaskのモバイルアプリにディープリンクしてウォレットとモバイルアプリを接続する方法
- モバイルアプリからWalletConnect使うとトランザクションをブリッジしてくれるらしい
- torusを試しに使ってみる
- web3Authというライブラリがあり、それをreact-nativeアプリに入れてドキュメント通り試してみたが、うまく動かなかった
- いろいろ調べてみたが、webベースでの話が多く、ネイティブアプリでの話は出てこなかった
- ネイティブアプリで試してみたところちゃんと動いた。Googleなどのログインプロバイダによってログインしたあと、結果として返ってくる中に秘密鍵が含まれている様子
- web3Auth検証
- GoogleやTwitterなどのログインプロバイダーのアカウントを使ってログインができる。
- ログインするとweb3Authによって作られた秘密鍵などの情報がアプリに返却される。
- この鍵の情報はweb3Authアカウントに紐付いているため、一度ログアウトしても同じ方法でweb3Authにログインすればユーザーは鍵の情報を覚えておかなくて済む
- また、ログイン時のレスポンスにはjwtトークンが含まれており、この中にウォレットのpublicKeyが含まれている。よってこのpublicKeyから公開アドレス(EOA)へ復元可能と思われる
アウトプット
- react-native, express, hardhat の構成でDapps開発できるレポジトリを作った
- web3Authのサンプルアプリを作成した。react-nativeのsdkが動かなかったので、AndroidのネイティブSDKで試した
- web3Authから受け取ったjwtからpublicKeyを取得し、それをウォレットのアドレスに復元するというのをやった
08/31
学習メモ
- pythonの鍵生成ライブラリ
- Moralisについて
- Moralisは、Dapp開発におけるインフラを提供してくれる開発プラットフォーム。一言でいうとAlchemyの競合
- alchemyやinfuraなどが持っているノードプロバイダとしての機能にプラスして、blockchainにまつわる様々な操作が可能なAPIを提供してくれる
- 例えば、特定のアドレスのトークン残高やNFTの一覧などが取れる
- API一覧
- alchemy, infuraとの比較記事
- 主にバックエンドを提供するものなので、ウォレット自体は提供していなさそう。tutorialではmetamaskなどのサードパーティウォレットを使う例が紹介されている
- ただ、このあたりのAPIはalchemyのSDKにも実装されているので、Moralisだけでしかできないというわけではなさそう