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  }