-
Notifications
You must be signed in to change notification settings - Fork 45
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Shorten block time #62
Conversation
今回のハードフォークは2段構えになってます 1. Environment&StakeManagerのアップデートこれまで通りのブロック番号ベースのハードフォークです。
2. Environment.updateValue()の実行こちらはエポック番号ベースのハードフォークです。 oasys-validator/params/config.go Lines 606 to 617 in 7013a65
以下の条件に合致するブロックで実行されます。
例えばStartEpochに10が指定されている場合は |
b4cbd97
to
81a49e9
Compare
…nment values are switched
var seed int64 | ||
if env.Epoch(number) >= c.chainConfig.OasysShortenedBlockTimeStartEpoch().Uint64() { | ||
// prevent overflow | ||
seed = new(big.Int).Mod(seedHash.Big(), BigMaxInt64).Int64() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
コメントで「ブロックタイムを短くすることととは関係ないが、overflowするとわかったので、合わせて修正した」というような内容を添えてもらえますでしょうか?
|
||
// Add array values to storage. | ||
func (a *array) add(storage map[common.Hash]common.Hash, rootSlot common.Hash) error { | ||
storage[rootSlot] = common.BigToHash(big.NewInt(int64(len(*a)))) | ||
func (a *array) apply(cfg *params.ChainConfig, storage map[common.Hash]common.Hash, rootSlot common.Hash) error { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
} | ||
|
||
if t, ok := extract(val).(structvalue); ok { | ||
return int64(len(t)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Storageサイズは32byteごとにPackされます。
単純に要素をカウントするだけだと正確ではないので、そのことをTODOに残しておいてください。
例えば、次のStructの場合
struct X {
address a; // 20 bytes
bool b; // 1 bytes
uint256 c; // 32 bytes
}
消費されるSlotは
(20 bytes + 1 bytes) + (32bytes) -> 2 slot
です。
Packされた場合、structvalue.applyのmemberSlot
も変わってきます。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
そもそもですがstorage.goは記述者がストレージレイアウトの仕様を理解していることを前提にしています。そうでないとテストコードが書けないからです。
例えばstructvalue等のデータ構造を使わなくとも全てベタ書き可能ですがそれではあまりにも読み辛いかつ面倒なので用意したにすぎません。
// このStructのストレージを表現したいとする
// X({ a: address(255), b: true, c: uint256(65535) });
// structvalueパターン
storage{
"0x00": structvalue{
"0x00000000000000000000000000000000000000ff000000000000000000000001",
"0x000000000000000000000000000000000000000000000000000000000000ffff",
},
}
// ベタ書きパターン
storage{
"0x00": "0x00000000000000000000000000000000000000ff000000000000000000000001",
"0x01": "0x000000000000000000000000000000000000000000000000000000000000ffff",
},
}
ストレージレイアウトの仕様を理解していないとこのような記述をしてしまう可能性がありますがそれは対象外かつテストコードで検知するべきです。
storage{
"0x00": structvalue{
"0x00000000000000000000000000000000000000ff000000000000000000000001",
"0x000000000000000000000000000000000000000000000000000000000000ffff",
},
"0x01": "0x...", // X.cの値を上書きしてしまった
}
作りこんでスロット計算を完璧にする事は可能ですが現時点では不要だと思っています。
slot := 0
for _, val := range structvalue {
switch val.(type) {
case uint8:
case uint16:
case uint32:
....
}
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
注意書きを追加しました
oasys-validator/contracts/oasys/storage.go
Lines 121 to 123 in 0002fb5
// `struct` type value. | |
// Assumes that each contained value is exactly one slot in length (32 bytes). | |
type structvalue []interface{} |
TODO:フォークエポックを決める oasys-validator/params/oasys.go Lines 13 to 14 in 0002fb5
|
ハードフォーク
15秒
から6秒
に変更5760
から14400
に変更バグ修正
コード改善