github.com/cranelv/ethereum_mpc@v0.0.0-20191031014521-23aeb1415092/mpcService/step/txsign_jr_jz_step.go (about) 1 package step 2 3 import ( 4 "github.com/ethereum/go-ethereum/mpcService/protocol" 5 "github.com/ethereum/go-ethereum/mpcService/step/generator" 6 "github.com/ethereum/go-ethereum/log" 7 "math/big" 8 crypto "github.com/ethereum/go-ethereum/mpcService/crypto" 9 ) 10 11 type TXSignJR_JZ_Step struct { 12 BaseMpcStep 13 } 14 15 func CreateTXSignJR_JZ_Step(result protocol.MpcResultInterface,degree int, nodeInfo protocol.MpcNodeInterface) *TXSignJR_JZ_Step { 16 17 mpc := &TXSignJR_JZ_Step{*CreateBaseMpcStep(result,nodeInfo, 4,true),} 18 mpc.messages[0] = generator.CreateJRSSValue(degree, nodeInfo.NeedQuorum(),protocol.MpcSignA) 19 mpc.messages[1] = generator.CreateJRSSValue(degree, nodeInfo.NeedQuorum(),protocol.MpcSignR) 20 mpc.messages[2] = generator.CreateJZSSValue(degree*2, nodeInfo.NeedQuorum(),protocol.MpcSignB) 21 mpc.messages[3] = generator.CreateJZSSValue(degree*2, nodeInfo.NeedQuorum(),protocol.MpcSignC) 22 23 return mpc 24 } 25 26 func (jrjz *TXSignJR_JZ_Step) CreateMessage() []protocol.StepMessage { 27 log.Info("TXSignJR_JZ_Step.CreateMessage begin") 28 29 peerNum := jrjz.nodeInfo.NeedQuorum() 30 message := make([]protocol.StepMessage, peerNum) 31 32 peers := jrjz.nodeInfo.GetPeers() 33 for i := 0; i < peerNum; i++ { 34 message[i].Msgcode = protocol.MSG_MPCMessage 35 message[i].PeerID = peers[i].PeerID 36 message[i].Data = append(message[i].Data, 37 &protocol.MpcData{protocol.MpcSignASeed,jrjz.messages[0].GetMessageData(i)}, 38 &protocol.MpcData{protocol.MpcSignRSeed,jrjz.messages[1].GetMessageData(i)}, 39 &protocol.MpcData{protocol.MpcSignBSeed,jrjz.messages[2].GetMessageData(i)}, 40 &protocol.MpcData{protocol.MpcSignCSeed,jrjz.messages[3].GetMessageData(i)}) 41 } 42 return message 43 } 44 45 46 func (jrjz *TXSignJR_JZ_Step) HandleMessage(msg *protocol.StepMessage) bool { 47 log.Info("TXSignJR_JZ_Step.HandleMessage, PeerID:%s, DataLen:%d", msg.PeerID.String(), len(msg.Data)) 48 seed := jrjz.nodeInfo.GetSeed(msg.PeerID) 49 if seed == 0 { 50 log.Error("TXSignJR_JZ_Step.HandleMessage, get seed fail.","peer", msg.PeerID) 51 } 52 53 if len(msg.Data) != 4 { 54 log.Error("TXSignJR_JZ_Step HandleMessage, received data len doesn't match requirement, dataLen:%d", len(msg.Data)) 55 return false 56 } 57 jrjz.messages[0].SetMessageData(seed,msg.Data[0].Data) 58 jrjz.messages[1].SetMessageData(seed,msg.Data[1].Data) 59 jrjz.messages[2].SetMessageData(seed,msg.Data[2].Data) 60 jrjz.messages[3].SetMessageData(seed,msg.Data[3].Data) 61 return true 62 } 63 64 65 func (jrjz *TXSignJR_JZ_Step) FinishStep(mpc protocol.MpcManager) error { 66 err := jrjz.BaseMpcStep.FinishStep() 67 if err != nil { 68 log.Error("TXSignJR_JZ_Step.BaseMpcStep.FinishStep fail, err:%s", err.Error()) 69 return err 70 } 71 72 result0 := jrjz.messages[0].GetResultData() 73 jrjz.mpcResult.SetValue(result0.Key,result0.Data) 74 result1 := jrjz.messages[1].GetResultData() 75 jrjz.mpcResult.SetValue(result1.Key,result1.Data) 76 result2 := jrjz.messages[2].GetResultData() 77 jrjz.mpcResult.SetValue(result2.Key,result2.Data) 78 result3 := jrjz.messages[3].GetResultData() 79 jrjz.mpcResult.SetValue(result3.Key,result3.Data) 80 msgA := jrjz.messages[0].(*generator.RandomPolynomialValue) 81 jrjz.mpcResult.SetValue(protocol.MpcSignA0, msgA.RandCoefficient[0]) 82 msgR := jrjz.messages[1].(*generator.RandomPolynomialValue) 83 jrjz.mpcResult.SetValue(protocol.MpcSignR0, msgR.RandCoefficient[0]) 84 ar := new(big.Int).Mul(result0.Data.(*big.Int), result1.Data.(*big.Int)) 85 ar.Mod(ar, crypto.Secp256k1N) 86 ar.Add(ar, result2.Data.(*big.Int)) 87 ar.Mod(ar, crypto.Secp256k1N) 88 err = jrjz.mpcResult.SetValue(protocol.MpcSignARSeed, ar) 89 // log.Error("ARSeed","seed1",ar) 90 log.Info("TXSignJR_JZ_Step.FinishStep succeed") 91 return nil 92 }