EVM開発まとめ

⛓EVM互換チェーンの開発.

スマコン開発の流れ

  1. Solidity Program(.sol)作成.
  2. ソースコードをコンパイルして🔌EVMバイトコード🔌EVM ABIを生成.
  3. コントラクトをネットワークにデプロイ.
  4. 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だから.

  • How to Set a Token Allowance | 0x

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を徴収する仕組み.

調査方法

Refs

getQuote

集中型API

分散型SDK qutte

uniswap sdkはクライアント側で価格計算するらしい. すると、API rate limitはない? 要確認.

スマートコントラクト開発

📝Solidity

スマートコントラストを記述するための🔖DSL. 📝イーサリアム仮想マシン(EVM)での実行を想定している.

🐥Solidity Syntax

Mapping data types

  • mapping
    • key type
    • value type

Function

  • 関数のもどり値は複数なところは特徴的(returns).

Constructors

Events

📝副作用(Side effect)の制御.

SDK

Ethereum JSON RPC API Impl.

web3.js

歴史があるsdk.

ethers.js

web3.jsより後発で人気は劣るもののモダン.

🔖イーサリアムノード

イーサリアムのブロックチェーンネットワークに接続して操作をするための📝ノード.

🔖JSON-RPCを介して接続する.

🔧Geth

Geth, Go Ethereumの略.

Goで書かれた最もメジャーなnodeクライアントソフトウェア. 9割のシェアがあり, イーサリアムのノードというとほぼGethを指すが, 集中しすぎてそれでいいのかという意見もあるとか.

イーサリアムノードサービス

課金してノードをつかうやつ.

Solidity 開発ツール

Solidity開発環境. Developer Experience周り. 口コミはあまりSolidity周りは良い話を聞かないが…

🔧Remix IDE

Web-Basedな📝SolidityのIDE.

ローカルPCの📝VSCodeからもプラグインで接続できるようだ.

🔧Hardhat

Solidityでのスマートコントラクト開発のためのローカル開発環境およびタスクランナー.

https://hardhat.org/

🔧Truffle

Solidityを使ったアプリケーション開発用のデファクトスタンダードフレームワーク.

Ganache

ローカルに開発用のパーソナルノードを立てるツール.

テストネットワーク

Goerli

テストネットワーク.

Topics

Soidity Hello world

🔖Hello world

💡SolidityでMuitiswap

Single-Chain, 2 DEXes swapのやり方.

Insights

🔗References

イーサリアム公式

公式ドキュメントは日本語翻訳されてとても充実している. ファーストチョイス.

🐥初心者入門資料

とりあえず入門はイーサリアム公式サイトがいい. その上でのリンク.

📚Books

Solidty