github.com/igggame/nebulas-go@v2.1.0+incompatible/core/mock.go (about)

     1  // Copyright (C) 2018 go-nebulas authors
     2  //
     3  // This file is part of the go-nebulas library.
     4  //
     5  // the go-nebulas library is free software: you can redistribute it and/or modify
     6  // it under the terms of the GNU General Public License as published by
     7  // the Free Software Foundation, either version 3 of the License, or
     8  // (at your option) any later version.
     9  //
    10  // the go-nebulas library is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13  // GNU General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU General Public License
    16  // along with the go-nebulas library.  If not, see <http://www.gnu.org/licenses/>.
    17  //
    18  
    19  package core
    20  
    21  import (
    22  	"time"
    23  
    24  	"github.com/nebulasio/go-nebulas/consensus/pb"
    25  	"github.com/nebulasio/go-nebulas/core/pb"
    26  	"github.com/nebulasio/go-nebulas/core/state"
    27  	"github.com/nebulasio/go-nebulas/crypto/keystore"
    28  	"github.com/nebulasio/go-nebulas/crypto/keystore/secp256k1"
    29  	"github.com/nebulasio/go-nebulas/neblet/pb"
    30  	"github.com/nebulasio/go-nebulas/net"
    31  	"github.com/nebulasio/go-nebulas/storage"
    32  	"github.com/nebulasio/go-nebulas/util"
    33  	"github.com/nebulasio/go-nebulas/util/byteutils"
    34  )
    35  
    36  const (
    37  	AcceptedNetWorkDelay = 2
    38  )
    39  
    40  var (
    41  	MockDynasty = []string{
    42  		"n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE",
    43  		"n1GmkKH6nBMw4rrjt16RrJ9WcgvKUtAZP1s",
    44  		"n1H4MYms9F55ehcvygwWE71J8tJC4CRr2so",
    45  		"n1JAy4X6KKLCNiTd7MWMRsVBjgdVq5WCCpf",
    46  		"n1LkDi2gGMqPrjYcczUiweyP4RxTB6Go1qS",
    47  		"n1LmP9K8pFF33fgdgHZonFEMsqZinJ4EUqk",
    48  		"n1MNXBKm6uJ5d76nJTdRvkPNVq85n6CnXAi",
    49  		"n1NrMKTYESZRCwPFDLFKiKREzZKaN1nhQvz",
    50  		"n1NwoSCDFwFL2981k6j9DPooigW33hjAgTa",
    51  		"n1PfACnkcfJoNm1Pbuz55pQCwueW1BYs83m",
    52  		"n1Q8mxXp4PtHaXtebhY12BnHEwu4mryEkXH",
    53  		"n1RYagU8n3JSuV4R7q4Qs5gQJ3pEmrZd6cJ",
    54  		"n1SAQy3ix1pZj8MPzNeVqpAmu1nCVqb5w8c",
    55  		"n1SHufJdxt2vRWGKAxwPETYfEq3MCQXnEXE",
    56  		"n1SSda41zGr9FKF5DJNE2ryY1ToNrndMauN",
    57  		"n1TmQtaCn3PNpk4f4ycwrBxCZFSVKvwBtzc",
    58  		"n1UM7z6MqnGyKEPvUpwrfxZpM1eB7UpzmLJ",
    59  		"n1UnCsJZjQiKyQiPBr7qG27exqCLuWUf1d7",
    60  		"n1XkoVVjswb5Gek3rRufqjKNpwrDdsnQ7Hq",
    61  		"n1cYKNHTeVW9v1NQRWuhZZn9ETbqAYozckh",
    62  		"n1dYu2BXgV3xgUh8LhZu8QDDNr15tz4hVDv",
    63  	}
    64  )
    65  
    66  func mockAddress() *Address {
    67  	ks := keystore.DefaultKS
    68  	priv1 := secp256k1.GeneratePrivateKey()
    69  	pubdata1, _ := priv1.PublicKey().Encoded()
    70  	addr, _ := NewAddressFromPublicKey(pubdata1)
    71  	ks.SetKey(addr.String(), priv1, []byte("passphrase"))
    72  	ks.Unlock(addr.String(), []byte("passphrase"), time.Second*60*60*24*365)
    73  	return addr
    74  }
    75  
    76  // MockGenesisConf return mock genesis conf
    77  func MockGenesisConf() *corepb.Genesis {
    78  	return &corepb.Genesis{
    79  		Meta: &corepb.GenesisMeta{ChainId: 100},
    80  		Consensus: &corepb.GenesisConsensus{
    81  			Dpos: &corepb.GenesisConsensusDpos{
    82  				Dynasty: MockDynasty,
    83  			},
    84  		},
    85  		TokenDistribution: []*corepb.GenesisTokenDistribution{
    86  			&corepb.GenesisTokenDistribution{
    87  				Address: "n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE",
    88  				Value:   "5000000000000000000000000",
    89  			},
    90  			&corepb.GenesisTokenDistribution{
    91  				Address: "n1GmkKH6nBMw4rrjt16RrJ9WcgvKUtAZP1s",
    92  				Value:   "5000000000000000000000000",
    93  			},
    94  			&corepb.GenesisTokenDistribution{
    95  				Address: "n1H4MYms9F55ehcvygwWE71J8tJC4CRr2so",
    96  				Value:   "5000000000000000000000000",
    97  			},
    98  			&corepb.GenesisTokenDistribution{
    99  				Address: "n1JAy4X6KKLCNiTd7MWMRsVBjgdVq5WCCpf",
   100  				Value:   "5000000000000000000000000",
   101  			},
   102  			&corepb.GenesisTokenDistribution{
   103  				Address: "n1LkDi2gGMqPrjYcczUiweyP4RxTB6Go1qS",
   104  				Value:   "5000000000000000000000000",
   105  			},
   106  			&corepb.GenesisTokenDistribution{
   107  				Address: "n1LmP9K8pFF33fgdgHZonFEMsqZinJ4EUqk",
   108  				Value:   "5000000000000000000000000",
   109  			},
   110  		},
   111  	}
   112  }
   113  
   114  type mockConsensusState struct {
   115  	timestamp int64
   116  }
   117  
   118  func newMockConsensusState(timestamp int64) (*mockConsensusState, error) {
   119  	return &mockConsensusState{
   120  		timestamp: timestamp,
   121  	}, nil
   122  }
   123  
   124  func (cs *mockConsensusState) RootHash() *consensuspb.ConsensusRoot {
   125  	return &consensuspb.ConsensusRoot{}
   126  }
   127  func (cs *mockConsensusState) String() string { return "" }
   128  func (cs *mockConsensusState) Clone() (state.ConsensusState, error) {
   129  	return &mockConsensusState{
   130  		timestamp: cs.timestamp,
   131  	}, nil
   132  }
   133  func (cs *mockConsensusState) Replay(state.ConsensusState) error { return nil }
   134  
   135  func (cs *mockConsensusState) Proposer() byteutils.Hash { return nil }
   136  func (cs *mockConsensusState) TimeStamp() int64         { return 0 }
   137  func (cs *mockConsensusState) NextConsensusState(elapsed int64, ws state.WorldState) (state.ConsensusState, error) {
   138  	return &mockConsensusState{
   139  		timestamp: cs.timestamp + elapsed,
   140  	}, nil
   141  }
   142  
   143  func (cs *mockConsensusState) Dynasty() ([]byteutils.Hash, error) { return nil, nil }
   144  func (cs *mockConsensusState) DynastyRoot() byteutils.Hash        { return nil }
   145  
   146  type mockConsensus struct {
   147  	chain *BlockChain
   148  }
   149  
   150  func (c *mockConsensus) Setup(neb Neblet) error {
   151  	c.chain = neb.BlockChain()
   152  	return nil
   153  }
   154  
   155  func (c *mockConsensus) Start() {}
   156  func (c *mockConsensus) Stop()  {}
   157  
   158  func (c *mockConsensus) VerifyBlock(block *Block) error {
   159  	return nil
   160  }
   161  
   162  func mockLess(a *Block, b *Block) bool {
   163  	if a.Height() != b.Height() {
   164  		return a.Height() < b.Height()
   165  	}
   166  	return byteutils.Less(a.Hash(), b.Hash())
   167  }
   168  
   169  // ForkChoice select new tail
   170  func (c *mockConsensus) ForkChoice() error {
   171  	bc := c.chain
   172  	tailBlock := bc.TailBlock()
   173  	detachedTailBlocks := bc.DetachedTailBlocks()
   174  
   175  	// find the max depth.
   176  	newTailBlock := tailBlock
   177  
   178  	for _, v := range detachedTailBlocks {
   179  		if mockLess(newTailBlock, v) {
   180  			newTailBlock = v
   181  		}
   182  	}
   183  
   184  	if newTailBlock.Hash().Equals(tailBlock.Hash()) {
   185  		return nil
   186  	}
   187  
   188  	err := bc.SetTailBlock(newTailBlock)
   189  	if err != nil {
   190  		return err
   191  	}
   192  	return nil
   193  }
   194  
   195  func (c *mockConsensus) UpdateLIB() {}
   196  
   197  func (c *mockConsensus) SuspendMining() {}
   198  func (c *mockConsensus) ResumeMining()  {}
   199  func (c *mockConsensus) Pending() bool  { return false }
   200  
   201  func (c *mockConsensus) EnableMining(passphrase string) error { return nil }
   202  func (c *mockConsensus) DisableMining() error                 { return nil }
   203  func (c *mockConsensus) Enable() bool                         { return true }
   204  
   205  func (c *mockConsensus) CheckTimeout(block *Block) bool {
   206  	return time.Now().Unix()-block.Timestamp() > AcceptedNetWorkDelay
   207  }
   208  func (c *mockConsensus) CheckDoubleMint(block *Block) bool {
   209  	return false
   210  }
   211  func (c *mockConsensus) NewState(root *consensuspb.ConsensusRoot, stor storage.Storage, needChangeLog bool) (state.ConsensusState, error) {
   212  	return newMockConsensusState(root.Timestamp)
   213  }
   214  func (c *mockConsensus) GenesisConsensusState(*BlockChain, *corepb.Genesis) (state.ConsensusState, error) {
   215  	return newMockConsensusState(0)
   216  }
   217  func (c *mockConsensus) NumberOfBlocksInDynasty() uint64 {
   218  	return 210
   219  }
   220  
   221  type mockManager struct{}
   222  
   223  func (m mockManager) NewAccount([]byte) (*Address, error) { return nil, nil }
   224  func (m mockManager) Accounts() []*Address                { return nil }
   225  
   226  func (m mockManager) Unlock(addr *Address, passphrase []byte, expire time.Duration) error { return nil }
   227  func (m mockManager) Lock(addr *Address) error                                            { return nil }
   228  
   229  func (m mockManager) SignHash(addr *Address, hash byteutils.Hash, alg keystore.Algorithm) ([]byte, error) {
   230  	return nil, nil
   231  }
   232  func (m mockManager) SignBlock(addr *Address, block *Block) error                        { return nil }
   233  func (m mockManager) SignTransaction(*Address, *Transaction) error                       { return nil }
   234  func (m mockManager) SignTransactionWithPassphrase(*Address, *Transaction, []byte) error { return nil }
   235  
   236  func (m mockManager) Update(*Address, []byte, []byte) error        { return nil }
   237  func (m mockManager) Load([]byte, []byte) (*Address, error)        { return nil, nil }
   238  func (m mockManager) LoadPrivate([]byte, []byte) (*Address, error) { return nil, nil }
   239  func (m mockManager) Import([]byte, []byte) (*Address, error)      { return nil, nil }
   240  func (m mockManager) Remove(*Address, []byte) error                { return nil }
   241  func (m mockManager) GenerateRandomSeed(addr *Address, ancestorHash, parentSeed []byte) (vrfSeed, vrfProof []byte, err error) {
   242  	return nil, nil, nil
   243  }
   244  
   245  var (
   246  	received = []byte{}
   247  )
   248  
   249  type MockNetService struct{}
   250  
   251  func (n MockNetService) Start() error { return nil }
   252  func (n MockNetService) Stop()        {}
   253  
   254  func (n MockNetService) Node() *net.Node { return nil }
   255  
   256  func (n MockNetService) Sync(net.Serializable) error { return nil }
   257  
   258  func (n MockNetService) Register(...*net.Subscriber)   {}
   259  func (n MockNetService) Deregister(...*net.Subscriber) {}
   260  
   261  func (n MockNetService) Broadcast(name string, msg net.Serializable, priority int) {}
   262  func (n MockNetService) Relay(name string, msg net.Serializable, priority int)     {}
   263  func (n MockNetService) SendMsg(name string, msg []byte, target string, priority int) error {
   264  	received = msg
   265  	return nil
   266  }
   267  
   268  func (n MockNetService) SendMessageToPeers(messageName string, data []byte, priority int, filter net.PeerFilterAlgorithm) []string {
   269  	return make([]string, 0)
   270  }
   271  func (n MockNetService) SendMessageToPeer(messageName string, data []byte, priority int, peerID string) error {
   272  	return nil
   273  }
   274  
   275  func (n MockNetService) ClosePeer(peerID string, reason error) {}
   276  
   277  func (n MockNetService) BroadcastNetworkID([]byte) {}
   278  
   279  type MockNeb struct {
   280  	config    *nebletpb.Config
   281  	chain     *BlockChain
   282  	ns        net.Service
   283  	am        AccountManager
   284  	genesis   *corepb.Genesis
   285  	storage   storage.Storage
   286  	consensus Consensus
   287  	emitter   *EventEmitter
   288  	nvm       NVM
   289  	dip       Dip
   290  	nbre      Nbre
   291  }
   292  
   293  func (n *MockNeb) Genesis() *corepb.Genesis {
   294  	return n.genesis
   295  }
   296  
   297  func (n *MockNeb) Config() *nebletpb.Config {
   298  	return n.config
   299  }
   300  
   301  func (n *MockNeb) SetStorage(s storage.Storage) {
   302  	n.storage = s
   303  }
   304  
   305  func (n *MockNeb) Storage() storage.Storage {
   306  	return n.storage
   307  }
   308  
   309  func (n *MockNeb) EventEmitter() *EventEmitter {
   310  	return n.emitter
   311  }
   312  
   313  func (n *MockNeb) SetConsensus(c Consensus) {
   314  	n.consensus = c
   315  }
   316  
   317  func (n *MockNeb) Consensus() Consensus {
   318  	return n.consensus
   319  }
   320  
   321  func (n *MockNeb) SetBlockChain(bc *BlockChain) {
   322  	n.chain = bc
   323  }
   324  
   325  func (n *MockNeb) BlockChain() *BlockChain {
   326  	return n.chain
   327  }
   328  
   329  func (n *MockNeb) NetService() net.Service {
   330  	return n.ns
   331  }
   332  
   333  func (n *MockNeb) IsActiveSyncing() bool {
   334  	return true
   335  }
   336  
   337  func (n *MockNeb) SetAccountManager(a AccountManager) {
   338  	n.am = a
   339  }
   340  
   341  func (n *MockNeb) AccountManager() AccountManager {
   342  	return n.am
   343  }
   344  
   345  func (n *MockNeb) Nvm() NVM {
   346  	return n.nvm
   347  }
   348  
   349  func (n *MockNeb) Nbre() Nbre {
   350  	return nil
   351  }
   352  
   353  func (n *MockNeb) Dip() Dip {
   354  	return n.dip
   355  }
   356  
   357  func (n *MockNeb) Nr() NR {
   358  	return nil
   359  }
   360  
   361  func (n *MockNeb) StartPprof(string) error {
   362  	return nil
   363  }
   364  
   365  func (n *MockNeb) SetGenesis(genesis *corepb.Genesis) {
   366  	n.genesis = genesis
   367  }
   368  
   369  type mockNvm struct{}
   370  type mockEngine struct{}
   371  
   372  func (nvm *mockNvm) CreateEngine(block *Block, tx *Transaction, contract state.Account, state WorldState) (SmartContractEngine, error) {
   373  	return &mockEngine{}, nil
   374  }
   375  func (nvm *mockNvm) CheckV8Run() error {
   376  	return nil
   377  }
   378  
   379  func (nvm *mockEngine) Dispose() {
   380  
   381  }
   382  func (nvm *mockEngine) SetExecutionLimits(uint64, uint64) error {
   383  	return nil
   384  }
   385  func (nvm *mockEngine) DeployAndInit(source, sourceType, args string) (string, error) {
   386  	return "", nil
   387  }
   388  func (nvm *mockEngine) Call(source, sourceType, function, args string) (string, error) {
   389  	return "", nil
   390  }
   391  func (nvm *mockEngine) ExecutionInstructions() uint64 {
   392  	return uint64(100)
   393  }
   394  
   395  type mockDip struct {
   396  	addr *Address
   397  }
   398  
   399  func (m *mockDip) Start() {}
   400  func (m *mockDip) Stop()  {}
   401  
   402  func (m *mockDip) RewardAddress() *Address {
   403  	if m.addr == nil {
   404  		m.addr = mockAddress()
   405  	}
   406  	return m.addr
   407  }
   408  
   409  func (m *mockDip) RewardValue() *util.Uint128 {
   410  	return util.NewUint128()
   411  }
   412  
   413  func (m *mockDip) GetDipList(height uint64, version uint64) (Data, error) {
   414  	return nil, nil
   415  }
   416  
   417  func (m *mockDip) CheckReward(tx *Transaction) error {
   418  	return nil
   419  }
   420  
   421  // NewMockNeb create mock neb for unit testing
   422  func NewMockNeb(am AccountManager, consensus Consensus, nvm NVM) *MockNeb {
   423  	storage, _ := storage.NewMemoryStorage()
   424  	eventEmitter := NewEventEmitter(1024)
   425  	if am == nil {
   426  		am = new(mockManager)
   427  	}
   428  	if consensus == nil {
   429  		consensus = new(mockConsensus)
   430  	}
   431  	if nvm == nil {
   432  		nvm = &mockNvm{}
   433  	}
   434  
   435  	dip := &mockDip{}
   436  	var ns MockNetService
   437  	neb := &MockNeb{
   438  		genesis: MockGenesisConf(),
   439  		config: &nebletpb.Config{Chain: &nebletpb.ChainConfig{
   440  			ChainId:    MockGenesisConf().Meta.ChainId,
   441  			Keydir:     "keydir",
   442  			StartMine:  true,
   443  			Coinbase:   "n1dYu2BXgV3xgUh8LhZu8QDDNr15tz4hVDv",
   444  			Miner:      "n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE",
   445  			Passphrase: "passphrase"}},
   446  		storage:   storage,
   447  		emitter:   eventEmitter,
   448  		consensus: consensus,
   449  		am:        am,
   450  		ns:        ns,
   451  		nvm:       nvm,
   452  		dip:       dip,
   453  	}
   454  
   455  	chain, _ := NewBlockChain(neb)
   456  	chain.BlockPool().RegisterInNetwork(neb.ns)
   457  	neb.chain = chain
   458  	consensus.Setup(neb)
   459  	chain.Setup(neb)
   460  
   461  	return neb
   462  }