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 }