EVM開発まとめ
⛓EVM互換チェーンの開発.
スマコン開発の流れ
- Solidity Program(.sol)作成.
- ソースコードをコンパイルして🔌EVMバイトコードと🔌EVM ABIを生成.
- コントラクトをネットワークにデプロイ.
- web3クライアントライブラリから関数を呼び出す.
構成要素overview
- 🔧Geth: チェーンに読み書きするためのサーバプログラム.
- 📝Solidity: イーサリアムノード上で動くプログラム.
- web3.js/web3.py: クライアント. 手元のPCとかからアクセスするプロクラム.
- Truffle: アプリケーションフレームワーク.
🐥EVMスマコン開発の基礎知識
📝イーサリアム仮想マシン(EVM)
イーサリアム・バーチャルマシン(Ethereum Virtual Machine, EVM).
📝イーサリアム上で, スマートコントラクトを実行するためのソフトウェア環境.
🔖決定性(Deterministic)が特徴. どこで誰が実行しても, 同じ入力に対して同じ出力を返す.
🔌EVM ABI
- JSONファイル.
- 📝Solidityのコンパイラが生成する.
- C言語のヘッダファイルのような関数呼び出しのspecがバイナリ変換されたようなもの.
- 🔌ABI
既存Contractとやり取りするABIのjson情報はどこから取得するの?
すでにデプロイされたContractのABIは🔍EtherscanのConctract ABIの部分にあるのでコピペ.
公式ドキュメントから取得.
🔌EVMバイトコード
📝Solidityのソースコード(.sol)をコンパイラ(solc)でコンパイルして生成する, 📝EVM上で動作するバイナリプログラムのこと.
EVMバイトコードはイーサリアムネットワーク上に送信されて永続的に保存される. これをデプロイという.
Ethereum Address
case-sensitiveではない. いいかえれば大文字と小文字を区別しない.
EIP-55
小文字を大文字にすることでチェックサム機能する仕様. こっちが業界標準.
https://github.com/cryptocoinjs/eip55
Ethereum Testnet/Sepolia
TestnetはSepoliaと呼ばれている.
test用トークン配布サイトはFausets
📝ERC-20
📝イーサリアムブロックチェーン上で最も一般的な📝トークン規格.
Token Contract
Contract Model.
SPLのAccount Modelに相当. すべてはコントラクトで管理.
SolanaのSPLトークンでは「トークンごとにトークンアカウントを作る」のに対し、ERC-20では「1つのスマートコントラクト内にすべてのウォレットの残高を記録する」
Metadata
トークンの名前・シンボル・小数点以下の桁数などは、トークンコントラクトに定義
decimals
基本は18だが変更可能. ExploreだとContract情報のなかにある.
How to Retrieve Token Decimals on EVM, Solana, and Tron Networks
EOA
Externally Owned Account. Walletのアカウント
token allowance
Token Approvalの方法. スマートコントラクトや他のアドレスに自分のトークンを使わせるために、approve と allowance という仕組みがある.
- approve(spender, amount): ユーザーが、特定のアドレス(spender)に対して、指定したトークン量(amount)の使用許可を与える
- allowance(owner, spender):spender が、owner のトークンをどれだけ使えるか確認できる
- transferFrom(owner, recipient, amount): spender が、許可された範囲内で owner のトークンを送る
-
cf. DEXでSwapしようとするときにポップアップででてくるやつ. Solanaだとそんなのないのでびっくりした. SPLはAccount Modelで ERCは Contract Modelだから.
permit2
Uniswapが開発したtoken allowanceの代替方法.
- 2回のtxが1回で住む.
- token allowance方式のほうが広く使われている.
- 0x000000000022d473030f116ddee9f6b43ac78ba3, 全チェーン共通.
https://github.com/Uniswap/permit2
📝ガス代/Gas
EVM手数料. 俗にガス代と言われるもの.
- Gwei: ガスの単位. gwei は 0.000000001 ETHと等価.
Tx Fee/legacy(type: 0)
トランザクションを処理するために支払う手数料. 📝Transaction Fee
Transaction Fee = Gas Price × Gas Used = (Base Fee + Priority Fee) × Gas Used
- Gas Fee: 📝ガス代(Gas)
- Base Fee: プロトコルによって設定された値
- Priority Fee: バリデータに支払うチップ
- Gas Used:
- トランザクションの実行に必要なガスの量.
- トランザクションが行う操作の複雑さに応じて変動.
- Uniswapの画面だとネットワーク料金と表示される.
EIP-1559(type: 2)
計算式: Transaction Fee = Gas Used × Effective Gas Price
- Gas Limit: トランザクションが使用できる最大のガス量(計算資源)
- Gas Used: 実際に消費されたガス量
- Base Fee: ネットワークの混雑状況に基づく基本料金(自動調整される)
- Max Priority Fee: バリデーターに支払うチップ(優先度を上げるため)
- Max Fee: 支払い可能な最大ガス料金(Base Fee + Priority Feeの上限)
- Effective Gas Price: 実際に適用されるガス価格(min(Base Fee + Priority Fee, Max Fee))
指定するのは以下の3つ.
- Gas Limit
- Max Fee
- Max Priority Fee
ethers.js
ethers.jsではgetFeeDataというIFがある.
【ether.js + Alchemy】推定ガス代を計算するために必要なデータの取得方法 #Node.js - Qiita
populateTransactionで自動設定?
ethers.js がトランザクションに自動的に設定する値 #ethers.js - Qiita
自動ガス推定
estimateGas
out of memoryした…
Fee on Transfer(FoT)/Tax Token
Transferのときにfeeを徴収する仕組み.
- https://help.matcha.xyz/en/articles/7239773-what-are-buy-sell-tax-tokens
- https://blog.matcha.xyz/article/tokens-buy-sell-tax
- https://0x.org/docs/developer-resources/buy-sell-tax-support
調査方法
- 直前のtx履歴を取得して判定
- matcha dexはどうやっているんだろう、非公開.
Refs
getQuote
集中型API
分散型SDK qutte
uniswap sdkはクライアント側で価格計算するらしい. すると、API rate limitはない? 要確認.
スマートコントラクト開発
📝Solidity
スマートコントラストを記述するための🔖DSL. 📝イーサリアム仮想マシン(EVM)での実行を想定している.
- 文法は📝JavaScriptに似ている.
- 拡張子はsol.
- 関数を実行するたびに📝ガス代(Gas)を支払う必要あり.
🐥Solidity Syntax
Mapping data types
- mapping
- key type
- value type
Function
- 関数のもどり値は複数なところは特徴的(returns).
Constructors
Events
SDK
Ethereum JSON RPC API Impl.
- Revm: Rust inmplementation of evm. https://github.com/bluealloy/revm
web3.js
歴史があるsdk.
ethers.js
web3.jsより後発で人気は劣るもののモダン.
🔖イーサリアムノード
イーサリアムのブロックチェーンネットワークに接続して操作をするための📝ノード.
🔖JSON-RPCを介して接続する.
🔧Geth
Geth, Go Ethereumの略.
Goで書かれた最もメジャーなnodeクライアントソフトウェア. 9割のシェアがあり, イーサリアムのノードというとほぼGethを指すが, 集中しすぎてそれでいいのかという意見もあるとか.
イーサリアムノードサービス
課金してノードをつかうやつ.
- Free
- Infura: https://www.infura.io/
- Alchemy: https://www.alchemy.com/
- QuickNode:
Solidity 開発ツール
Solidity開発環境. Developer Experience周り. 口コミはあまりSolidity周りは良い話を聞かないが…
🔧Remix IDE
Web-Basedな📝SolidityのIDE.
ローカルPCの📝VSCodeからもプラグインで接続できるようだ.
🔧Hardhat
Solidityでのスマートコントラクト開発のためのローカル開発環境およびタスクランナー.
🔧Truffle
Solidityを使ったアプリケーション開発用のデファクトスタンダードフレームワーク.
- https://trufflesuite.com/truffle/
- 🔖アプリケーションフレームワーク, DAppsフレームワーク, Railsみたいな.
Ganache
ローカルに開発用のパーソナルノードを立てるツール.
テストネットワーク
Goerli
テストネットワーク.
Topics
Soidity Hello world
- 初心者向けのHello Worldスマートコントラクト | ethereum.org
- Hello World Smart Contract
- How To Create a “Hello World” Smart Contract With Solidity | Chainlink
💡SolidityでMuitiswap
Single-Chain, 2 DEXes swapのやり方.
Insights
- 💭スマートコントラクト開発とはまさか低レベル組込みファーム開発と相性がいいんじゃないか(23/08/23)
- 💭JavaScriptわかればSolidityスマコン開発いけるっしょと思ったらいけなかった(23/08/23)
- 💭EVMのことなにも知らないバカなのにCursorでSwap実装できて人間と呼び捨てされた(25/03/31)
🔗References
イーサリアム公式
公式ドキュメントは日本語翻訳されてとても充実している. ファーストチョイス.
🐥初心者入門資料
とりあえず入門はイーサリアム公式サイトがいい. その上でのリンク.
- CryptoZombies: https://cryptozombies.io/
- 有名なSolidityを学ぶオンラインリソース.
- 【いまさら聞けない】BUILD UP - YouTube
- 🏢Skyland VenturesのYoutube. いまさら聞けないというテイストでweb3エンジニア向けなのでわかりやすい.
- Lecture 3.1 Smart Contract from Programmer Perspective - YouTube
- Lecture 3.2 Ethereum Programming Basics - YouTube
📚Books
- Mastering Ethereum
Solidty
- Solidty公式: https://github.com/ethereumbook/ethereumbook
- GitHub - sot528/smart-contract-best-practices
- 中級者向けのSolidityベストプラクティス. 少し古いが今はどうなんだろう.