coetus’s blog

Blockchain の Improvement Proposal などの和訳をしています

EIP-2 - Homestead Hard-fork Changes (ざっくり和訳)

Meta EIP は EIP-606: Hardfork Meta: Homestead を参照

仕様

block.number >= HOMESTEAD_FORMBLKNUM で以下を行う。

  1. トランザクションコントラクトを作成する gas cost が 21000 から 53000 まで上昇する。即ち、空のアドレスにトランザクションを送信したとき、初期のgas減少値が 53000 + (txdata の gas cost) であり、現在の 21000 よりも大きくなる。CREATEのopcodeを使ったコントラクト生成は影響を受けない。
  2. s-valuesecp256k1n/2 より大きい全てのトランザクションの署名は不当と見なされる。ECDSAでプリコンパイルされたコントラクトを復号する場合は影響を受けず、s-valueが大きい値を受け取り続ける。この仕様は、例えば古い Bitcoin の署名を復号するコントラクト場合に役立つ。
  3. コントラクトが、コントラクトコードを状態に追加するために必要な最終的な gas の手数料を払うのに十分な gas を持たないとき、コントラクトを空のママにするのではなく、コントラクト生成が失敗するようになる(out-of-gas)。
  4. 現状の公式から難易度調整アルゴリズムの変更が起こる。 block_diff = parent_diff + parent_diff // 2048 * (1 if block_timestamp - parent_timestamp < 13 else -1) + int(2**((block.number // 100000) - 2))(where the+ int(2**((block.number // 100000) - 2))represents the exponential difficulty adjustment component) toblock_diff = parent_diff + parent_diff // 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99) + int(2**((block.number // 100000) - 2)), // は、整数除算の演算子である。minDifficulty は、難易度の最小値を示しており、この値より小さい難易度に調整されることはない。

原理

現在のところ、トランザクションコントラクトを作成する余分なインセンティブがある。トランザクションのコストが 21000 であり、コントラクトのコストの 32000 より小さいからである。加えて suicide refunds のお蔭で、現状はたった 11644 gas で単純な ether value transfer が可能である。以下のコードで実現できる。

from ethereum import tester as t
> from ethereum import utils
> s = t.state()
> c = s.abi_contract('def init():\\n suicide(0x47e25df8822538a8596b28c637896b4d143c351e)', endowment=10**15)
> s.block.get_receipts()\[-1\].gas_used
11664
> s.block.get\_balance(utils.normalize\_address(0x47e25df8822538a8596b28c637896b4d143c351e))
1000000000000000

これはとりわけ深刻な問題ではないが、しかしながら間違いなくバグである。

0 < s < scp256k1n の範囲内である任意の s 値のトランザクションを現状通り許容してしまうと、トランザクションの malleability concern を開放することになる。トランザクションを受け取って s -> secp256k1n - s に s 値の反転が可能になり、 v 値を 27 -> 28, 28 -> 27 と言ったように反転できてしまい、計算した署名が正当になってしまうからである。これは深刻なセキュリティの欠陥ではない。Ethereum は ether value transfer や 他のトランザクションへの入力に、トランザクションのハッシュではなくアドレスを利用しているのが主な理由である。しかしながら、この欠陥によってブロックに入っている承認済みトランザクションが、任意のユーザが送信したトランザクションの異なるハッシュ値に変更できてしまい、トランザクションハッシュをトラッキングIDとして利用するUIに影響を与えてしまう。高い s 値を避けることで、この問題を取り除くことができる。

コントラクト生成で、最終的な gas の手数料が支払えない場合に out-of-gas するようにした場合、以下のような利益がある。

  1. コントラクト生成のプロセスの結果において、成功と失敗の区別がより直感的になる。
  2. コントラクト生成が完全に成功しない限り、コントラクトアカウントが生成されないため、失敗の検知がより容易になる。
  3. 寄付金がある場合にコントラクト生成を安全にする。全体の初期のプロセスが起こるか、トランザクションが否認されるかによって、寄付金の払い戻しが保証されるからである。

難易度調整の変更は Ethereum プロトコルが、過度のマイナーがタイムスタンプ = parent_timestamp + 1 を含むブロックのマイニングをしていた 2 ヶ月前を参照する問題を最終的に解決する。この問題はブロック生成の時間分布を歪めてしまった。現在のブロック生成時間のアルゴリズムは、13秒のメジアンになるように調整されるものだが、メジアンは同じでも平均は上昇し始めてしまった。51% のマイナーがこの方法でマイニングを始めてしまったら、平均は無限大まで上昇してしまうだろう。提案された新しい公式は、ざっくり目標の平均値に基づくものである。この公式を利用することで、平均のブロック生成時間が長期的な視点で数学的に 24 秒を超えることが不可能になるという証明がされている。

メインの入力変数として、時刻変位ではなく (block_timestamp - parent_timestamp) // 10 を利用することは、アルゴリズムの粗さを抑えることに直接役立ち、微小に難易度が高いブロックを生成するために、ちょうど 1 だけ異なるタイムスタンプを設定しようというインセンティブを抑えることにもなる。これによって、フォークの可能性に打ち勝つことが保証される。-99の上限は、クライアントのセキュリティバグや black-swan 問題のために、2 つのブロックが非常に遠く離れている場合に、難易度が極端に落ちないようにするものである。