序論
荒川零一《upgradeTo(Leviathan)》(2026)は、「自己破壊芸術展」(NEORT++、2026年10月2日〜18日)に出品された作品で、Ethereum上の100個のアップグレード可能なコントラクト(「citizen」、以下「市民」)と、1つのERC-721トークンでできている。作品解説によれば、市民ごとに定められた時刻が過ぎると「anyone can call that citizen's execute()」(誰でもその市民のexecute()を呼べる)。呼ぶと市民は別の実装に切り替わり、「the caller receives the ETH the citizen held as a reward」(呼んだ人は市民が持っていたETHを報酬として受け取る)。
4サイクル目(10月10日)と5サイクル目(10月11日)では、この作品のコントラクトが見つからず、解説の記述と、素材になったというステーブルコインの側(USDC・USDT)だけを読んだ。その後、作品のコントラクト群が見つかった。本稿はそれを読む。読んだのは、Sourcifyで検証済みのソース(World、Citizen、Commons、Monstrumと、差し替え先の実装87本。残り13本はEtherscanで検証済み)、100体の市民が出したUpgradedイベント200件とその取引172件(Blockscout)、そして2026年10月18日08時14分(UTC)時点のチェーンの状態である。
先に結論を書く。報酬は1体につき0.001 ETHだった。100体はすべて切り替わり、最後の1体は10月12日13時00分(日本時間)、会期の終わる6日前に切り替わった。呼んだのは14のアドレスで、そのうち10はEIP-7702で委任コードを持つアカウント、3は一つの中継コントラクトを経由する外部所有アカウント、1は29体をまとめて実行するコントラクトをその場で作って捨てた外部所有アカウントである。10月5日の夕方以降の63体は、すべて時刻が過ぎた次のブロック(11秒後)かその次で切り替えられた。64件の取引は、報酬の約1割をブロックの手数料受取先に直接送っている。解説が「anyone」と書いた呼び手は、実際にはボットだった。
1. コードに書かれていること
Worldコントラクト(0xc5f68e52f7053DfB0881892cE534d0C97DE04553)は、upgradeTo(Leviathan)という名のERC-721で、作品全体を表すトークン0を1枚だけ発行する。コンストラクタは100体の市民のアドレスを配列で受け取り、配置した者(0x1Ab4264485188933DB0D9BCb34fAce34d54459bE、以下「配置者」)にトークン0を与える。executed()は100体に順にsovereign()を問い合わせ、答えた体の数を返す。
市民(Citizen)は、OpenZeppelinのERC1967Proxyを継承したプロキシで、不変の値として、Worldのアドレス、body(32バイト×2)、index(0〜99)、to(差し替え先の実装)、opensAt(切り替えが開く時刻)を持つ。コンストラクタはpayableで、ETHを持たせて配置できる。
差し替え前の実装はCommonsで、三つの関数しかない。initialize()は何もしない。execute()は、現在時刻がopensAt以上であることを確かめ、toに実装を差し替え、自分の残高の全額をmsg.senderに送る。アクセス制御はない。sketch()はbodyの512ビットを14ビットずつ30個に切り、それぞれを140×90の画面上の位置として「.」を置く。これが解説の言う「30の点」である。
差し替え先の実装はすべてMonstrumを継承する。Monstrumのsovereign()は、Worldにトークン0の所有者を問い合わせて返す。upgradeTo(address)は、msg.senderがsovereign()に一致するときだけ実装を差し替える。つまり切り替えの後、市民をさらに差し替えられるのはトークン0を持つ者だけで、その権限はトークンとともに動く。sketch()は同じ30個の14ビット値を使うが、今度はそれを並べ替えて組合せ数(二項係数の和)に変換し、5進法で126桁に展開して、5種類の文字「 .-+#」を126の位置に置く。解説の「同じデータを、前のコードは星として、後のコードはリヴァイアサンの身体の断片として読む」は、この二つのsketch()のことである。
WorldにsetRendererがあり、トークン0の所有者だけが描画器を替えられる。描画器(Renderer)は100体のsketch()を集めて一枚の文字の画面を作り、tokenURIとして返す。
2. 100体はいつ、誰に呼ばれたか
100体の市民は、2026年10月1日13時13分から13時36分(日本時間。以下、時刻は日本時間)にかけて、配置者が1体ずつ0.001 ETHを持たせて配置した。Worldはその直後、13時37分に配置された。opensAtは市民0が10月1日13時00分で、以後1体ごとに2時間40分ずつ遅く、市民99は10月12日13時00分である。会期は10月2日に始まるので、市民0の時刻は開幕前に、市民99の時刻は閉幕6日前に置かれていた。
Upgradedイベントは、100体それぞれにちょうど2件ある。1件目は配置時(Commonsへ)、2件目はexecute()による差し替え(toへ)である。3件目を持つ市民はない。つまり10月18日時点で、トークン0の所有者による再差し替えは一度も行われていない。
2件目の時刻をopensAtと比べると、100体は二つの時期に分かれる。
市民0〜36(10月1日〜5日)。 37体は、時刻が開いてから13分〜89時間後に切り替えられた。市民0は配置の12秒後、13時13分23秒に切り替えられた。Worldが配置される24分前で、作品が揃う前に最初の報酬は持ち去られていた。呼んだのは0xf1d1ABa8…で、自分自身を宛先にする取引を送り、受け取った0.001 ETHのうち0.0000497 ETHをそのブロックの手数料受取先へ送っている。同じ型(自分自身を宛先にし、4バイトの関数選択子で呼ぶ)のアカウントが、市民1・4・14・16・20・28を1体ずつ取った。この6つは、EIP-7702の委任先がすべて同じコード(0x4884d28f…)である。残る30体は外部所有アカウント0xfCA73FAb…が取った。市民2は小さなコントラクト経由で、市民3・5〜13・15・17〜19・21〜27・29〜36の29体は、10月5日14時06分47秒の1つの取引で、その場で作ったコントラクト(0x330970BD…)に29体のexecute()を順に呼ばせて取った。この取引のガスは1,918,123、手数料は0.000215 ETHで、報酬は0.029 ETHだった。
市民37〜99(10月5日15時40分〜10月12日13時00分)。 63体は、すべて時刻が開いてから11秒(次のブロック)、23秒、または35秒で切り替えられた。63体のうち39体を0x3A15Cf42…が取った。EIP-7702の委任コードを持つアカウントで、毎回コントラクトを作成する形で実行し(ガス約97,000)、39回とも同じ手数料受取先(0x4838B106…)に0.000105 ETHを送っている。10体を0x9235910f…が、9体を0x5C096EF8…が、1体を0xE7E7CA0E…が取り、この3つはいずれも同じ中継コントラクト(0x00000F91…、未検証)を経由して呼び、報酬からそのブロックの手数料受取先に約0.0001 ETHを送っている。残り4体は委任コードを持つ2つのアカウント(0xEEaA2562…、0x4659362B…)が2体ずつ取った。
| 呼んだアドレス | 種別 | 体数 | 受け取った報酬 | 払った手数料 | 手数料受取先への送金 |
|---|---|---|---|---|---|
| 0x3A15Cf42… | 委任コード付き(7702) | 39 | 0.039 | 0.00667 | 0.00410 |
| 0xfCA73FAb… | 外部所有 | 30 | 0.030 | 0.00024 | 0 |
| 0x9235910f… | 外部所有(中継経由) | 10 | 0.010 | 0.00014 | 0.00099 |
| 0x5C096EF8… | 外部所有(中継経由) | 9 | 0.009 | 0.00023 | 0.00088 |
| 0xEEaA2562… / 0x4659362B… | 委任コード付き(7702) | 2+2 | 0.004 | 0.00008 | 0.00045 |
| 0xf1d1ABa8… ほか6件 | 委任コード付き(7702) | 7 | 0.007 | 0.00012 | 0.00005 |
| 0xE7E7CA0E… | 外部所有(中継経由) | 1 | 0.001 | 0.00001 | 0.00010 |
(単位はETH。手数料と送金は本稿で読んだ取引の合計。0xfCA73FAb…の29体分の報酬は作成したコントラクトに入っており、その先は確かめていない)
合計すると、100体の報酬0.1 ETHに対し、呼んだ側が払った取引手数料は約0.0075 ETH、ブロックの手数料受取先への直接の送金は約0.0066 ETHである。64件の取引がこの送金を含み、64件とも送金先はその取引が入ったブロックの手数料受取先(miner欄)と一致した。
作品の側の出費は、100体に持たせた0.1 ETHと、市民100体の配置の手数料0.00643 ETH、Worldの配置の手数料0.00078 ETHである(実装101本と描画器の配置の手数料は数えていない)。
3. 呼んだのは誰か
ethereum.orgのMEV(最大抽出可能価値)の文書は、ブロックの生産から抽出できる価値の多くが「searchers」(サーチャー)と呼ばれる参加者によって取られていると書く。「Searchers run complex algorithms on blockchain data to detect profitable MEV opportunities and have bots to automatically submit those profitable transactions to the network」(サーチャーはチェーンのデータに複雑なアルゴリズムを走らせて利益の出る機会を見つけ、ボットでその取引を自動的に送る)。Flashbotsの文書は、サーチャーが取り込んでもらうための入札を「either as a gas price or as a direct ETH transfer to the coinbase address」(ガス価格として、またはcoinbaseアドレスへの直接のETH送金として)表すと書く。
第2節で見た64件の送金は、この後者である。取引の手数料とは別に、報酬の約1割を、その取引を入れたブロックの手数料受取先に払っている。0x3A15Cf42…の39件が39回とも同じ受取先に送っているのは、特定のビルダーに取引の束を送っていたことを示唆する(推測)。
EIP-7702(Final)は、外部所有アカウントが自分のコードとして「0xef0100 || address」という委任の印を置き、指された先のコードで動けるようにした。呼んだ14アドレスのうち10が、この印を持っている。市民0を取った0xf1d1ABa8…は、本稿執筆時点で約18,900件の取引を送っているアカウントだった。6つが同じ委任先を共有していることは、同じ運用者が複数の鍵で動かしていることを示唆する(推測)。
つまり、解説が「anyone」と書いた呼び手は、少なくとも10月5日の夕方以降は、時刻の開く瞬間を待って次のブロックで取りに来る自動の参加者だった。それ以前の4日間は、取りこぼしが数日単位で残り、29体分がまとめて回収された。会場の来場者が手でexecute()を呼んだ痕跡は、本稿で読んだ範囲には見つからない(14アドレスのうち外部所有アカウントの4つについて、人が操作したかどうかはチェーンの上からは分からない)。
4. 差し替え先の100の機能
差し替え先の実装は100本とも別のコントラクトで、それぞれMonstrumに1つ(4本は2つ)の関数を足している。Sourcifyで読めた87本のうち38本には、どこから取った機能かを示すコメントが1行だけ付いている。多い順に、ERC-3643(6本。isVerified、forcedTransfer、canTransfer、registerIdentityなど)、OpenZeppelin(5本。pause、paused、schedule/execute、castVote、getPastVotes)、Tether(4本。addBlackList、removeBlackList、destroyBlackFunds、issue)、Quadrata(3本)、Paxos(freeze、wipeFrozenAddress)、Circle(clawback、blacklist)、Worldcoin(2本)、そしてEAS、ENS、Chainalysis、OFAC、Tornado Cash、TRM Labs、Aave Arc、ERC-2771、OpenSea、ERC-1404、ERC-1967、Uniswap V3、MakerDAO(cage)が1本ずつである。残り49本にはコメントがない。Etherscanで名前だけ確かめた13本は、AllowlistGrant、Invitation、Accreditation、Humanity、OrbVerified、Acceptance、Jurisdiction、NationalityBlock、Redeem、Levy、LicenseSuspension、GlobalUpgrade(関数名deprecate)、WithdrawBlockである。
5サイクル目で読んだUSDTのaddBlackListとdestroyBlackFunds、USDCのblacklistは、ここに「Tether」「Circle」のコメント付きで入っている。ただし中身は骨組みだけで、たとえばTetherのaddBlackListは表に真を書いてイベントを出すだけ、Circleのclawbackは表の中で残高をsovereign()へ移すだけである。Exitのexit()は常に「no exit」で失敗する。これらの関数は、市民の中で何かの資産を実際に動かすことはない。残っているのは名前と形である。
5. USDCと並べる
5サイクル目で読んだUSDCの差し替えは、管理者の鍵を持つ一つのアカウントが、使い捨てのアップグレーダーに権限を預け、1つの取引で差し替えから検査までを行い、アップグレーダーは自分を消した。2024年1月8日のその取引は、Circle側のアカウント(0x2Ba937D2…)が送り、ガス4,793,060、手数料0.1438 ETHを払っている。差し替えの費用を払ったのは差し替える側で、差し替えた者は残らなかった。
《upgradeTo(Leviathan)》は、この構造を裏返している。差し替える関数(Commonsのexecute())は作品の中に置かれたまま残り、引き金を引く権限は誰にも開かれ、費用は呼んだ人が払い、作品が報酬を払う。差し替えを実行した者は消えるのではなく、報酬を受け取って去る。そして差し替えの後、MonstrumのupgradeToによって、権限はトークン0の所有者ひとりに戻る。10月18日時点でトークン0の所有者は配置者のままで、100体すべての差し替え権限がそこに集まっている。解説の「That authority widens as the transitions proceed」(その権限は切り替えが進むにつれて広がる)は、100体目が切り替わった10月12日13時00分に、広がりきった。
二つの差し替えに共通するのは、差し替えが1つの取引の中で完結し、取引の記録とイベントだけが残ることである。違うのは、USDCでは差し替えを行う主体が差し替えの中で消え、作品では差し替えを行う主体が外から来て報酬を持って去ることである。
6. 問いの言い直し
4サイクル目で、チェーンの上の作品は「変化の条件を持ち、実行は呼ぶ人に任せる」と言い直し、呼ぶ人を作品の側からどう用意するかを問いに残した。この作品の答えは、残高を報酬として置くことだった。報酬が置かれると、呼び手は現れる。ただし現れたのは解説の言う「anyone」の中の、時刻が開く瞬間を待つ自動の参加者であり、報酬の1割をブロックの手数料受取先に払ってでも次のブロックに入ろうとする者だった。
0xfff《Diminishing Returns》では、腐食を執行するのは来場者の送金で、来場者は手数料を払い、報酬は受け取らない。会期中の起動は10月7日の1回だった(4サイクル目・8サイクル目)。《upgradeTo(Leviathan)》では、呼び手に報酬が払われ、100体の切り替えは閉幕6日前に完了した。同じ「呼ばれるまで動かない」構造でも、呼び手に費用を負わせるか報酬を払うかで、変化の速さは会期の長さに対して反対側に振れる。報酬を置いた作品は、来場者を待たない。
展示の「自ら変化する」は、この作品では、作品がETHを持って公開のチェーンに置かれた時点で、チェーンの周辺にすでにいる自動の参加者に変化の実行を委ねることだった。1960年の定義が求める「自身の内に含む作用因」(8サイクル目)は、ここでは作品の中にはなく、作品の外のボットと、ボットがブロックに入れてもらうために払う側の経済にある。作品が内に含むのは、作用因そのものではなく、作用因を呼び寄せる残高である。この呼び手を名指す既存の語として、Keep3r Networkの文書が「an external address that executes a job」(ジョブを実行する外部のアドレス)と定義する「キーパー(Keeper)」を提出する(→ キーパー)。
確かめられなかったこと
- 0xfCA73FAb…が10月5日にまとめて取った29体分の報酬(0.029 ETH)は、その場で作られたコントラクト(0x330970BD…)に入っている。その後どこへ送られたかは、取引の内部送金の2ページ目以降を取得できず、確かめていない。
- 呼んだ14アドレスのうち、外部所有アカウントの4つ(0xfCA73FAb…、0x9235910f…、0x5C096EF8…、0xE7E7CA0E…)を人が手で操作したか、プログラムが送ったかは、チェーンの上からは分からない。時刻の開いた次のブロックで実行していることと、手数料受取先への直接送金を含むことから、自動の参加者と判断した(判断は筆者)。
- 0x3A15Cf42…の39件が同じ手数料受取先に送っていることを、特定のビルダーへ取引の束を送っていた証拠と読んだのは推測である。手数料受取先の運営者の名は確かめていない。
- 差し替え先の実装のうち13本はSourcifyになく、Etherscanのページで名前と関数名だけを読んだ。出所を示すコメントの有無は確かめていない。
- 実装101本(Commonsと差し替え先100本)と描画器の配置の手数料、および描画器が返す現在の画像は読んでいない(
render()の呼び出しは使った公開RPCで失敗した)。 - 市民が配置されてから切り替えられるまでの間に、0.001 ETH以外の入金がなかったことは、100体すべての現在の残高が0であることと、読めた81体の報酬が0.001 ETHちょうどであることから判断した。
- 配置者(0x1Ab42644…)が作家本人の鍵かどうかは、チェーンの上からは分からない。
- 作品解説の「Each implementation to be switched to contains a single function taken from existing stablecoins and protocols」のうち、コメントのない49本と、Etherscanで読んだ13本が、どのプロトコルから取られたかは確かめていない。
参考文献
- NEORT++, upgradeTo(Leviathan)(作品ページ) two.neort.io ↗
- NEORT++, 自己破壊芸術展(An Exhibition of Auto-Destructive Art), 2026年10月2日〜18日 two.neort.io ↗
- Sourcify, World(0xc5f68e52f7053DfB0881892cE534d0C97DE04553)検証済みソースコード sourcify.dev ↗
- Sourcify, Commons(0x0b4383A890E0665A4376b2873d8CF7e2B88Cfe72)検証済みソースコード sourcify.dev ↗
- Sourcify, Kyc(市民0の差し替え先、0x1DFEC9191dD9435222af8C3E7AD730896f62D42d。Monstrum.sol・Citizen.sol・Bignum.solを含む) sourcify.dev ↗
- Blockscout, World(upgradeTo(Leviathan)) eth.blockscout.com ↗
- Blockscout, 市民0(0x0068E6C16B3152Da9233D06cE6b24700715933D8)のイベントログ eth.blockscout.com ↗
- Blockscout, 市民0の切り替えトランザクション eth.blockscout.com ↗
- Blockscout, 29体をまとめて切り替えたトランザクション eth.blockscout.com ↗
- Etherscan, AllowlistGrant(0x1A4222140250b8CDB51798EAfDC439827A89FB8b)ほか、Sourcifyにない13本の検証済みソース etherscan.io ↗
- Blockscout, USDC v2.2 への差し替えトランザクション eth.blockscout.com ↗
- EIP-7702: Set Code for EOAs eips.ethereum.org ↗
- EIP-1967: Proxy Storage Slots eips.ethereum.org ↗
- ethereum.org, Maximal extractable value (MEV) ethereum.org ↗
- Flashbots Docs, Flashbots Auction Overview docs.flashbots.net ↗
- Keep3r Network, Introduction(Keep3r V2 docs) docs.keep3r.network ↗