|
|
|
package core
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"math/rand"
|
|
|
|
"strconv"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
|
|
|
|
|
"github.com/harmony-one/harmony/core/types"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
blsPubKey1 = [48]byte{}
|
|
|
|
blsPubKey2 = [48]byte{}
|
|
|
|
blsPubKey3 = [48]byte{}
|
|
|
|
blsPubKey4 = [48]byte{}
|
|
|
|
blsPubKey5 = [48]byte{}
|
|
|
|
blsPubKey6 = [48]byte{}
|
|
|
|
blsPubKey7 = [48]byte{}
|
|
|
|
blsPubKey8 = [48]byte{}
|
|
|
|
blsPubKey9 = [48]byte{}
|
|
|
|
blsPubKey10 = [48]byte{}
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
copy(blsPubKey1[:], []byte("random key 1"))
|
|
|
|
copy(blsPubKey2[:], []byte("random key 2"))
|
|
|
|
copy(blsPubKey3[:], []byte("random key 3"))
|
|
|
|
copy(blsPubKey4[:], []byte("random key 4"))
|
|
|
|
copy(blsPubKey5[:], []byte("random key 5"))
|
|
|
|
copy(blsPubKey6[:], []byte("random key 6"))
|
|
|
|
copy(blsPubKey7[:], []byte("random key 7"))
|
|
|
|
copy(blsPubKey8[:], []byte("random key 8"))
|
|
|
|
copy(blsPubKey9[:], []byte("random key 9"))
|
|
|
|
copy(blsPubKey10[:], []byte("random key 10"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func fakeGetInitShardState(numberOfShards, numOfNodes int) types.ShardState {
|
|
|
|
rand.Seed(int64(42))
|
|
|
|
shardState := types.ShardState{}
|
|
|
|
for i := 0; i < numberOfShards; i++ {
|
|
|
|
sid := uint32(i)
|
|
|
|
com := types.Committee{ShardID: sid}
|
|
|
|
for j := 0; j < numOfNodes; j++ {
|
|
|
|
nid := strconv.Itoa(int(rand.Int63()))
|
|
|
|
blsPubKey := [48]byte{}
|
|
|
|
copy(blsPubKey1[:], []byte(nid))
|
|
|
|
com.NodeList = append(com.NodeList, types.NodeID{
|
|
|
|
EcdsaAddress: common.BytesToAddress([]byte(nid)),
|
|
|
|
BlsPublicKey: blsPubKey,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
shardState = append(shardState, com)
|
|
|
|
}
|
|
|
|
return shardState
|
|
|
|
}
|
|
|
|
|
|
|
|
func fakeNewNodeList(seed int64) []types.NodeID {
|
|
|
|
rand.Seed(seed)
|
|
|
|
numNewNodes := rand.Intn(10)
|
|
|
|
nodeList := []types.NodeID{}
|
|
|
|
for i := 0; i < numNewNodes; i++ {
|
|
|
|
nid := strconv.Itoa(int(rand.Int63()))
|
|
|
|
blsPubKey := [48]byte{}
|
|
|
|
copy(blsPubKey1[:], []byte(nid))
|
|
|
|
nodeList = append(nodeList, types.NodeID{
|
|
|
|
EcdsaAddress: common.BytesToAddress([]byte(nid)),
|
|
|
|
BlsPublicKey: blsPubKey,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
return nodeList
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFakeNewNodeList(t *testing.T) {
|
|
|
|
nodeList := fakeNewNodeList(42)
|
|
|
|
fmt.Println("newNodeList: ", nodeList)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestShuffle(t *testing.T) {
|
|
|
|
nodeList := []types.NodeID{
|
|
|
|
{EcdsaAddress: common.Address{0x12}, BlsPublicKey: blsPubKey1},
|
|
|
|
{EcdsaAddress: common.Address{0x22}, BlsPublicKey: blsPubKey2},
|
|
|
|
{EcdsaAddress: common.Address{0x32}, BlsPublicKey: blsPubKey3},
|
|
|
|
{EcdsaAddress: common.Address{0x42}, BlsPublicKey: blsPubKey4},
|
|
|
|
{EcdsaAddress: common.Address{0x52}, BlsPublicKey: blsPubKey5},
|
|
|
|
{EcdsaAddress: common.Address{0x62}, BlsPublicKey: blsPubKey6},
|
|
|
|
{EcdsaAddress: common.Address{0x72}, BlsPublicKey: blsPubKey7},
|
|
|
|
{EcdsaAddress: common.Address{0x82}, BlsPublicKey: blsPubKey8},
|
|
|
|
{EcdsaAddress: common.Address{0x92}, BlsPublicKey: blsPubKey9},
|
|
|
|
{EcdsaAddress: common.Address{0x02}, BlsPublicKey: blsPubKey10},
|
|
|
|
}
|
|
|
|
|
|
|
|
cpList := []types.NodeID{}
|
|
|
|
cpList = append(cpList, nodeList...)
|
|
|
|
Shuffle(nodeList)
|
|
|
|
cnt := 0
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
if cpList[i] == nodeList[i] {
|
|
|
|
cnt++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if cnt == 10 {
|
|
|
|
t.Error("Shuffle list is the same as original list")
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSortCommitteeBySize(t *testing.T) {
|
|
|
|
shardState := fakeGetInitShardState(6, 10)
|
|
|
|
ss := &ShardingState{epoch: 1, rnd: 42, shardState: shardState, numShards: len(shardState)}
|
|
|
|
ss.sortCommitteeBySize()
|
|
|
|
for i := 0; i < ss.numShards-1; i++ {
|
|
|
|
assert.Equal(t, true, len(ss.shardState[i].NodeList) >= len(ss.shardState[i+1].NodeList))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUpdateShardState(t *testing.T) {
|
|
|
|
shardState := fakeGetInitShardState(6, 10)
|
|
|
|
ss := &ShardingState{epoch: 1, rnd: 42, shardState: shardState, numShards: len(shardState)}
|
|
|
|
newNodeList := []types.NodeID{
|
|
|
|
{EcdsaAddress: common.Address{0x12}, BlsPublicKey: blsPubKey1},
|
|
|
|
{EcdsaAddress: common.Address{0x22}, BlsPublicKey: blsPubKey2},
|
|
|
|
{EcdsaAddress: common.Address{0x32}, BlsPublicKey: blsPubKey3},
|
|
|
|
{EcdsaAddress: common.Address{0x42}, BlsPublicKey: blsPubKey4},
|
|
|
|
{EcdsaAddress: common.Address{0x52}, BlsPublicKey: blsPubKey5},
|
|
|
|
{EcdsaAddress: common.Address{0x62}, BlsPublicKey: blsPubKey6},
|
|
|
|
}
|
|
|
|
|
|
|
|
ss.Reshard(newNodeList, 0.2)
|
|
|
|
assert.Equal(t, 6, ss.numShards)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestAssignNewNodes(t *testing.T) {
|
|
|
|
shardState := fakeGetInitShardState(2, 2)
|
|
|
|
ss := &ShardingState{epoch: 1, rnd: 42, shardState: shardState, numShards: len(shardState)}
|
|
|
|
newNodes := []types.NodeID{
|
|
|
|
{EcdsaAddress: common.Address{0x12}, BlsPublicKey: blsPubKey1},
|
|
|
|
{EcdsaAddress: common.Address{0x22}, BlsPublicKey: blsPubKey2},
|
|
|
|
{EcdsaAddress: common.Address{0x32}, BlsPublicKey: blsPubKey3},
|
|
|
|
}
|
|
|
|
|
|
|
|
ss.assignNewNodes(newNodes)
|
|
|
|
assert.Equal(t, 2, ss.numShards)
|
|
|
|
assert.Equal(t, 5, len(ss.shardState[0].NodeList))
|
|
|
|
}
|