Mainnet and Testnet - 本番のネットワークと試験用のネットワーク
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4 と tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx は、同じ公開鍵(後の実験で使う鍵)から作った Bitcoin のアドレスです。先頭の bc1 はメインネット、tb1 はテストネットのアドレスであることを示し、途中の文字列は同じです。 ...
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4 と tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx は、同じ公開鍵(後の実験で使う鍵)から作った Bitcoin のアドレスです。先頭の bc1 はメインネット、tb1 はテストネットのアドレスであることを示し、途中の文字列は同じです。 ...
テストネット(testnet)は、メインネットとほぼ同じソフトウェアと規則で動く、試験用の公開のネットワークです。メインネット・テストネット・ローカルのチェーンの違いは Mainnet and Testnet で説明しました。 ...
Proof of Authority(PoA)は、あらかじめ許可した署名者(authority)だけにブロックの作成を認める合意の方式の総称です。ブロックは、トランザクションをまとめて前のブロックにつなげた単位です(Blockchain Basics)。 ...
gas は、Ethereum でトランザクションの実行に掛かる計算量を測る単位です。EVM(Ethereum Virtual Machine)の命令ごとに gas の量が決まっており、トランザクションは「使ってよい gas の上限」と「1 gas あたりに払う額」を書いて送ります。トランザクションをまとめた単位がブロックで、ネットワークに参加する全てのノード(Ethereum のソフトウェアを動かすコンピューター)がブロックのトランザクションを実行します。ブロック 1 つに入るトランザクションは、gas の合計にも上限があり、これが全ノードが 1 ブロックごとに実行する量の上限になります。 ...
アカウントモデル(account model)は、アドレスごとに残高などの状態を保存し、トランザクションがその状態を書き換える形で送金を表すモデルです。Ethereum が採用しています。UTXO で説明した Bitcoin の表し方には残高という保存された値が無く、コインは使い切りの出力として存在します。同じ送金でも、アカウントモデルは保存された数値を書き換え、UTXO モデルは出力を作り直します。 ...
Ethereum のトランザクション(transaction)は、ETH の送金、スマートコントラクトの呼び出しと作成をブロックチェーンのネットワークに依頼する、署名済みのデータです。ウォレットの確認画面で承認した時や、アプリが ethers などのライブラリで送った時に作られます。 手数料の欄には、上限という名前の値が 2 つあります。ところが、片方は条件を満たす間、上限ではなく書いた値がそのまま払われます。 ...
Ethereum のアドレスは、送金の宛先やプログラムの呼び出し先を指す 20 バイトの値で、0xf39Fd6e5… のような 16 進の文字列で書きます。銀行の口座番号と違い、誰かに申請して払い出してもらう番号ではありません。手元にある材料から、誰でも同じ計算で求められます。 ...
リプレイ攻撃(replay attack)は、署名した人が意図していない場所や時点で、正しく署名されたデータをもう一度使わせる攻撃です。デジタル署名が示すのは、誰が署名したかと、署名の後に中身が変わっていないことです。どこで何回使ってよいかは、署名した中身に書いていない限り示しません。 Ethereum のトランザクションは、送り主が秘密鍵で署名したバイト列で、mempool やブロックを通じて誰でも読めます。読めたバイト列は、誰でも別のノードへそのまま送り直せます。 ...
EVM(Ethereum Virtual Machine)は、Ethereum のノードが、トランザクションで呼び出されたコントラクトのコードを実行する仮想マシンです。Solidity などで書いたプログラムはバイトコードにコンパイルされ、EVM がその命令を 1 つずつ実行して、残高やストレージの値を更新します。 ...
EVM(Ethereum Virtual Machine)は、Ethereum のノードがコントラクトのコードを実行する仮想マシンです。デプロイしたコントラクトのコードは書き換えられません。では、そのコードを実行する EVM の命令の一覧(命令表)は、2015 年の公開から変わっていないのでしょうか。 ...
スマートコントラクト(smart contract)は、Ethereum などのブロックチェーンに置いて動かすプログラムです。コードとデータはチェーン上の 1 つのアドレスにまとまっていて、誰でもトランザクションを送って関数を呼べます。ERC-20 で作るトークンの残高表も、交換所の AMM も、コントラクトとして書かれています。 ...
ERC-4337 は、Ethereum のプロトコルを変えずに、スマートコントラクトのアカウントをトランザクションの送り主のように使えるようにする規格です。 Ethereum のアカウントには、秘密鍵で署名してトランザクションを送る EOA(Externally Owned Account)と、コードを持つコントラクトの 2 種類があります。チェーンにトランザクションを送れるのは EOA だけです。コントラクトで作ったアカウント(スマートアカウント)は、署名の確かめ方を自分のコードで決められるので、複数人の承認や鍵の差し替えを組み込めます。しかし、自分ではトランザクションを送れません。 ...
ERC-721 は、Ethereum 上で 1 つずつ区別できるトークンを扱うための規格です。このトークンは NFT(Non-Fungible Token、代替できないトークン)と呼ばれ、ゲームのアイテム、会員証、作品の所有証明などに使われます。 ...
交換サービスや貸し借りのサービスに、米ドルと同じ値で動く暗号資産の USDC を預けようとすると、ウォレットは送金の前に「このサイトに USDC の使用を許可しますか」と聞いてきます。許可の画面には金額の欄があり、既定で無制限になっているサービスもあります。開発する側も同じ所で迷います。ユーザーから受け取るコードを書くと、テスト用のトークンでは通るのに、USDT を渡すとトランザクションが取り消されることがあるからです。 ...
Ethereum のアカウントには、2 つの種類があります。秘密鍵を持つ人が操作する EOA(Externally Owned Account)と、デプロイしたコードで動くコントラクトのアカウント(contract account)です。複数人の承認で動くマルチシグや、署名の方法をコードで決めるスマートアカウントは、後者のコントラクトのアカウントで、秘密鍵を持ちません。 ...
Safe(旧 Gnosis Safe)は、Ethereum でマルチシグを実現するコントラクトのウォレットです。「所有者 3 人のうち 2 人」のように、登録した所有者のうち必要数の署名が揃った時だけ、Safe が持つ資産を動かします。取引所や DAO(Decentralized Autonomous Organization、コントラクトで運営する団体)の資金の管理に使われています。 ...
Ethereum の署名は、トランザクション(transaction)を送る時だけに使うものではありません。サイトへのログインやトークンの利用承認のように、トランザクションを送らずにメッセージだけに署名させる場面があります。これを「オフチェーン署名」と呼びます。 ...
ERC-7562 は、Ethereum のアカウント抽象化(account abstraction)の仕組みである ERC-4337 で、Bundler がアカウントの検証のコードに課す規則です。検証のコードが使って良い命令と、読み書きして良い storage(コントラクトが持つ永続的な領域で、32 バイトの番号=slot ごとに値を置く)を決めています。 ...
オラクル(oracle)は、チェーンの外にある価格などの情報をチェーンに書き込み、スマートコントラクトから読めるようにする仕組みです。暗号資産を担保に別の資産を貸すレンディングプロトコル(lending protocol)は、担保がいくらに当たるかをオラクルの価格で計算し、貸せる額と、担保を売って返済に充てる清算の時期を決めます。以下では、これを単にレンディングと呼びます。 ...
Ethereum では、ネットワークに参加する多数のコンピュータ(ノード)が、利用者の送ったトランザクションを同じ規則で実行し、結果が一致したものだけをブロック(トランザクションをまとめた記録の単位)として受け入れます。 ...
Ethereum のスマートコントラクト(チェーン上で動くプログラム。以下、コントラクト)には、一度置いたコードを書き換える命令がありません。そのため、利用者は、あるアドレスのコードを読んだり監査の結果を確認したりしてから、そのアドレスに資産を預けたり権限を与えたりします。後からコードが変わらないことが前提です。 metamorphic contract は、この前提を崩す手法です。コントラクトを消す命令 SELFDESTRUCT で消してから作り直し、同じアドレスに別のコードを置きます。2024 年 3 月の Ethereum の仕様の更新(Cancun)より前は、この手法が使えました。 ...
リエントランシー(reentrancy)は、スマートコントラクトが外部のアドレスへ ETH を送ったり、別のコントラクトを呼んだりしている途中に、呼ばれた側から元のコントラクトの関数を呼び直されることです。残高を減らす前に送金する実装では、呼び直された関数がまだ減っていない残高を読み、同じ預け金を何度も払い出します。この穴を突く攻撃をリエントランシー攻撃と呼びます。 ...
アップグレード可能なプロキシ(upgradeable proxy)は、スマートコントラクト(チェーン上で動くプログラム)について、アドレスとデータを変えずに処理だけを後から差し替えるための構成です。 Ethereum では、一度置いたコントラクトのコードを書き換えられません。そこで、利用者が呼ぶ入口のコントラクト(プロキシ)と、処理のコードを持つ別のコントラクト(実装)に分け、プロキシが覚えている「実装のアドレス」だけを書き換えます。 ...
blob は、Ethereum のトランザクションに添えて送る、1 個 131,072 バイト(128 KiB)のデータです。2024 年 3 月 13 日の Dencun アップグレードで、EIP-4844 として入りました。blob を添えたトランザクションは型の番号が 0x03 で、型の一覧は Ethereum Transaction で説明しています。 ...
スマートコントラクトで、入札額を最後まで伏せる封印入札(sealed-bid)のオークションを開くとします。Alice が「50 で入札する」というトランザクションを送ると、そのトランザクションはブロックに入る前に mempool(ブロックに入る前のトランザクションを置く場所)を通じてネットワークに広まり、誰でも中身を読めます。 Bob はそれを見てから 51 で入札し、手数料を上乗せすれば、後から送った自分のトランザクションを Alice より前に並べてもらえます。手元のローカルチェーンで試すと、Bob の入札が先に処理され、Alice の入札は「too low」で取り消されました。 ...
Ethereum では、ネットワークに参加する多数のノード(トランザクションを検証するコンピュータ)が、全てのトランザクションを同じ順に実行して結果を照合します。誰でも結果を確認できる代わりに、1 秒に処理できるトランザクションの数が限られ、混み合うと手数料が上がります。 ...
Proof of Stake の Ethereum では、ブロックを作る順番が決まっています。時間を 12 秒ごとの slot(スロット)に区切り、slot ごとに 1 つのバリデータ(ETH を預けてブロックの提案と投票を担う参加者)を proposer(ブロックの提案者)に選びます。proposer は、その slot のブロックに入れるトランザクションと並び順を決め、署名してネットワークに送ります。 ...
ブロックチェーンでは、利用者が送ったトランザクションはすぐには実行されません。いったんトランザクションの置き場に集められ、ブロックを作る者がその中からトランザクションを選び、順番に並べてブロック(トランザクションをまとめた記録の単位)にした時に、上から順に実行されます。 ...
Cross-Chain Bridge(以下、bridge)は、あるブロックチェーン(以下、チェーン)で資産が金庫に預けられたことを確認して、別のチェーンで同じ量のラップドトークン(wrapped token)を発行する仕組みです。ラップドトークンを焼却(消すこと)すると、元のチェーンの金庫から資産が払い出されます。預ける側を source chain、ラップドトークンを受け取る側を destination chain と呼びます。 ...
Cross-chain bridge(以下、bridge)は、あるブロックチェーンで起きた預け入れの事実を別のブロックチェーンに伝えて、資産を移す仕組みです。 ブロックチェーン(以下、チェーン)は、参加するコンピュータが同じトランザクションの記録を共有する台帳で、Ethereum や Bitcoin がその例です。チェーンごとに台帳は別々なので、Ethereum の通貨である ETH は Ethereum の台帳の中にしか存在しません。 ...