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  }