Catch passing duplicate block to arbitrate consensus fault

This commit is contained in:
whyrusleeping 2020-01-16 10:41:25 -08:00
parent 84de47377c
commit e3bed8d12a
3 changed files with 20 additions and 0 deletions

View File

@ -105,3 +105,9 @@ const BlsSignatureCacheSize = 40000
// Limits
const BlockMessageLimit = 512
/////////////
// Fork Heights
//
const ForkBlizzardHeight = 6000

View File

@ -138,6 +138,12 @@ func (spa StoragePowerActor) ArbitrateConsensusFault(act *types.Actor, vmctx typ
return nil, aerrors.New(2, "blocks must be from the same miner")
}
if vmctx.BlockHeight() > build.ForkBlizzardHeight {
if params.Block1.Cid() == params.Block2.Cid() {
return nil, aerrors.New(3, "blocks must be different")
}
}
rval, err := vmctx.Send(params.Block1.Miner, MAMethods.GetWorkerAddr, types.NewInt(0), nil)
if err != nil {
return nil, aerrors.Wrap(err, "failed to get miner worker")

View File

@ -93,7 +93,15 @@ func TestStorageMarketCreateAndSlashMiner(t *testing.T) {
signBlock(t, h.w, workerAddr, b1)
signBlock(t, h.w, workerAddr, b2)
h.BlockHeight = build.ForkBlizzardHeight + 1
ret, _ := h.Invoke(t, ownerAddr, StoragePowerAddress, SPAMethods.ArbitrateConsensusFault,
&ArbitrateConsensusFaultParams{
Block1: b1,
Block2: b1,
})
assert.Equal(t, uint8(3), ret.ExitCode, "should have failed with exit 3")
ret, _ = h.Invoke(t, ownerAddr, StoragePowerAddress, SPAMethods.ArbitrateConsensusFault,
&ArbitrateConsensusFaultParams{
Block1: b1,
Block2: b2,