Homeテクニカル「ジャンクデータ」を取り締まろうとしたビットコインのソフトフォーク——なぜすでに失敗しつつあるのか

「ジャンクデータ」を取り締まろうとしたビットコインのソフトフォーク——なぜすでに失敗しつつあるのか

本稿はBrandon Black氏によるゲスト寄稿です。本文中の見解はすべて筆者個人のものであり、BTC Inc.やBitcoin Magazineの見解を必ずしも反映するものではありません。

Bitcoin X(旧Bitcoin Twitter、あるいはCrypto Twitter)というインターネット上の狭い界隈では、この1年、@dathon_ohm による「Reduced Data Temporary Softfork(データ削減のための一時的ソフトフォーク)」——通称BIP110——の提案をめぐって、多くの騒がしい議論が交わされてきた。この提案の根底にあるのは、一部のビットコイン取引が、そのロックスクリプトやアンロックスクリプトの中に、本来のビットコインスクリプトとしての解釈のほかにも別の意味に読み取れるデータを含めることで、ネットワークの原則に反しているという考え方だ。BIP110の支持者によれば、こうした取引の利用を減らすことは、これまでで最も没収的なソフトフォークを——直近2回のソフトフォークよりも大幅に速い展開スケジュールで、かつより低いアクティベーション(有効化)の準備完了閾値で——正当化するのに十分な理由だという。

ビットコインは、誰でもアクセスできる検閲耐性のある台帳であり、ブロックテンプレートの作成者やマイナーに自分の取引を取り込ませるのに十分な手数料を払う意志さえあれば、誰でもそこに記帳できる。他のあらゆる台帳システムに対するビットコインの根本的な価値は、いま述べたオープンアクセスにある。それがなければ、ビットコインの台帳の価値は、ボウリング場のスコアボードと変わらない。この根本的なオープンアクセスゆえに、私たちが嫌う相手にもビットコインが使われることは、誰もが承知している。気に入らない言論にも適用されなければ意味をなさない言論の自由の原則とちょうど同じように、ビットコインのオープンアクセスもまた、あなたや私が承認する取引にしか及ばないのであれば意味をなさない。だから私は、自分の記帳を他人に詮索されたくないのと同じくらい、他人が自分の記帳をどう組み立てているかを詮索する側にも回りたくない——そう前提して話を進めることにする。

BIP110の推進派はこう言うかもしれない。「確かに。だがそれは金銭的な記帳についての話だ。こうした非金銭的な記帳はどうなんだ?」と。しかし実際には、そのような区別はそもそも存在しない。ビットコイン上のあらゆる取引は、何らかのロックスクリプトの条件を満たして台帳に記帳することで成立し、その過程でインプットのコインを消費してアウトプットのコインを生み出す。ある取引のスクリプトが別の取引より大きいか小さいかは、ビットコインのノード運用者としても一利用者としても、私にはまったく関係のないことだ。第一に、私はそもそも他人の取引を見ない。それは、近所のカフェで他人が何を注文したかと同じくらい、私の知ったことではない。第二に、私のノードもそのような区別をしない。取引は有効か無効かのいずれかであり、そして検証にコストがかかるか(大きなマルチシグのように)、検証が安上がりか(いわゆるOrdinalsやOP_RETURNのように)のいずれかにすぎない。

金(ゴールド)と同じく、ビットコインも他の見方をされ得ないものであったなら、より優れた通貨資産になっていただろう——そう論じることはできる。金が工業や宝飾品に使えなかったら、と想像してみてほしい。それによって金が貨幣としてより優れたものになる、というのは本当かもしれない。だがもちろん、金を優れた貨幣たらしめているまさにその性質こそが、宝飾品や工業においても金を望ましいものにしている。ビットコインにも同じことが当てはまる。手数料さえ払えば誰でも記帳できるというビットコインのまさにその性質は、その記帳が人々にどう見られるかを自分たちで制御できる、という発想を手放さねばならないことを意味する。記帳の構造にどんな制約を課したところで、ビットコイン以外のソフトウェアによって別の意味に解釈され得る記帳は、常に作り出せてしまう。だからビットコインでも金でも、私たちは別の用途が避けられないことを受け入れている。金の場合、これは非貨幣的な需要が増減するときに市場のゆがみを生む。ビットコインの場合、これは限られたブロックスペースへの需要が高まったときに、取引手数料が高くなる時期を生むことがある。

ビットコインには、金にはない2つの利点がある。第一に、別の見方ができるビットコイン取引を作っても、ビットコインそのものの市場には影響しない。金とは違い、そうした用途に振り向けられるビットコインはごくわずかだ。第二に、ビットコインには、そうした別解釈が検証ネットワークにかけるコストを最小化するよう、あらかじめ設計されたプロトコルがある。ビットコインは、ブロックのサイズと、取引で使える署名の数の両方に上限を設けている。これらは検証ノードにとって最大のコストであり、それらに対するプロトコル上の上限は、まさに台帳の高頻度・大量利用による濫用を防ぐために、ビットコインのごく初期から設けられてきた。こうした上限は、Lightning Network、Ark、Spark、Cashuをはじめとする数多くのイノベーションを、すでに後押ししてきた。こうした「非金銭的な」記帳(そう、確かにばかげた言い回しに聞こえる)が引き起こしたブロックスペース需要の高まりでさえ、メインの台帳への記帳がより少なくて済むこれらのスケーリング手段の利用を増やしてきたのだ。

BIP110を正当化する論拠をこうして検討し、それが嘆かわしいほど不十分であることを示せたと期待しつつ、次は提案されている変更そのものを見ていこう。BIP110は、ロックスクリプトのサイズを制限し、Taprootにおける代替スクリプトの数を制限し、Taprootのannex(アネックス)を無効化し、アップグレード可能なwitnessおよびtapscriptのバージョンをすべて削除し、tapscriptのアップグレード可能なオペコードをすべて削除し、tapscript内のOP_IFとOP_NOTIFを無効化する。これらの制限はすべて、アクティベーション後の52,414ブロック(約1年)の間に作られるUTXOに適用される。BIP110はさらに、これまでのマイナーのシグナリングによるソフトフォークで用いられてきた90%以上という閾値の代わりに、マイナーの準備完了シグナリングの閾値を55%とすることを提案している。もし961,632ブロックより前に55%のブロックが準備完了をシグナルしなければ、BIP110を強制するノードは、準備完了をシグナルしないブロックを無効として扱い、963,648ブロックまでに変更をロックインさせ、965,664ブロックまでにアクティベートさせようとする。

BIP110は、2010年にサトシが重大な脆弱性(CVE-2010-5137)に対応して多くのオペコードを無効化したあの有名な措置以来、ビットコインスクリプトに対する最も広範な制限となるだろう。BIPに番号が割り当てられた日から9か月足らずという期間で、前例のないほど低い閾値でのマイナーシグナリングによるアクティベーションと、ノードによる強制的なアクティベーションを提案している。そしてそのすべては、(前述のとおり)他の人々が特定の記帳を、BIP110の支持者が認めない仕方で見ている、というただそれだけの理由による。さらに悪いことに、そうした「認められない」記帳を使う人々は、仮にBIP110がビットコインのコンセンサスルールになったとしても同じ記帳を作り続けられるよう、すでに自分たちのソフトウェアを更新している。これはもちろん予見できた結末であり(私たちの多くははっきりとそう予言していた)、なぜなら、誰でもアクセスできる公開台帳上の記帳を分析するために他人が外部ソフトウェアをどう使うかを制限することは、根本的に不可能だからだ。

要するにBIP110は、ビットコインの既存のプロトコル上の上限によってすでに完全に対処されている問題に対して、不可能なこと——オープンアクセスな台帳の利用者がその台帳をどう使うかを制限すること——をやろうとする提案だ。しかもその不可能なことを、無責任なほど短いアクティベーションのスケジュールで、信じがたいほど限られたコードレビューしか経ずに、そして変更がエコシステムの何らかの合意に達するかどうかとは無関係に、やろうというのである。幸いなことに、ビットコインは、こうした無謀な改変の試みが成功してしまうほどか弱いシステムではない。マイナーがBIP110を明確に拒否しただけでなく、開発者・投資家・インフルエンサー・企業といった各方面からも、この変更に反対する声が上がっている。8月には、ビットコインのコンセンサスルールに対するこの攻撃は、その失敗を通じてビットコインをかえって強くしていることだろう。そしてネットワークは、変わらぬリズムを刻み続ける——チクタク、次のブロックへ(tick-tock, next block)。

Author

RELATED ARTICLES
.bitcoin-widget { background-color: #1a1a2e; color: white; padding: 20px; border-radius: 10px; max-width: 325px; width: 100%; font-family: Arial, sans-serif; box-sizing: border-box; margin: 0 auto; } .bitcoin-header { display: flex; align-items: center; margin-bottom: 15px; flex-wrap: wrap; } .bitcoin-icon { width: 24px; height: 24px; margin-right: 10px; } .price { font-size: 24px; margin: 0; margin-bottom: 10px; } .stats-container { display: flex; flex-wrap: wrap; justify-content: space-around; gap: 10px; margin-top: 10px; } .stat-column { text-align: center; flex: 1 1 30%; } .stat-label { font-size: 12px; color: #999; margin-bottom: 5px; } .stat-value { font-size: 14px; } .positive { color: #00ff00; } .negative { color: #ff0000; } .error-message { color: #ff0000; font-size: 12px; display: none; margin-top: 10px; } .view-charts-button { display: block; width: 100%; max-width: 250px; margin: 20px auto 0; padding: 10px; background-color: #ff9500; color: white; text-align: center; text-decoration: none; border-radius: 5px; font-size: 14px; font-weight: bold; } .view-charts-button:hover { background-color: #e68600; text-decoration: none; color: white; }
Bitcoin Bitcoin BTC/JPY
¥0
24hr %:
0.0%
24hr High:
¥0
24hr Low:
¥0
Error loading data. Check console for details.
VIEW 150+ BITCOIN CHARTS
async function updateBitcoinPrice() { try { const response = await fetch('https://api.coingecko.com/api/v3/coins/bitcoin?localization=false&tickers=false&market_data=true'); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); // Update price in JPY const price = data.market_data.current_price.jpy; const change = data.market_data.price_change_percentage_24h; // Percentage is currency-agnostic const high = data.market_data.high_24h.jpy; const low = data.market_data.low_24h.jpy; // Update price display with Yen symbol document.getElementById('bitcoin-price').textContent = `¥${price.toLocaleString('ja-JP', { minimumFractionDigits: 0, maximumFractionDigits: 0 })}`; // Update price change with color const changeElement = document.getElementById('price-change'); changeElement.textContent = `${change.toFixed(1)}%`; changeElement.className = 'stat-value ' + (change >= 0 ? 'positive' : 'negative'); // Update high and low prices with Yen symbol document.getElementById('high-price').textContent = `¥${high.toLocaleString('ja-JP', { minimumFractionDigits: 0, maximumFractionDigits: 0 })}`; document.getElementById('low-price').textContent = `¥${low.toLocaleString('ja-JP', { minimumFractionDigits: 0, maximumFractionDigits: 0 })}`; hideError(); } catch (error) { console.error('Error fetching Bitcoin price:', error); showError('Failed to fetch Bitcoin price'); } } function showError(message) { const errorElement = document.getElementById('error-message'); errorElement.textContent = message; errorElement.style.display = 'block'; } function hideError() { const errorElement = document.getElementById('error-message'); errorElement.style.display = 'none'; } // Initialize and start updates document.addEventListener('DOMContentLoaded', () => { try { updateBitcoinPrice(); setInterval(updateBitcoinPrice, 60000); } catch (error) { console.error('Initialization error:', error); showError('Initialization failed'); } });

LATEST NEWS

custom ad 1