github.com/elastos/Elastos.ELA.SideChain.ETH@v0.2.2/chainbridge-core/chainbridge.go (about) 1 package chainbridge_core 2 3 import ( 4 "bytes" 5 "errors" 6 "fmt" 7 "sort" 8 "sync/atomic" 9 "time" 10 11 "github.com/elastos/Elastos.ELA.SideChain.ESC/accounts" 12 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/blockstore" 13 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/bridgelog" 14 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/chains/evm" 15 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/chains/evm/aribiters" 16 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/chains/evm/evmclient" 17 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/chains/evm/listener" 18 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/chains/evm/voter" 19 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/config" 20 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/crypto/secp256k1" 21 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/dpos_msg" 22 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/lvldb" 23 "github.com/elastos/Elastos.ELA.SideChain.ESC/chainbridge-core/relayer" 24 "github.com/elastos/Elastos.ELA.SideChain.ESC/common" 25 "github.com/elastos/Elastos.ELA.SideChain.ESC/consensus/pbft" 26 "github.com/elastos/Elastos.ELA.SideChain.ESC/crypto" 27 "github.com/elastos/Elastos.ELA.SideChain.ESC/dpos" 28 "github.com/elastos/Elastos.ELA.SideChain.ESC/log" 29 "github.com/elastos/Elastos.ELA.SideChain.ESC/node" 30 "github.com/elastos/Elastos.ELA.SideChain.ESC/rpc" 31 "github.com/elastos/Elastos.ELA.SideChain.ESC/spv" 32 33 elaCrypto "github.com/elastos/Elastos.ELA/crypto" 34 "github.com/elastos/Elastos.ELA/dpos/p2p" 35 "github.com/elastos/Elastos.ELA/dpos/p2p/peer" 36 "github.com/elastos/Elastos.ELA/events" 37 ) 38 39 const ( 40 MAX_RETRYCOUNT = 60 41 ) 42 43 var ( 44 MsgReleayer *relayer.Relayer 45 errChn chan error 46 stopChn chan struct{} 47 isRequireArbiter bool 48 canStart int32 49 nextTurnArbiters [][]byte 50 requireArbitersCount int 51 arbiterManager *aribiters.ArbiterManager 52 53 IsFirstUpdateArbiter bool 54 api *API 55 pbftEngine *pbft.Pbft 56 isStarted bool 57 wasArbiter bool 58 retryCount int 59 60 currentArbitersOnContract []common.Address 61 selfArbiterAddr string 62 isNeedRecoveryArbiters bool 63 64 escChainID uint64 65 ) 66 67 func init() { 68 errChn = make(chan error) 69 stopChn = make(chan struct{}) 70 arbiterManager = aribiters.CreateArbiterManager() 71 nextTurnArbiters = make([][]byte, 0) 72 atomic.StoreInt32(&canStart, 1) 73 isStarted = false 74 isRequireArbiter = false 75 } 76 77 func APIs(engine *pbft.Pbft) []rpc.API { 78 if api == nil { 79 api = &API{engine} 80 } 81 return []rpc.API{{ 82 Namespace: "bridge", 83 Version: "1.0", 84 Service: api, 85 Public: true, 86 }} 87 } 88 89 func Init(engine *pbft.Pbft, stack *node.Node, accountPath, accountPassword string) { 90 pbftEngine = engine 91 if MsgReleayer != nil { 92 log.Warn("chain bridge is started") 93 return 94 } 95 err := initRelayer(engine, stack, accountPath, accountPassword) 96 if err != nil { 97 bridgelog.Error("chain bridge started error", "error", err) 98 return 99 } 100 } 101 102 func Start() bool { 103 if MsgReleayer == nil || pbftEngine == nil { 104 bridgelog.Warn("chain bridge is not init") 105 return false 106 } 107 if isStarted { 108 return false 109 } 110 bridgelog.Info("chain bridge start") 111 isStarted = true 112 events.Subscribe(func(e *events.Event) { 113 switch e.Type { 114 case events.ETDirectPeersChanged: 115 bridgelog.Info("ETDirectPeersChanged, to collect old arbiter signed new arbiter's signature") 116 if atomic.LoadInt32(&canStart) == 0 { 117 bridgelog.Info("is starting, can't restart") 118 return 119 } 120 isProducer := pbftEngine.IsProducer() 121 self := pbftEngine.GetProducer() 122 keypair := pbftEngine.GetBridgeArbiters() 123 selfArbiterAddr = keypair.Address() 124 currentArbitersOnContract = MsgReleayer.GetArbiters(escChainID) 125 isValidator := currentArbitersHasself() 126 bridgelog.Info("selfArbiterAddr ", selfArbiterAddr, "isValidator", isValidator) 127 IsFirstUpdateArbiter = len(currentArbitersOnContract) == 0 128 producers := spv.GetNextTurnPeers() 129 sort.Slice(producers, func(i, j int) bool { 130 return bytes.Compare(producers[i][:], producers[j][:]) < 0 131 }) 132 nextTotalCount := spv.GetTotalProducersCount() 133 if !IsFirstUpdateArbiter && isSameNexturnArbiter(producers) && wasArbiter == isProducer && 134 arbiterManager.GetNextTotalCount() == nextTotalCount && isValidator == isProducer { 135 bridgelog.Info("ETDirectPeersChanged is same current producers") 136 return 137 } 138 139 nextTurnArbiters = make([][]byte, 0) 140 if len(producers) > 0 { 141 nextTurnArbiters = make([][]byte, len(producers)) 142 if !IsFirstUpdateArbiter { 143 for i, p := range producers { 144 nextTurnArbiters[i] = make([]byte, len(p)) 145 copy(nextTurnArbiters[i], p[:]) 146 } 147 } 148 } 149 bridgelog.Info("GetNextTurnPeers", "count ", len(producers), "nextTurnArbiters", len(nextTurnArbiters)) 150 wasArbiter = isProducer 151 if !isProducer { 152 bridgelog.Info("self is not a producer, chain bridge is stop") 153 return 154 } 155 arbiterManager.Clear() 156 if IsFirstUpdateArbiter { 157 arbiterManager.SetTotalCount(pbftEngine.GetTotalArbitersCount(), pbftEngine.GetTotalArbitersCount()) 158 } else { 159 arbiterManager.SetTotalCount(pbftEngine.GetTotalArbitersCount(), nextTotalCount) 160 } 161 162 wasArbiter = true 163 bridgelog.Info("became a producer, collect arbiter") 164 165 if IsFirstUpdateArbiter || nexturnHasSelf(self) || len(nextTurnArbiters) == 0 { 166 var pid peer.PID 167 copy(pid[:], self) 168 err := arbiterManager.AddArbiter(pid, pbftEngine.GetBridgeArbiters().PublicKeyBytes()) //add self 169 if err != nil { 170 bridgelog.Error("add self public key failed", "error", err) 171 } 172 } else { 173 bridgelog.Info("nexturn self is not a producer") 174 } 175 retryCount = 0 176 177 if isRequireArbiter { 178 Stop("Re apply for arbiter list ") 179 } 180 atomic.StoreInt32(&canStart, 0) 181 err := arbiterManager.AddCurrentArbiter(keypair.PublicKeyBytes()) 182 if err != nil { 183 bridgelog.Info("AddCurrentArbiter failed", "error", err) 184 } 185 go collectToUpdateArbiters() 186 case dpos.ETUpdateProducers: 187 if selfDutyIndex, ok := e.Data.(int); ok { 188 go func() { 189 if selfDutyIndex > 0 { 190 selfDutyIndex = selfDutyIndex + 1 191 } 192 time.Sleep(time.Duration(selfDutyIndex*8) * time.Second) 193 err := api.UpdateArbiters(escChainID) 194 if err != nil { 195 log.Error("ETUpdateProducers failed", "error", err) 196 } 197 }() 198 } 199 //onProducersChanged(e) 200 case dpos_msg.ETOnArbiter: 201 res, err := hanleDArbiter(pbftEngine, e) 202 if res { 203 list := arbiterManager.GetArbiterList() 204 consensusArbiterCount := len(arbiterManager.GetConsensusArbiters().List) 205 bridgelog.Info("now arbiterList", "count", len(list), "requireArbitersCount", requireArbitersCount, "consensusArbiterCount", consensusArbiterCount) 206 if len(list) == requireArbitersCount && consensusArbiterCount <= 1 { 207 arbiterManager.SaveToCollection() 208 if IsFirstUpdateArbiter { 209 err := api.UpdateArbiters(escChainID) 210 if err != nil { 211 bridgelog.Warn("UpdateArbiters failed", "error", err) 212 } 213 } else { 214 requireArbitersSignature(pbftEngine) 215 } 216 requireArbiters(pbftEngine, true) 217 } 218 } else if err != nil { 219 bridgelog.Error("hanleDArbiter error", "msg", err) 220 } 221 case dpos_msg.ETRequireArbiter: 222 receivedRequireArbiter(pbftEngine, e) 223 case dpos_msg.ETReqArbiterSig: 224 receivedReqArbiterSignature(pbftEngine, e) 225 case dpos_msg.ETFeedBackArbiterSig: 226 handleFeedBackArbitersSig(pbftEngine, e) 227 case dpos_msg.ETESCStateChanged: 228 escStateChanged(e) 229 case dpos.ETOnDutyEvent: 230 recoveryArbiter() 231 } 232 }) 233 return true 234 } 235 236 func currentArbitersHasself() bool { 237 if currentArbitersOnContract != nil && len(currentArbitersOnContract) > 0 { 238 for _, arbiter := range currentArbitersOnContract { 239 if arbiter.String() == selfArbiterAddr { 240 return true 241 } 242 } 243 } 244 return false 245 } 246 247 func isSameNexturnArbiter(producers []peer.PID) bool { 248 if len(producers) == 0 && len(nextTurnArbiters) == 0 { 249 return true 250 } 251 if len(producers) <= 0 || len(nextTurnArbiters) <= 0 { 252 return false 253 } 254 if len(producers) != len(nextTurnArbiters) { 255 return false 256 } 257 for i, p := range producers { 258 if !bytes.Equal(p[:], nextTurnArbiters[i]) { 259 return false 260 } 261 } 262 return true 263 } 264 265 func nexturnHasSelf(acc []byte) bool { 266 for _, arbiter := range nextTurnArbiters { 267 if bytes.Equal(acc, arbiter) { 268 return true 269 } 270 } 271 return false 272 } 273 274 func handleFeedBackArbitersSig(engine *pbft.Pbft, e *events.Event) { 275 m, ok := e.Data.(*dpos_msg.FeedBackArbitersSignature) 276 if !ok { 277 return 278 } 279 producer := m.Producer 280 if !engine.IsProducerByAccount(producer) { 281 bridgelog.Warn("handleFeedBackArbitersSig failed , is not producer", common.Bytes2Hex(producer)) 282 return 283 } 284 salt, err := MsgReleayer.GetHashSalt(escChainID) 285 if err != nil { 286 bridgelog.Warn("GetHashSalt failed", "error") 287 return 288 } 289 hash, err := arbiterManager.HashArbiterList(salt) 290 if err != nil { 291 bridgelog.Warn("HashArbiterList failed", "error", err) 292 return 293 } 294 _, err = crypto.SigToPub(accounts.TextHash(hash.Bytes()), m.Signature) 295 if err != nil { 296 bridgelog.Warn("[handleFeedBackArbitersSig] Ecrecover error", "error", err) 297 return 298 } 299 var pid peer.PID 300 copy(pid[:], producer) 301 err = arbiterManager.AddSignature(pid, m.Signature) 302 if err != nil { 303 bridgelog.Info("AddSignature failed", "error", err, "from", common.Bytes2Hex(producer)) 304 return 305 } 306 signatures := arbiterManager.GetSignatures() 307 count := len(signatures) 308 bridgelog.Info("handleFeedBackArbitersSig", "count", count, "producer", common.Bytes2Hex(producer), "engine.GetTotalArbitersCount()", engine.GetTotalArbitersCount()) 309 } 310 311 func receivedReqArbiterSignature(engine *pbft.Pbft, e *events.Event) { 312 m, ok := e.Data.(*dpos_msg.RequireArbitersSignature) 313 if !ok { 314 return 315 } 316 if engine.IsProducerByAccount(m.PID[:]) == false { 317 bridgelog.Warn("[receivedReqArbiterSignature] target is not a producer", "pid", common.Bytes2Hex(m.PID[:])) 318 return 319 } 320 if int(m.ArbiterCount) != len(arbiterManager.GetArbiterList()) { 321 bridgelog.Warn("[receivedReqArbiterSignature] ArbiterCount is not same", "m.arbiterCount", m.ArbiterCount, "arbiterList", len(arbiterManager.GetArbiterList()), "from node", common.Bytes2Hex(m.PID[:])) 322 return 323 } 324 selfProducer := engine.GetProducer() 325 msg := &dpos_msg.FeedBackArbitersSignature{} 326 msg.Producer = selfProducer 327 328 kp := engine.GetBridgeArbiters().(*secp256k1.Keypair) 329 privateKey := kp.PrivateKey() 330 331 salt, err := MsgReleayer.GetHashSalt(escChainID) 332 if err != nil { 333 bridgelog.Warn("GetHashSalt failed", "error") 334 return 335 } 336 337 hash, err := arbiterManager.HashArbiterList(salt) 338 if err != nil { 339 bridgelog.Error("receivedReqArbiterSignature HashArbiterList failed", "error", err) 340 } 341 sign, err := crypto.Sign(accounts.TextHash(hash.Bytes()), privateKey) 342 if err != nil { 343 bridgelog.Warn("sign arbiters error", "error", err) 344 return 345 } 346 msg.Signature = sign 347 engine.SendMsgToPeer(msg, m.PID) 348 if currentArbitersHasself() { 349 if !arbiterManager.HasSignature(selfProducer) { 350 bridgelog.Info("add self signature") 351 go events.Notify(dpos_msg.ETFeedBackArbiterSig, msg) //add self signature 352 } 353 } else { 354 bridgelog.Warn("receivedReqArbiterSignature current aribter list not contain self") 355 } 356 } 357 358 func requireArbitersSignature(engine *pbft.Pbft) { 359 signCount := len(arbiterManager.GetSignatures()) 360 producersCount := pbftEngine.GetTotalProducerCount() 361 if api.HasProducerMajorityCount(signCount, producersCount) { 362 arbiterManager.SaveToCollection() 363 log.Info("collect over signatures, no nned to require") 364 return 365 } 366 go func() { 367 for { 368 select { 369 case <-time.NewTimer(2 * time.Second).C: 370 signCount = len(arbiterManager.GetSignatures()) 371 log.Info("requireArbitersSignature", "signCount", signCount, "total", arbiterManager.GetCurrentTotalCount()) 372 if api.HasProducerMajorityCount(signCount, producersCount) { 373 log.Info("collect over signatures SaveTo collection and judge is recovery state") 374 arbiterManager.SaveToCollection() 375 setRecoveryArbiterList() 376 return 377 } 378 arbiterCount := len(arbiterManager.GetArbiterList()) 379 selfProducer := engine.GetProducer() 380 msg := &dpos_msg.RequireArbitersSignature{ 381 ArbiterCount: uint8(arbiterCount), 382 } 383 copy(msg.PID[:], selfProducer) 384 peers := arbiterManager.FilterSignatures(engine.GetCurrentProducers()) 385 log.Info("to collecting signatures", "len", len(peers)) 386 engine.BroadMessageToPeers(msg, peers) 387 } 388 } 389 }() 390 } 391 392 func setRecoveryArbiterList() { 393 collection := arbiterManager.GetCollection() 394 address := make([]common.Address, 0) 395 for _, arbiter := range collection.List { 396 escssaPUb, err := crypto.DecompressPubkey(arbiter) 397 if err == nil { 398 addr := crypto.PubkeyToAddress(*escssaPUb) 399 address = append(address, addr) 400 } 401 } 402 403 verifyCount := 0 404 for _, arbiter := range currentArbitersOnContract { 405 for _, addr := range address { 406 if arbiter.String() == addr.String() { 407 verifyCount++ 408 break 409 } 410 } 411 } 412 bridgelog.Info("recoveryArbiterList", "current list", len(currentArbitersOnContract), "selfIsOnduty", pbftEngine.IsOnduty(), "collection len", len(address)) 413 if verifyCount == len(currentArbitersOnContract) && len(address) != verifyCount { 414 isNeedRecoveryArbiters = true 415 } else { 416 isNeedRecoveryArbiters = false 417 } 418 } 419 420 func recoveryArbiter() { 421 if isNeedRecoveryArbiters == false { 422 return 423 } 424 err := api.UpdateArbiters(escChainID) 425 if err != nil { 426 bridgelog.Error("recoveryArbiter failed", "error", err) 427 } 428 isNeedRecoveryArbiters = false 429 } 430 431 func receivedRequireArbiter(engine *pbft.Pbft, e *events.Event) { 432 m, ok := e.Data.(*dpos_msg.RequireArbiter) 433 if !ok { 434 return 435 } 436 SendAriberToPeer(engine, m.PID, m.IsCurrent) 437 } 438 439 func hanleDArbiter(engine *pbft.Pbft, e *events.Event) (bool, error) { 440 // Verify signature of the message. 441 m, ok := e.Data.(*dpos_msg.DArbiter) 442 if !ok { 443 err := errors.New("hanleDArbiter error data") 444 return false, err 445 } 446 selfSigner := engine.GetProducer() 447 448 if bytes.Equal(selfSigner, m.Encode[:]) == false { 449 log.Info("hanleDArbiter is not self DArbiter", "selfSigner", common.Bytes2Hex(selfSigner), "encode", common.Bytes2Hex(m.Encode[:])) 450 return false, nil 451 } 452 pubKey, err := elaCrypto.DecodePoint(m.PID[:]) 453 if err != nil { 454 return false, errors.New("hanleDArbiter invalid public key") 455 } 456 if !engine.IsProducerByAccount(m.PID[:]) && !nexturnHasSelf(m.PID[:]) { 457 log.Error("hanleDArbiter is not a producer") 458 return false, nil 459 } 460 err = elaCrypto.Verify(*pubKey, m.Data(), m.Signature) 461 if err != nil { 462 return false, err 463 } 464 signerPublicKey, err := engine.DecryptArbiter(m.Cipher) 465 if err != nil { 466 return false, err 467 } 468 if m.IsCurrent { 469 err = arbiterManager.AddCurrentArbiter(signerPublicKey) 470 } else { 471 err = arbiterManager.AddArbiter(m.PID, signerPublicKey) 472 } 473 if err != nil { 474 log.Error("add arbiter error", "error", err) 475 return false, nil 476 } 477 log.Info("hanleDArbiter", "signerPublicKey:", common.Bytes2Hex(signerPublicKey), " m.PID[:]", common.Bytes2Hex(m.PID[:]), "isCurrent", m.IsCurrent) 478 return true, nil 479 } 480 481 func collectToUpdateArbiters() { 482 isRequireArbiter = true 483 defer func() { 484 bridgelog.Info("onSelfIsArbiter is quit") 485 isRequireArbiter = false 486 atomic.StoreInt32(&canStart, 1) 487 }() 488 for { 489 select { 490 case <-time.After(time.Second * 2): 491 list := arbiterManager.GetArbiterList() 492 bridgelog.Info("arbiterManager GetArbiterList", "count", len(list), "requireArbitersCount", requireArbitersCount) 493 if len(list) >= requireArbitersCount && requireArbitersCount > 0 { 494 bridgelog.Info("update arbiter collect completed, to collected current arbiters") 495 arbiterManager.SaveToCollection() 496 if IsFirstUpdateArbiter { 497 err := api.UpdateArbiters(escChainID) 498 if err != nil { 499 bridgelog.Error("init arbiter failed", "error", err) 500 } 501 } else { 502 requireArbitersSignature(pbftEngine) 503 } 504 requireArbiters(pbftEngine, true) 505 return 506 } 507 requireArbiters(pbftEngine, false) 508 atomic.StoreInt32(&canStart, 1) 509 case err := <-errChn: 510 bridgelog.Error("failed to listen and serve 2 ", "error", err) 511 return 512 } 513 } 514 } 515 516 func requireArbiters(engine *pbft.Pbft, isCurrent bool) { 517 var peers [][]byte 518 if IsFirstUpdateArbiter || len(nextTurnArbiters) == 0 || isCurrent { 519 peers = engine.GetCurrentProducers() 520 } else { 521 peers = nextTurnArbiters 522 } 523 count := getActivePeerCount(engine, peers) 524 nowArbiterCount := len(arbiterManager.GetArbiterList()) 525 log.Info("getActivePeerCount", "count", count, "total", len(peers), "IsFirstUpdateArbiter", IsFirstUpdateArbiter, "retryCount", retryCount, "isCurrent", isCurrent) 526 if api.HasProducerMajorityCount(count, len(peers)) { 527 if count < len(peers) && retryCount < MAX_RETRYCOUNT && nowArbiterCount > 1 && !isCurrent { 528 retryCount++ 529 return 530 } 531 var list [][]byte 532 if isCurrent { 533 list = peers 534 requireArbitersCount = count 535 } else { 536 list = arbiterManager.FilterArbiters(peers) 537 if retryCount == MAX_RETRYCOUNT { 538 requireArbitersCount = count 539 } else { 540 requireArbitersCount = len(peers) 541 } 542 } 543 544 selfProducer := engine.GetProducer() 545 msg := &dpos_msg.RequireArbiter{IsCurrent: isCurrent} 546 copy(msg.PID[:], selfProducer) 547 548 bridgelog.Info("request arbiters", "len", len(list)) 549 engine.BroadMessageToPeers(msg, list) 550 } 551 } 552 553 func SendAriberToPeer(engine *pbft.Pbft, pid peer.PID, isCurrent bool) { 554 if engine.IsProducerByAccount(pid[:]) == false && !nexturnHasSelf(pid[:]) { 555 log.Warn("target is not a producer", "pid", pid.String()) 556 return 557 } 558 signer := engine.GetBridgeArbiters().PublicKeyBytes() 559 selfProducer := engine.GetProducer() 560 publicKey, err := elaCrypto.DecodePoint(pid[:]) 561 if err != nil { 562 log.Error("DecodePoint pbk error", "error", err, "selfProducer", common.Bytes2Hex(selfProducer)) 563 return 564 } 565 cipher, err := elaCrypto.Encrypt(publicKey, signer) 566 msg := &dpos_msg.DArbiter{ 567 Timestamp: time.Now(), 568 Cipher: cipher, 569 IsCurrent: isCurrent, 570 } 571 copy(msg.PID[:], selfProducer[:]) 572 copy(msg.Encode[:], pid[:]) 573 msg.Signature = engine.SignData(msg.Data()) 574 575 engine.SendMsgToPeer(msg, pid) 576 } 577 578 func getActivePeerCount(engine *pbft.Pbft, arbiters [][]byte) int { 579 count := 0 580 peers := engine.GetAllArbiterPeersInfo() 581 hasSelf := false 582 self := engine.GetProducer() 583 for _, arb := range arbiters { 584 if bytes.Equal(arb, self) { 585 hasSelf = true 586 } 587 for _, peer := range peers { 588 if bytes.Equal(arb, peer.PID[:]) { 589 if peer.State == p2p.CS2WayConnection || peer.State == p2p.CSInboundOnly { 590 count++ 591 } 592 if peer.State == p2p.CSNoneConnection { 593 log.Info("none connect", "pid:", peer.PID.String(), "IP", peer.Addr) 594 } 595 break 596 } 597 } 598 } 599 if hasSelf { 600 count += 1 //add self node 601 } 602 return count 603 } 604 605 func escStateChanged(e *events.Event) { 606 v, ok := e.Data.(int) 607 state := uint8(v) 608 bridgelog.Info("received esc chain state changed", "state", e.Data) 609 if !ok { 610 return 611 } 612 if state < spv.ChainState_DPOS || state > spv.ChainState_Error { 613 bridgelog.Error("error state value", "state", state) 614 return 615 } 616 if !currentArbitersHasself() { 617 bridgelog.Error("self is not in current arbiter list , can't update esc state") 618 return 619 } 620 err := MsgReleayer.SetESCState(state) 621 if err != nil { 622 bridgelog.Error("SetESCState failed", "error", err) 623 } 624 } 625 626 func onProducersChanged(e *events.Event) { 627 if !currentArbitersHasself() { 628 bridgelog.Info("self is not in contract arbiter list") 629 return 630 } 631 collection := arbiterManager.GetCollection() 632 arbiters := collection.List 633 total := collection.NextTotalCount 634 addresses := make([]common.Address, 0) 635 for _, arbiter := range arbiters { 636 escssaPUb, err := crypto.DecompressPubkey(arbiter) 637 if err != nil { 638 bridgelog.Error("arbiter publick key is error", "arbiter", common.Bytes2Hex(arbiter)) 639 continue 640 } 641 addr := crypto.PubkeyToAddress(*escssaPUb) 642 addresses = append(addresses, addr) 643 } 644 645 err := MsgReleayer.SetManualArbiters(addresses, total) 646 bridgelog.Info("SetManualArbiters", "total", total, "error", err, "arbiterCount", len(addresses)) 647 } 648 649 func initRelayer(engine *pbft.Pbft, stack *node.Node, accountPath, accountPassword string) error { 650 if MsgReleayer != nil { 651 return nil 652 } 653 cfg, err := config.GetConfig(config.DefaultConfigDir) 654 if err != nil { 655 log.Info("engine.GetBlockChain().Config().BridgeContractAddr", "address", engine.GetBlockChain().Config().BridgeContractAddr) 656 err = createSelfChain(engine, stack) 657 return err 658 } 659 db, err := lvldb.NewLvlDB(config.BlockstoreFlagName) 660 if err != nil { 661 return err 662 } 663 escChainID = engine.GetBlockChain().Config().ChainID.Uint64() 664 count := len(cfg.Chains) 665 chains := make([]relayer.RelayedChain, count) 666 for i := 0; i < count; i++ { 667 layer, errMsg := createChain(&cfg.Chains[i], db, engine, accountPath, accountPassword) 668 if errMsg != nil { 669 return errors.New(fmt.Sprintf("evm chain is create error:%s, chainid:%d", errMsg.Error(), cfg.Chains[i].Id)) 670 } 671 chains[i] = layer 672 if escChainID == layer.ChainID() { 673 engine.GetBlockChain().Config().BridgeContractAddr = layer.GetBridgeContract() 674 } 675 } 676 MsgReleayer = relayer.NewRelayer(chains, escChainID) 677 return nil 678 } 679 680 func createSelfChain(engine *pbft.Pbft, stack *node.Node) error { 681 if engine.GetBlockChain().Config().ChainID == nil { 682 return errors.New("escChainID is nil") 683 } 684 escChainID = engine.GetBlockChain().Config().ChainID.Uint64() 685 rpc := fmt.Sprintf("http://localhost:%d", stack.Config().HTTPPort) 686 generalConfig := config.GeneralChainConfig{ 687 Name: "ESC", 688 Id: escChainID, 689 Endpoint: rpc, 690 } 691 layer, errMsg := createChain(&generalConfig, nil, engine, "", "") 692 if errMsg != nil { 693 return errors.New(fmt.Sprintf("evm createSelfChain is error:%s, chainid:%d", errMsg.Error(), escChainID)) 694 } 695 chains := make([]relayer.RelayedChain, 1) 696 chains[0] = layer 697 MsgReleayer = relayer.NewRelayer(chains, escChainID) 698 return nil 699 } 700 701 func Stop(msg string) { 702 if isRequireArbiter { 703 errChn <- fmt.Errorf(msg) 704 } 705 atomic.StoreInt32(&canStart, 1) 706 isRequireArbiter = false 707 } 708 func createChain(generalConfig *config.GeneralChainConfig, db blockstore.KeyValueReaderWriter, engine *pbft.Pbft, accountPath, accountPassword string) (*evm.EVMChain, error) { 709 ethClient := evmclient.NewEVMClient(engine) 710 if ethClient == nil { 711 return nil, errors.New("create evm client error") 712 } 713 err := ethClient.Configurate(generalConfig, accountPath, accountPassword) 714 if err != nil { 715 return nil, err 716 } 717 718 var evmVoter *voter.EVMVoter 719 if engine.GetBridgeArbiters() != nil { 720 kp := engine.GetBridgeArbiters().(*secp256k1.Keypair) 721 evmVoter = voter.NewVoter(ethClient, kp) 722 } else { 723 evmVoter = voter.NewVoter(ethClient, nil) 724 } 725 evmListener := listener.NewEVMListener(ethClient, &generalConfig.Opts) 726 chain := evm.NewEVMChain(evmListener, evmVoter, generalConfig.Id, db, 727 generalConfig, arbiterManager) 728 return chain, nil 729 } 730 731 func StartUpdateNode() { 732 go MsgReleayer.Start() 733 }