github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/services/oracle/nodes.go (about)

     1  package oracle
     2  
     3  import (
     4  	"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
     5  	"github.com/nspcc-dev/neo-go/pkg/encoding/address"
     6  	"github.com/nspcc-dev/neo-go/pkg/smartcontract"
     7  	"github.com/nspcc-dev/neo-go/pkg/wallet"
     8  	"go.uber.org/zap"
     9  )
    10  
    11  // UpdateOracleNodes updates oracle nodes list.
    12  func (o *Oracle) UpdateOracleNodes(oracleNodes keys.PublicKeys) {
    13  	o.accMtx.Lock()
    14  	defer o.accMtx.Unlock()
    15  
    16  	old := o.oracleNodes
    17  	if isEqual := len(old) == len(oracleNodes); isEqual {
    18  		for i := range old {
    19  			if !old[i].Equal(oracleNodes[i]) {
    20  				isEqual = false
    21  				break
    22  			}
    23  		}
    24  		if isEqual {
    25  			return
    26  		}
    27  	}
    28  
    29  	var acc *wallet.Account
    30  	for i := range oracleNodes {
    31  		acc = o.wallet.GetAccount(oracleNodes[i].GetScriptHash())
    32  		if acc != nil {
    33  			if acc.CanSign() {
    34  				break
    35  			}
    36  			err := acc.Decrypt(o.MainCfg.UnlockWallet.Password, o.wallet.Scrypt)
    37  			if err != nil {
    38  				o.Log.Error("can't unlock account",
    39  					zap.String("address", address.Uint160ToString(acc.Contract.ScriptHash())),
    40  					zap.Error(err))
    41  				o.currAccount = nil
    42  				return
    43  			}
    44  			break
    45  		}
    46  	}
    47  
    48  	o.currAccount = acc
    49  	o.oracleSignContract, _ = smartcontract.CreateDefaultMultiSigRedeemScript(oracleNodes)
    50  	o.oracleNodes = oracleNodes
    51  }
    52  
    53  func (o *Oracle) getAccount() *wallet.Account {
    54  	o.accMtx.RLock()
    55  	defer o.accMtx.RUnlock()
    56  	return o.currAccount
    57  }
    58  
    59  func (o *Oracle) getOracleNodes() keys.PublicKeys {
    60  	o.accMtx.RLock()
    61  	defer o.accMtx.RUnlock()
    62  	return o.oracleNodes
    63  }
    64  
    65  func (o *Oracle) getOracleSignContract() []byte {
    66  	o.accMtx.RLock()
    67  	defer o.accMtx.RUnlock()
    68  	return o.oracleSignContract
    69  }