Skip to content

Commit 589e71f

Browse files
authored
Merge pull request ethereum#216 from tomochain/revert-211-double-validation
Revert "adding double validation layer"
2 parents 247b7be + 0f80923 commit 589e71f

File tree

7 files changed

+23
-105
lines changed

7 files changed

+23
-105
lines changed

consensus/posv/posv.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -414,17 +414,6 @@ func (c *Posv) GetMasternodes(chain consensus.ChainReader, header *types.Header)
414414

415415
func (c *Posv) GetPeriod() uint64 { return c.config.Period }
416416

417-
func WhoIsCreator(snap *Snapshot, header *types.Header) (common.Address, error) {
418-
if header.Number.Uint64() == 0 {
419-
return common.Address{}, errors.New("Don't take block 0")
420-
}
421-
m, err := ecrecover(header, snap.sigcache)
422-
if err != nil {
423-
return common.Address{}, err
424-
}
425-
return m, nil
426-
}
427-
428417
func YourTurn(masternodes []common.Address, snap *Snapshot, header *types.Header, cur common.Address) (int, int, bool, error) {
429418
if len(masternodes) == 0 {
430419
return -1, -1, true, nil
@@ -434,7 +423,7 @@ func YourTurn(masternodes []common.Address, snap *Snapshot, header *types.Header
434423
var err error
435424
preIndex := -1
436425
if header.Number.Uint64() != 0 {
437-
pre, err = WhoIsCreator(snap, header)
426+
pre, err = ecrecover(header, snap.sigcache)
438427
if err != nil {
439428
return 0, 0, false, err
440429
}

contracts/utils.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,6 @@ func ExtractValidatorsFromBytes(byteValidators []byte) []int64 {
272272
intNumber, err := strconv.Atoi(string(trimByte))
273273
if err != nil {
274274
log.Error("Can not convert string to integer", "error", err)
275-
return []int64{}
276275
}
277276
validators = append(validators, int64(intNumber))
278277
}
@@ -569,22 +568,26 @@ func GetMasternodesFromCheckpointHeader(checkpointHeader *types.Header) []common
569568
}
570569

571570
// Get m2 list from checkpoint block.
572-
func GetM1M2FromCheckpointBlock(checkpointBlock *types.Block) (map[common.Address]common.Address, error) {
571+
func GetM2FromCheckpointBlock(checkpointBlock types.Block) ([]common.Address, error) {
573572
if checkpointBlock.Number().Int64()%common.EpocBlockRandomize != 0 {
574573
return nil, errors.New("This block is not checkpoint block epoc.")
575574
}
576-
m1m2 := map[common.Address]common.Address{}
577-
// Get signers from this block.
575+
576+
// Get singers from this block.
578577
masternodes := GetMasternodesFromCheckpointHeader(checkpointBlock.Header())
579578
validators := ExtractValidatorsFromBytes(checkpointBlock.Header().Validators)
580579

581-
if len(validators) < len(masternodes) {
582-
return nil, errors.New("len(m2) is less than len(m1)")
583-
}
584-
if len(masternodes) > 0 {
585-
for i, m1 := range masternodes {
586-
m1m2[m1] = masternodes[validators[i]%int64(len(masternodes))]
580+
var m2List []common.Address
581+
lenMasternodes := len(masternodes)
582+
var valAddr common.Address
583+
for validatorIndex := range validators {
584+
if validatorIndex < lenMasternodes {
585+
valAddr = masternodes[validatorIndex]
586+
} else {
587+
valAddr = masternodes[validatorIndex-lenMasternodes]
587588
}
589+
m2List = append(m2List, valAddr)
588590
}
589-
return m1m2, nil
591+
592+
return m2List, nil
590593
}

core/blockchain.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,16 +1635,16 @@ func (bc *BlockChain) UpdateM1() error {
16351635
ms = append(ms, posv.Masternode{Address: candidate, Stake: v.Uint64()})
16361636
}
16371637
}
1638+
log.Info("Ordered list of masternode candidates")
1639+
for _, m := range ms {
1640+
log.Info("", "address", m.Address.String(), "stake", m.Stake)
1641+
}
16381642
if len(ms) == 0 {
16391643
log.Info("No masternode candidates found. Keep the current masternodes set for the next epoch")
16401644
} else {
16411645
sort.Slice(ms, func(i, j int) bool {
16421646
return ms[i].Stake >= ms[j].Stake
16431647
})
1644-
log.Info("Ordered list of masternode candidates")
1645-
for _, m := range ms {
1646-
log.Info("", "address", m.Address.String(), "stake", m.Stake)
1647-
}
16481648
// update masternodes
16491649
log.Info("Updating new set of masternodes")
16501650
if len(ms) > common.MaxMasternodes {

core/tx_pool.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -553,14 +553,6 @@ func (pool *TxPool) local() map[common.Address]types.Transactions {
553553
return txs
554554
}
555555

556-
func (pool *TxPool) GetSender(tx *types.Transaction) (common.Address, error) {
557-
from, err := types.Sender(pool.signer, tx)
558-
if err != nil {
559-
return common.Address{}, ErrInvalidSender
560-
}
561-
return from, nil
562-
}
563-
564556
// validateTx checks whether a transaction is valid according to the consensus
565557
// rules and adheres to some heuristic limits of the local node (price and size).
566558
func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error {

eth/backend.go

Lines changed: 1 addition & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ import (
5151
"github.com/ethereum/go-ethereum/params"
5252
"github.com/ethereum/go-ethereum/rlp"
5353
"github.com/ethereum/go-ethereum/rpc"
54-
"time"
5554
)
5655

5756
const NumOfMasternodes = 99
@@ -202,56 +201,10 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
202201
return
203202
}
204203
if _, authorized := snap.Signers[eth.etherbase]; authorized {
205-
// double validation
206-
m2, err := getM2(snap, eth, block)
207-
if err != nil {
208-
log.Error("Fail to validate M2 condition for imported block", "error", err)
209-
return
210-
}
211-
if eth.etherbase != m2 {
212-
// firstly, look into pending txPool
213-
pendingMap, err := eth.txPool.Pending()
214-
if err != nil {
215-
log.Error("Fail to get txPool pending", "err", err)
216-
//reset pendingMap
217-
pendingMap = map[common.Address]types.Transactions{}
218-
}
219-
txsSentFromM2 := pendingMap[m2]
220-
if len(txsSentFromM2) > 0 {
221-
for _, tx := range txsSentFromM2 {
222-
if tx.To().String() == common.BlockSigners {
223-
if err := contracts.CreateTransactionSign(chainConfig, eth.txPool, eth.accountManager, block, chainDb); err != nil {
224-
log.Error("Fail to create tx sign for imported block", "error", err)
225-
return
226-
}
227-
return
228-
}
229-
}
230-
}
231-
//then wait until signTx from m2 comes into txPool
232-
txCh := make(chan core.TxPreEvent, txChanSize)
233-
subEvent := eth.txPool.SubscribeTxPreEvent(txCh)
234-
G:
235-
select {
236-
case event := <-txCh:
237-
from, err := eth.txPool.GetSender(event.Tx)
238-
if (err == nil) && (event.Tx.To().String() == common.BlockSigners) && (from == m2) {
239-
if err := contracts.CreateTransactionSign(chainConfig, eth.txPool, eth.accountManager, block, chainDb); err != nil {
240-
log.Error("Fail to create tx sign for imported block", "error", err)
241-
return
242-
}
243-
return
244-
}
245-
//timeout 10s
246-
case <-time.After(time.Duration(10) * time.Second):
247-
break G
248-
}
249-
subEvent.Unsubscribe()
250-
} else if err := contracts.CreateTransactionSign(chainConfig, eth.txPool, eth.accountManager, block, chainDb); err != nil {
204+
if err := contracts.CreateTransactionSign(chainConfig, eth.txPool, eth.accountManager, block, chainDb); err != nil {
251205
log.Error("Fail to create tx sign for imported block", "error", err)
252206
return
253207
}
254-
// end of double validation
255208
}
256209
}
257210
eth.protocolManager.fetcher.SetImportedHook(importedHook)
@@ -342,25 +295,6 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
342295
return eth, nil
343296
}
344297

345-
func getM2(snap *posv.Snapshot, eth *Ethereum, block *types.Block) (common.Address, error) {
346-
epoch := eth.chainConfig.Posv.Epoch
347-
no := block.NumberU64()
348-
cpNo := no
349-
if no%epoch != 0 {
350-
cpNo = no - (no % epoch)
351-
}
352-
cpBlk := eth.blockchain.GetBlockByNumber(cpNo)
353-
m, err := contracts.GetM1M2FromCheckpointBlock(cpBlk)
354-
if err != nil {
355-
return common.Address{}, err
356-
}
357-
m1, err := posv.WhoIsCreator(snap, block.Header())
358-
if err != nil {
359-
return common.Address{}, err
360-
}
361-
return m[m1], nil
362-
}
363-
364298
func makeExtraData(extra []byte) []byte {
365299
if len(extra) == 0 {
366300
// create default extradata

eth/fetcher/fetcher.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,7 @@ func (f *Fetcher) insert(peer string, block *types.Block) {
674674
propAnnounceOutTimer.UpdateSince(block.ReceivedAt)
675675
go f.broadcastBlock(block, false)
676676

677-
// Invoke the imported hook if needed
677+
// Invoke the testing hook if needed
678678
if f.importedHook != nil {
679679
f.importedHook(block)
680680
}

eth/protocol_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ func testStatusMsgErrors(t *testing.T, protocol int) {
6363
wantError: errResp(ErrProtocolVersionMismatch, "10 (!= %d)", protocol),
6464
},
6565
{
66-
code: StatusMsg, data: statusData{uint32(protocol), 999, td, head.Hash(), genesis.Hash()},
67-
wantError: errResp(ErrNetworkIdMismatch, "999 (!= 89)"),
66+
code: StatusMsg, data: statusData{uint32(protocol), 89, td, head.Hash(), genesis.Hash()},
67+
wantError: errResp(ErrNetworkIdMismatch, "89 (!= 1)"),
6868
},
6969
{
7070
code: StatusMsg, data: statusData{uint32(protocol), DefaultConfig.NetworkId, td, head.Hash(), common.Hash{3}},

0 commit comments

Comments
 (0)