diff --git a/contracts/registrar/contract/registrar.go b/contracts/registrar/contract/registrar.go index 5b4c774b49..543a5fc643 100644 --- a/contracts/registrar/contract/registrar.go +++ b/contracts/registrar/contract/registrar.go @@ -19,7 +19,7 @@ import ( const ContractABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\"},{\"name\":\"_description\",\"type\":\"string\"}],\"name\":\"AddAdmin\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GetAllAdmin\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GetLatestCheckpoint\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_sectionIndex\",\"type\":\"uint256\"}],\"name\":\"GetCheckpoint\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\"},{\"name\":\"_reason\",\"type\":\"string\"}],\"name\":\"RemoveAdmin\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_sectionIndex\",\"type\":\"uint256\"},{\"name\":\"_hash\",\"type\":\"bytes32\"}],\"name\":\"SetCheckpoint\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_adminlist\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"grantor\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"checkpointHash\",\"type\":\"bytes32\"}],\"name\":\"NewCheckpointEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"grantor\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"description\",\"type\":\"string\"}],\"name\":\"AddAdminEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"grantor\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"RemoveAdminEvent\",\"type\":\"event\"}]" // ContractBin is the compiled bytecode used for deploying new contracts. -const ContractBin = `608060405234801561001057600080fd5b50604051610da9380380610da983398101806040528101908080518201929190505050600060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600090505b81518110156101d2576001600080848481518110151561010057fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001828281518110151561015857fe5b9060200190602002015190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505080806001019150506100e4565b5050610bc6806101e36000396000f300608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633561247d1461007d57806345848dfc1461011e5780634d6a304c1461018a578063710aeac8146101c4578063a5ba0be21461020d578063c4885d57146102ae575b600080fd5b34801561008957600080fd5b50610104600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610301565b604051808215151515815260200191505060405180910390f35b34801561012a57600080fd5b50610133610558565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561017657808201518184015260208101905061015b565b505050509050019250505060405180910390f35b34801561019657600080fd5b5061019f61063f565b6040518083815260200182600019166000191681526020019250505060405180910390f35b3480156101d057600080fd5b506101ef6004803603810190808035906020019092919050505061065e565b60405180826000191660001916815260200191505060405180910390f35b34801561021957600080fd5b50610294600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061067b565b604051808215151515815260200191505060405180910390f35b3480156102ba57600080fd5b506102e7600480360381019080803590602001909291908035600019169060200190929190505050610a0d565b604051808215151515815260200191505060405180910390f35b6000806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561034f57600080fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561039f5760009050610552565b60016000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507fecd88a3d10808aac9f879bbae95f9e4f9687f6c9f0615b88af2085f226d3cf93833384604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105115780820151818401526020810190506104f6565b50505050905090810190601f16801561053e5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600190505b92915050565b60608060006001805490506040519080825280602002602001820160405280156105915781602001602082028038833980820191505090505b509150600090505b600180549050811015610637576001818154811015156105b557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682828151811015156105ee57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610599565b819250505090565b600080600061064f60035461065e565b90506003548192509250509091565b600060026000838152602001908152602001600020549050919050565b6000806000806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115156106cc57600080fd5b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561071c5760009250610a05565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600091505b6001805490508210156108fc578473ffffffffffffffffffffffffffffffffffffffff1660018381548110151561079657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108ef578190505b600180805490500381101561089057600180820181548110151561080157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660018281548110151561083b57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806001019150506107e1565b6001808080549050038154811015156108a557fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600180818180549050039150816108e99190610b49565b506108fc565b8180600101925050610763565b7fe7d6ab069cde0507dc9c5971bf93e9fd183db04690725946e8cae907367e7c1f853386604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109c45780820151818401526020810190506109a9565b50505050905090810190601f1680156109f15780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600192505b505092915050565b6000806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111515610a5b57600080fd5b6003548314158015610a7257506001600354018314155b8015610a815750600060035414155b15610a8f5760009050610b43565b610100618000600185010201431015610aab5760009050610b43565b8160026000858152602001908152602001600020816000191690555082600381905550827f5b3eab050ccf1a983a26b4f6acb13c199093c7d2e7523a0ff036519f7ddaf5603384604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390a25b92915050565b815481835581811115610b7057818360005260206000209182019101610b6f9190610b75565b5b505050565b610b9791905b80821115610b93576000816000905550600101610b7b565b5090565b905600a165627a7a72305820eb37f4d3298a6e621a53fa9a92f70e4ae3fa9a8908075f947a120f69cf68fef40029` +const ContractBin = `608060405234801561001057600080fd5b50604051610de2380380610de283398101806040528101908080518201929190505050600060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600090505b81518110156101d2576001600080848481518110151561010057fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001828281518110151561015857fe5b9060200190602002015190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505080806001019150506100e4565b5050610bff806101e36000396000f300608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633561247d1461007d57806345848dfc1461011e5780634d6a304c1461018a578063710aeac8146101c4578063a5ba0be21461020d578063c4885d57146102ae575b600080fd5b34801561008957600080fd5b50610104600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610301565b604051808215151515815260200191505060405180910390f35b34801561012a57600080fd5b50610133610558565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561017657808201518184015260208101905061015b565b505050509050019250505060405180910390f35b34801561019657600080fd5b5061019f61063f565b6040518083815260200182600019166000191681526020019250505060405180910390f35b3480156101d057600080fd5b506101ef6004803603810190808035906020019092919050505061065e565b60405180826000191660001916815260200191505060405180910390f35b34801561021957600080fd5b50610294600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061067b565b604051808215151515815260200191505060405180910390f35b3480156102ba57600080fd5b506102e7600480360381019080803590602001909291908035600019169060200190929190505050610a0d565b604051808215151515815260200191505060405180910390f35b6000806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561034f57600080fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561039f5760009050610552565b60016000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507fecd88a3d10808aac9f879bbae95f9e4f9687f6c9f0615b88af2085f226d3cf93833384604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105115780820151818401526020810190506104f6565b50505050905090810190601f16801561053e5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600190505b92915050565b60608060006001805490506040519080825280602002602001820160405280156105915781602001602082028038833980820191505090505b509150600090505b600180549050811015610637576001818154811015156105b557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682828151811015156105ee57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610599565b819250505090565b600080600061064f60035461065e565b90506003548192509250509091565b600060026000838152602001908152602001600020549050919050565b6000806000806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115156106cc57600080fd5b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561071c5760009250610a05565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600091505b6001805490508210156108fc578473ffffffffffffffffffffffffffffffffffffffff1660018381548110151561079657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108ef578190505b600180805490500381101561089057600180820181548110151561080157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660018281548110151561083b57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806001019150506107e1565b6001808080549050038154811015156108a557fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600180818180549050039150816108e99190610b82565b506108fc565b8180600101925050610763565b7fe7d6ab069cde0507dc9c5971bf93e9fd183db04690725946e8cae907367e7c1f853386604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109c45780820151818401526020810190506109a9565b50505050905090810190601f1680156109f15780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600192505b505092915050565b6000806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111515610a5b57600080fd5b6003548314158015610a7257506001600354018314155b8015610a815750600060035414155b15610a8f5760009050610b7c565b610100618000600185010201431015610aab5760009050610b7c565b600060035414158015610abf575060035483145b8015610ad657506120006180006001850102014310155b15610ae45760009050610b7c565b8160026000858152602001908152602001600020816000191690555082600381905550827f5b3eab050ccf1a983a26b4f6acb13c199093c7d2e7523a0ff036519f7ddaf5603384604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390a25b92915050565b815481835581811115610ba957818360005260206000209182019101610ba89190610bae565b5b505050565b610bd091905b80821115610bcc576000816000905550600101610bb4565b5090565b905600a165627a7a723058206af229b85ceb246e4b06af39c8058d670504df652a68b19dad6b2a883f3028580029` // DeployContract deploys a new Ethereum contract, binding an instance of Contract to it. func DeployContract(auth *bind.TransactOpts, backend bind.ContractBackend, _adminlist []common.Address) (common.Address, *types.Transaction, *Contract, error) { diff --git a/contracts/registrar/contract/registrar.sol b/contracts/registrar/contract/registrar.sol index 122f5611de..7dbbfe8e6d 100644 --- a/contracts/registrar/contract/registrar.sol +++ b/contracts/registrar/contract/registrar.sol @@ -103,9 +103,13 @@ contract Registrar { return false; } // Ensure the checkpoint is stable enough to be registered. - if (block.number < (_sectionIndex+1)*sectionSize+confirmations) { + if (block.number < (_sectionIndex+1)*sectionSize+processConfirmations) { return false; } + // Ensure the modification for registered checkpoint within the allowed time range + if (latest != 0 && _sectionIndex == latest && block.number >= (_sectionIndex+1)*sectionSize+confirmations) { + return false; + } checkpoints[_sectionIndex] = _hash; latest = _sectionIndex; @@ -205,6 +209,9 @@ contract Registrar { // The number of confirmations needed before a checkpoint can be registered. // We have to make sure the checkpoint registered will not be invalid due to // chain reorg. - uint constant confirmations = 256; + uint constant processConfirmations = 256; + + // The number of confirmations when a registered checkpoint can not be modified. + uint constant confirmations = 8192; } diff --git a/contracts/registrar/registrar_test.go b/contracts/registrar/registrar_test.go index 54c37f7ff6..393ece8123 100644 --- a/contracts/registrar/registrar_test.go +++ b/contracts/registrar/registrar_test.go @@ -37,13 +37,8 @@ var ( addr = crypto.PubkeyToAddress(key.PublicKey) emptyHash = [32]byte{} - trustedCheckpoint = light.TrustedCheckpoint{ - SectionIdx: 0, - SectionHead: common.HexToHash("14c8639dfc32812ed20839f5a11993cd59b22e5226cb2179640ba5c1f0c08f87"), - ChtRoot: common.HexToHash("cf92fd2a79464354e8dae4d589ae92acdf90a3a4f8f7d8a3ec5fb9c114ae81cd"), - BloomTrieRoot: common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"), - } - checkpointHash = crypto.Keccak256Hash(trustedCheckpoint.SectionHead.Bytes(), trustedCheckpoint.ChtRoot.Bytes(), trustedCheckpoint.BloomTrieRoot.Bytes()) + checkpointHash0 = crypto.Keccak256Hash(common.Hex2Bytes("dead0"), common.Hex2Bytes("beef0"), common.Hex2Bytes("deadbeef0")) + checkpointHash1 = crypto.Keccak256Hash(common.Hex2Bytes("dead1"), common.Hex2Bytes("beef1"), common.Hex2Bytes("deadbeef1")) ) // validateOperation executes the operation, watches and delivers all events fired by the backend and ensures the @@ -201,9 +196,9 @@ func TestCheckpointRegister(t *testing.T) { // Register unstable checkpoint validateOperation(t, c, contractBackend, func() { - c.SetCheckpoint(transactOpts, big.NewInt(int64(trustedCheckpoint.SectionIdx)), checkpointHash) + c.SetCheckpoint(transactOpts, big.NewInt(0), checkpointHash0) }, func(events <-chan *contract.ContractNewCheckpointEvent, events2 <-chan *contract.ContractAddAdminEvent, events3 <-chan *contract.ContractRemoveAdminEvent) error { - hash, err := c.GetCheckpoint(nil, big.NewInt(int64(trustedCheckpoint.SectionIdx))) + hash, err := c.GetCheckpoint(nil, big.NewInt(0)) if err != nil { return errors.New("get checkpoint failed") } @@ -219,9 +214,9 @@ func TestCheckpointRegister(t *testing.T) { validateOperation(t, c, contractBackend, func() { user2, _ := crypto.GenerateKey() unauthorized := bind.NewKeyedTransactor(user2) - c.SetCheckpoint(unauthorized, big.NewInt(int64(trustedCheckpoint.SectionIdx)), checkpointHash) + c.SetCheckpoint(unauthorized, big.NewInt(0), checkpointHash0) }, func(events <-chan *contract.ContractNewCheckpointEvent, events2 <-chan *contract.ContractAddAdminEvent, events3 <-chan *contract.ContractRemoveAdminEvent) error { - hash, err := c.GetCheckpoint(nil, big.NewInt(int64(trustedCheckpoint.SectionIdx))) + hash, err := c.GetCheckpoint(nil, big.NewInt(0)) if err != nil { return errors.New("get checkpoint failed") } @@ -233,13 +228,13 @@ func TestCheckpointRegister(t *testing.T) { // Register a stable checkpoint validateOperation(t, c, contractBackend, func() { - c.SetCheckpoint(transactOpts, big.NewInt(int64(trustedCheckpoint.SectionIdx)), checkpointHash) + c.SetCheckpoint(transactOpts, big.NewInt(0), checkpointHash0) }, func(events <-chan *contract.ContractNewCheckpointEvent, events2 <-chan *contract.ContractAddAdminEvent, events3 <-chan *contract.ContractRemoveAdminEvent) error { - hash, err := c.GetCheckpoint(nil, big.NewInt(int64(trustedCheckpoint.SectionIdx))) + hash, err := c.GetCheckpoint(nil, big.NewInt(0)) if err != nil { return errors.New("get checkpoint failed") } - if hash != checkpointHash { + if hash != checkpointHash0 { return errors.New("register stable checkpoint failed") } if !validateEvents(1, events) { @@ -248,16 +243,16 @@ func TestCheckpointRegister(t *testing.T) { return nil }, "register stable checkpoint") - fakeHash := crypto.Keccak256Hash([]byte("dead"), []byte("beef"), []byte("deadbeef")) + newHash := crypto.Keccak256Hash([]byte("dead00"), []byte("beef00"), []byte("deadbeef00")) // Modify the latest checkpoint validateOperation(t, c, contractBackend, func() { - c.SetCheckpoint(transactOpts, big.NewInt(int64(trustedCheckpoint.SectionIdx)), fakeHash) + c.SetCheckpoint(transactOpts, big.NewInt(0), newHash) }, func(events <-chan *contract.ContractNewCheckpointEvent, events2 <-chan *contract.ContractAddAdminEvent, events3 <-chan *contract.ContractRemoveAdminEvent) error { - hash, err := c.GetCheckpoint(nil, big.NewInt(int64(trustedCheckpoint.SectionIdx))) + hash, err := c.GetCheckpoint(nil, big.NewInt(0)) if err != nil { return errors.New("get checkpoint failed") } - if hash != fakeHash { + if hash != newHash { return errors.New("register stable checkpoint failed") } if !validateEvents(1, events) { @@ -265,4 +260,38 @@ func TestCheckpointRegister(t *testing.T) { } return nil }, "modify latest checkpoint") + + contractBackend.ShiftBlocks(light.CheckpointFrequency) + // Register checkpoint 1 + validateOperation(t, c, contractBackend, func() { + c.SetCheckpoint(transactOpts, big.NewInt(1), checkpointHash1) + }, func(events <-chan *contract.ContractNewCheckpointEvent, events2 <-chan *contract.ContractAddAdminEvent, events3 <-chan *contract.ContractRemoveAdminEvent) error { + hash, err := c.GetCheckpoint(nil, big.NewInt(1)) + if err != nil { + return errors.New("get checkpoint failed") + } + if hash != checkpointHash1 { + return errors.New("register stable checkpoint failed") + } + if !validateEvents(1, events) { + return errors.New("receive incorrect number of events") + } + return nil + }, "register stable checkpoint 1") + + contractBackend.ShiftBlocks(light.CheckpointConfirmations) + newHash1 := crypto.Keccak256Hash([]byte("dead11"), []byte("beef11"), []byte("deadbeef11")) + // Modify the registered checkpoint after a very long time + validateOperation(t, c, contractBackend, func() { + c.SetCheckpoint(transactOpts, big.NewInt(1), newHash1) + }, func(events <-chan *contract.ContractNewCheckpointEvent, events2 <-chan *contract.ContractAddAdminEvent, events3 <-chan *contract.ContractRemoveAdminEvent) error { + hash, err := c.GetCheckpoint(nil, big.NewInt(1)) + if err != nil { + return errors.New("get checkpoint failed") + } + if hash != checkpointHash1 { + return errors.New("checkpoint modified out of allowed time range") + } + return nil + }, "modify checkpoint out of allowed time range") }