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 }