github.com/cranelv/ethereum_mpc@v0.0.0-20191031014521-23aeb1415092/mpcService/step/generator/generator_test.go (about)

     1  package generator
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  	"github.com/ethereum/go-ethereum/mpcService/protocol"
     7  	"github.com/ethereum/go-ethereum/mpcService/crypto"
     8  	"github.com/ethereum/go-ethereum/p2p/discover"
     9  )
    10  
    11  func makeZero(degree, peerNum int, peerInfo []protocol.PeerInfo) ([]big.Int, *big.Int) {
    12  	jrss := make([]RandomPolynomialValue, peerNum)
    13  	for i := 0; i < peerNum; i++ {
    14  		jrss[i] = *CreateJRSSValue(degree, peerNum,"text")
    15  		jrss[i].Initialize(peerInfo,nil)
    16  	}
    17  
    18  	lagResult := big.NewInt(0)
    19  	for i := 0; i < peerNum; i++ {
    20  		for j := 0; j < len(jrss[i].PolyValue); j++ {
    21  			jrss[i].PolyValue[j] = big.NewInt(0)
    22  		}
    23  		lagResult.Add(lagResult, jrss[i].RandCoefficient[0])
    24  	}
    25  
    26  	lagResult.Mod(lagResult, crypto.Secp256k1N)
    27  	jrssResult := make([]big.Int, peerNum)
    28  	for i := 0; i < peerNum; i++ {
    29  		for j := 0; j < peerNum; j++ {
    30  			jrssResult[i].Add(&jrssResult[i], jrss[j].PolyValue[i])
    31  		}
    32  		jrssResult[i].Mod(&jrssResult[i], crypto.Secp256k1N)
    33  	}
    34  
    35  	return jrssResult, lagResult
    36  }
    37  
    38  func makeJRSS(degree, peerNum int, peerInfo []protocol.PeerInfo) ([]big.Int, *big.Int) {
    39  	jrss := make([]RandomPolynomialValue, peerNum)
    40  	for i := 0; i < peerNum; i++ {
    41  		jrss[i] = *CreateJRSSValue(degree, peerNum,"test")
    42  	}
    43  
    44  	lagResult := big.NewInt(0)
    45  	for i := 0; i < peerNum; i++ {
    46  		jrss[i].Initialize(peerInfo, nil)
    47  		lagResult.Add(lagResult, jrss[i].RandCoefficient[0])
    48  	}
    49  
    50  	lagResult.Mod(lagResult, crypto.Secp256k1N)
    51  	jrssResult := make([]big.Int, peerNum)
    52  	for i := 0; i < peerNum; i++ {
    53  		for j := 0; j < peerNum; j++ {
    54  			jrssResult[i].Add(&jrssResult[i], jrss[j].PolyValue[i])
    55  		}
    56  		jrssResult[i].Mod(&jrssResult[i], crypto.Secp256k1N)
    57  	}
    58  
    59  	return jrssResult, lagResult
    60  }
    61  
    62  func makeJZSS(degree, peerNum int, peerInfo []protocol.PeerInfo) ([]big.Int, *big.Int) {
    63  	jrss := make([]RandomPolynomialValue, peerNum)
    64  	for i := 0; i < peerNum; i++ {
    65  		jrss[i] = *CreateJZSSValue(degree, peerNum,"test")
    66  	}
    67  
    68  	lagResult := big.NewInt(0)
    69  	for i := 0; i < peerNum; i++ {
    70  		jrss[i].Initialize(peerInfo, nil)
    71  		lagResult.Add(lagResult, jrss[i].RandCoefficient[0])
    72  	}
    73  
    74  	lagResult.Mod(lagResult, crypto.Secp256k1N)
    75  	jrssResult := make([]big.Int, peerNum)
    76  	for i := 0; i < peerNum; i++ {
    77  		for j := 0; j < peerNum; j++ {
    78  			jrssResult[i].Add(&jrssResult[i], jrss[j].PolyValue[i])
    79  		}
    80  		jrssResult[i].Mod(&jrssResult[i], crypto.Secp256k1N)
    81  	}
    82  
    83  	return jrssResult, lagResult
    84  }
    85  
    86  func makePeerInfo(peerNum int) []protocol.PeerInfo {
    87  	peerInfo := make([]protocol.PeerInfo, peerNum)
    88  	for i := 0; i < peerNum; i++ {
    89  		peerInfo[i] = protocol.PeerInfo{PeerID:new(discover.NodeID), Seed:uint64(i + 2)}
    90  	}
    91  
    92  	return peerInfo
    93  }
    94  
    95  func TestJRSSZeroMult(t *testing.T) {
    96  	degree := 8
    97  	peerNum := 21
    98  	peerInfo := makePeerInfo(peerNum)
    99  	jrssResult, lagResult := makeZero(degree, peerNum, peerInfo)
   100  	t.Logf("lagResult is: %v", lagResult)
   101  	jrssResult1, lagResult1 := makeZero(degree, peerNum, peerInfo)
   102  	t.Logf("lagResult1 is: %v", lagResult1)
   103  	lagResult.Mul(lagResult, lagResult1)
   104  	lagResult.Mod(lagResult, crypto.Secp256k1N)
   105  	t.Logf("Mult lagResult is: %v", lagResult)
   106  	jzssResult, zResult := makeZero(degree*2, peerNum, peerInfo)
   107  	t.Logf("zero Result is: %v", zResult)
   108  	jrssResultMul := make([]big.Int, peerNum)
   109  	for i := 0; i < peerNum; i++ {
   110  		jrssResultMul[i].Mul(&jrssResult[i], &jrssResult1[i])
   111  		jrssResultMul[i].Add(&jrssResultMul[i], &jzssResult[i])
   112  		jrssResultMul[i].Mod(&jrssResultMul[i], crypto.Secp256k1N)
   113  	}
   114  
   115  	for i := 0; i < peerNum-degree*2-1; i++ {
   116  		seedLen := degree*2 + 1
   117  		seed := make([]int, seedLen)
   118  		for j := 0; j < seedLen; j++ {
   119  			seed[j] = i + j
   120  		}
   121  
   122  		lag1 := testLagrange(seed, peerInfo, jrssResultMul)
   123  		t.Logf("lagResult 1 is: %v", lag1)
   124  		if lagResult.Cmp(lag1) != 0 {
   125  			t.Error("Lagrange is Error")
   126  		}
   127  	}
   128  }
   129  
   130  func TestJRSSGeneratorMult(t *testing.T) {
   131  	degree := 8
   132  	peerNum := 21
   133  	peerInfo := makePeerInfo(peerNum)
   134  	jrssResult, lagResult := makeJRSS(degree, peerNum, peerInfo)
   135  	t.Logf("lagResult is: %v", lagResult)
   136  	jrssResult1, lagResult1 := makeJRSS(degree, peerNum, peerInfo)
   137  	t.Logf("lagResult1 is: %v", lagResult1)
   138  	lagResult.Mul(lagResult, lagResult1)
   139  	lagResult.Mod(lagResult, crypto.Secp256k1N)
   140  	t.Logf("Mult lagResult is: %v", lagResult)
   141  	jzssResult, zResult := makeJZSS(degree*2, peerNum, peerInfo)
   142  	t.Logf("zero Result is: %v", zResult)
   143  	jrssResultMul := make([]big.Int, peerNum)
   144  	for i := 0; i < peerNum; i++ {
   145  		jrssResultMul[i].Mul(&jrssResult[i], &jrssResult1[i])
   146  		jrssResultMul[i].Add(&jrssResultMul[i], &jzssResult[i])
   147  		jrssResultMul[i].Mod(&jrssResultMul[i], crypto.Secp256k1N)
   148  	}
   149  
   150  	for i := 0; i < peerNum-degree*2-1; i++ {
   151  		seedLen := degree*2 + 1
   152  		seed := make([]int, seedLen)
   153  		for j := 0; j < seedLen; j++ {
   154  			seed[j] = i + j
   155  		}
   156  
   157  		lag1 := testLagrange(seed, peerInfo, jrssResultMul)
   158  		t.Logf("lagResult 1 is: %v", lag1)
   159  		if lagResult.Cmp(lag1) != 0 {
   160  			t.Error("Lagrange is Error")
   161  		}
   162  	}
   163  
   164  	for i := 0; i < peerNum-degree*2-1; i++ {
   165  		seedLen := degree * 2
   166  		seed := make([]int, seedLen)
   167  		for j := 0; j < seedLen; j++ {
   168  			seed[j] = i + j
   169  		}
   170  
   171  		lag1 := testLagrange(seed, peerInfo, jrssResultMul)
   172  		t.Logf("lagResult 2 is: %v", lag1)
   173  		if lagResult.Cmp(lag1) == 0 {
   174  			t.Error("Lagrange is Error")
   175  		}
   176  	}
   177  }
   178  
   179  func TestJRSSGenerator21(t *testing.T) {
   180  	degree := 8
   181  	peerNum := 21
   182  	peerInfo := makePeerInfo(peerNum)
   183  	jrssResult, lagResult := makeJRSS(degree, peerNum, peerInfo)
   184  
   185  	t.Logf("lagResult is: %v", lagResult)
   186  	for i := 0; i < peerNum-degree-1; i++ {
   187  		seed := make([]int, degree+1)
   188  		for j := 0; j < degree+1; j++ {
   189  			seed[j] = i + j
   190  		}
   191  
   192  		lag1 := testLagrange(seed, peerInfo, jrssResult)
   193  		t.Logf("lagResult 1 is: %v", lag1)
   194  		if lagResult.Cmp(lag1) != 0 {
   195  			t.Error("Lagrange is Error")
   196  		}
   197  	}
   198  
   199  }
   200  
   201  func TestJRSSGenerator(t *testing.T) {
   202  	jrss1 := CreateJRSSValue(1, 3,"test")
   203  	jrss2 := CreateJRSSValue(1, 3,"test")
   204  	jrss3 := CreateJRSSValue(1, 3,"test")
   205  
   206  	peerInfo := []protocol.PeerInfo{
   207  		protocol.PeerInfo{PeerID:new(discover.NodeID), Seed:1},
   208  		protocol.PeerInfo{PeerID:new(discover.NodeID), Seed:2},
   209  		protocol.PeerInfo{PeerID:new(discover.NodeID), Seed:3}}
   210  	jrss1.Initialize(peerInfo, nil)
   211  	jrss2.Initialize(peerInfo, nil)
   212  	jrss3.Initialize(peerInfo, nil)
   213  
   214  	jrssResult := make([]big.Int, 3)
   215  	for i := 0; i < 3; i++ {
   216  		jrssResult[i].Add(&jrssResult[i], jrss1.PolyValue[i])
   217  		jrssResult[i].Add(&jrssResult[i], jrss2.PolyValue[i])
   218  		jrssResult[i].Add(&jrssResult[i], jrss3.PolyValue[i])
   219  		jrssResult[i].Mod(&jrssResult[i], crypto.Secp256k1N)
   220  	}
   221  
   222  	lagResult := jrss1.RandCoefficient[0]
   223  	lagResult.Add(lagResult, jrss2.RandCoefficient[0])
   224  	lagResult.Add(lagResult, jrss3.RandCoefficient[0])
   225  	lagResult.Mod(lagResult, crypto.Secp256k1N)
   226  	t.Logf("lagResult is: %v", lagResult)
   227  	lag1 := testLagrange([]int{0, 1}, peerInfo, jrssResult)
   228  	t.Logf("lagResult 1 is: %v", lag1)
   229  	if lagResult.Cmp(lag1) != 0 {
   230  		t.Error("Lagrange is Error")
   231  	}
   232  
   233  	lag1 = testLagrange([]int{0, 2}, peerInfo, jrssResult)
   234  	t.Logf("lagResult 1 is: %v", lag1)
   235  	if lagResult.Cmp(lag1) != 0 {
   236  		t.Error("Lagrange is Error")
   237  	}
   238  
   239  	lag1 = testLagrange([]int{1, 2}, peerInfo, jrssResult)
   240  	t.Logf("lagResult 1 is: %v", lag1)
   241  	if lagResult.Cmp(lag1) != 0 {
   242  		t.Error("Lagrange is Error")
   243  	}
   244  
   245  	lag1 = testLagrange([]int{2, 0}, peerInfo, jrssResult)
   246  	t.Logf("lagResult 1 is: %v", lag1)
   247  	if lagResult.Cmp(lag1) != 0 {
   248  		t.Error("Lagrange is Error")
   249  	}
   250  
   251  	lag1 = testLagrange([]int{2, 1}, peerInfo, jrssResult)
   252  	t.Logf("lagResult 1 is: %v", lag1)
   253  	if lagResult.Cmp(lag1) != 0 {
   254  		t.Error("Lagrange is Error")
   255  	}
   256  
   257  	lag1 = testLagrange([]int{1, 0}, peerInfo, jrssResult)
   258  	t.Logf("lagResult 1 is: %v", lag1)
   259  	if lagResult.Cmp(lag1) != 0 {
   260  		t.Error("Lagrange is Error")
   261  	}
   262  }
   263  
   264  func testLagrange(seed []int, peerInfo []protocol.PeerInfo, jrssResult []big.Int) *big.Int {
   265  	fx := make([]*big.Int, len(seed))
   266  	x := make([]*big.Int, len(seed))
   267  	for i := 0; i < len(seed); i++ {
   268  		x[i] = new(big.Int).SetUint64(peerInfo[seed[i]].Seed)
   269  		fx[i] = &jrssResult[seed[i]]
   270  	}
   271  
   272  	return crypto.Lagrange(fx, x)
   273  }