Merge pull request #1419 from LeoHChen/master_merge_from_r3

Master merge from r3
pull/1423/head
Dennis JongHyuck Won 5 years ago committed by GitHub
commit 788463650d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      cmd/client/wallet/main.go
  2. 1
      cmd/client/wallet_stress_test/README.md
  3. 76
      cmd/client/wallet_stress_test/generated_wallet.ini.go
  4. 465
      cmd/client/wallet_stress_test/main.go
  5. 2
      cmd/harmony/main.go
  6. 4
      consensus/consensus_msg_sender.go
  7. 29
      core/types/transaction.go
  8. 1
      go.mod
  9. 35
      internal/configs/sharding/fixedschedule.go
  10. 42
      internal/configs/sharding/localnet.go
  11. 48
      internal/configs/sharding/mainnet.go
  12. 34
      internal/configs/sharding/pangaea.go
  13. 61
      internal/configs/sharding/shardingconfig.go
  14. 40
      internal/configs/sharding/testnet.go
  15. 324
      internal/genesis/foundational.go
  16. 16
      internal/genesis/foundational_test.go
  17. 40
      internal/genesis/genesis_test.go
  18. 7
      internal/genesis/harmony_test.go
  19. 16
      internal/genesis/localnodes_test.go
  20. 20
      internal/genesis/newnodes.go
  21. 7
      internal/genesis/newnodes_test.go
  22. 11
      internal/genesis/tn_harmony_test.go
  23. 49
      node/node.go
  24. 2
      node/node_handler.go
  25. 4
      node/node_handler_test.go
  26. 7
      node/node_newblock.go
  27. 2
      node/staking_test.go
  28. 71
      node/worker/worker.go
  29. 1
      scripts/go_executable_build.sh

@ -91,6 +91,7 @@ var (
transferSenderPtr = transferCommand.String("from", "0", "Specify the sender account address or index") transferSenderPtr = transferCommand.String("from", "0", "Specify the sender account address or index")
transferReceiverPtr = transferCommand.String("to", "", "Specify the receiver account") transferReceiverPtr = transferCommand.String("to", "", "Specify the receiver account")
transferAmountPtr = transferCommand.Float64("amount", 0, "Specify the amount to transfer") transferAmountPtr = transferCommand.Float64("amount", 0, "Specify the amount to transfer")
transferGasPricePtr = transferCommand.Uint64("gasPrice", 0, "Specify the gas price amount. Unit is Nano.")
transferShardIDPtr = transferCommand.Int("shardID", 0, "Specify the shard ID for the transfer") transferShardIDPtr = transferCommand.Int("shardID", 0, "Specify the shard ID for the transfer")
transferToShardIDPtr = transferCommand.Int("toShardID", 0, "Specify the destination shard ID for the transfer") transferToShardIDPtr = transferCommand.Int("toShardID", 0, "Specify the destination shard ID for the transfer")
transferInputDataPtr = transferCommand.String("inputData", "", "Base64-encoded input data to embed in the transaction") transferInputDataPtr = transferCommand.String("inputData", "", "Base64-encoded input data to embed in the transaction")
@ -653,6 +654,7 @@ func processTransferCommand() {
sender := *transferSenderPtr sender := *transferSenderPtr
receiver := *transferReceiverPtr receiver := *transferReceiverPtr
amount := *transferAmountPtr amount := *transferAmountPtr
gasPrice := *transferGasPricePtr
shardID := *transferShardIDPtr shardID := *transferShardIDPtr
toShardID := *transferToShardIDPtr toShardID := *transferToShardIDPtr
base64InputData := *transferInputDataPtr base64InputData := *transferInputDataPtr
@ -714,9 +716,13 @@ func processTransferCommand() {
fromShard := uint32(shardID) fromShard := uint32(shardID)
toShard := uint32(toShardID) toShard := uint32(toShardID)
var tx *types.Transaction var tx *types.Transaction
gasPriceBigInt := big.NewInt(int64(gasPrice))
gasPriceBigInt = gasPriceBigInt.Mul(gasPriceBigInt, big.NewInt(denominations.Nano))
tx = types.NewCrossShardTransaction( tx = types.NewCrossShardTransaction(
state.nonce, &receiverAddress, fromShard, toShard, amountBigInt, state.nonce, &receiverAddress, fromShard, toShard, amountBigInt,
gas, nil, inputData) gas, gasPriceBigInt, inputData)
account, err := ks.Find(accounts.Account{Address: senderAddress}) account, err := ks.Find(accounts.Account{Address: senderAddress})
if err != nil { if err != nil {
@ -724,7 +730,13 @@ func processTransferCommand() {
return return
} }
err = ks.Unlock(account, senderPass) newPass, err := utils.GetPassphraseFromSource(senderPass)
if err != nil {
fmt.Printf("Cannot read passphrase: %s\n", err)
os.Exit(3)
}
err = ks.Unlock(account, newPass)
if err != nil { if err != nil {
fmt.Printf("Unlock account failed! %v\n", err) fmt.Printf("Unlock account failed! %v\n", err)
return return

@ -0,0 +1 @@
The wallet program is the demo wallet which talks to Harmony devnet for various kinds of operations. For detail, please compile and execute ./bin/wallet.

@ -0,0 +1,76 @@
package main
const (
defaultWalletIni = `[default]
bootnode = /ip4/100.26.90.187/tcp/9874/p2p/Qmdfjtk6hPoyrH1zVD9PEH4zfWLo38dP2mDvvKXfh3tnEv
bootnode = /ip4/54.213.43.194/tcp/9874/p2p/QmZJJx6AdaoEkGLrYG4JeLCKeCKDjnFz2wfHNHxAqFSGA9
bootnode = /ip4/13.113.101.219/tcp/12019/p2p/QmQayinFSgMMw5cSpDUiD9pQ2WeP6WNmGxpZ6ou3mdVFJX
bootnode = /ip4/99.81.170.167/tcp/12019/p2p/QmRVbTpEYup8dSaURZfF6ByrMTSKa4UyUzJhSjahFzRqNj
shards = 4
[default.shard0.rpc]
rpc = l0.t.hmny.io:14555
rpc = s0.t.hmny.io:14555
[default.shard1.rpc]
rpc = l1.t.hmny.io:14555
rpc = s1.t.hmny.io:14555
[default.shard2.rpc]
rpc = l2.t.hmny.io:14555
rpc = s2.t.hmny.io:14555
[default.shard3.rpc]
rpc = l3.t.hmny.io:14555
rpc = s3.t.hmny.io:14555
[local]
bootnode = /ip4/127.0.0.1/tcp/19876/p2p/Qmc1V6W7BwX8Ugb42Ti8RnXF1rY5PF7nnZ6bKBryCgi6cv
shards = 2
[local.shard0.rpc]
rpc = 127.0.0.1:14555
rpc = 127.0.0.1:14557
rpc = 127.0.0.1:14559
[local.shard1.rpc]
rpc = 127.0.0.1:14556
rpc = 127.0.0.1:14558
rpc = 127.0.0.1:14560
[beta]
bootnode = /ip4/54.213.43.194/tcp/9868/p2p/QmZJJx6AdaoEkGLrYG4JeLCKeCKDjnFz2wfHNHxAqFSGA9
bootnode = /ip4/100.26.90.187/tcp/9868/p2p/Qmdfjtk6hPoyrH1zVD9PEH4zfWLo38dP2mDvvKXfh3tnEv
bootnode = /ip4/13.113.101.219/tcp/12018/p2p/QmQayinFSgMMw5cSpDUiD9pQ2WeP6WNmGxpZ6ou3mdVFJX
shards = 2
[beta.shard0.rpc]
rpc = l0.b.hmny.io:14555
rpc = s0.b.hmny.io:14555
[beta.shard1.rpc]
rpc = l1.b.hmny.io:14555
rpc = s1.b.hmny.io:14555
[pangaea]
bootnode = /ip4/54.86.126.90/tcp/9867/p2p/Qmdfjtk6hPoyrH1zVD9PEH4zfWLo38dP2mDvvKXfh3tnEv
bootnode = /ip4/52.40.84.2/tcp/9867/p2p/QmZJJx6AdaoEkGLrYG4JeLCKeCKDjnFz2wfHNHxAqFSGA9
shards = 4
[pangaea.shard0.rpc]
rpc = l0.pga.hmny.io:14555
rpc = s0.pga.hmny.io:14555
[pangaea.shard1.rpc]
rpc = l1.pga.hmny.io:14555
rpc = s1.pga.hmny.io:14555
[pangaea.shard2.rpc]
rpc = l2.pga.hmny.io:14555
rpc = s2.pga.hmny.io:14555
[pangaea.shard3.rpc]
rpc = l3.pga.hmny.io:14555
rpc = s3.pga.hmny.io:14555
`
)

@ -0,0 +1,465 @@
package main
import (
"flag"
"fmt"
"io/ioutil"
"math/big"
"math/rand"
"os"
"path"
"sync"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/log"
"github.com/harmony-one/harmony/accounts"
"github.com/harmony-one/harmony/accounts/keystore"
"github.com/harmony-one/harmony/api/client"
clientService "github.com/harmony-one/harmony/api/client/service"
proto_node "github.com/harmony-one/harmony/api/proto/node"
"github.com/harmony-one/harmony/common/denominations"
"github.com/harmony-one/harmony/core"
"github.com/harmony-one/harmony/core/types"
common2 "github.com/harmony-one/harmony/internal/common"
nodeconfig "github.com/harmony-one/harmony/internal/configs/node"
"github.com/harmony-one/harmony/internal/ctxerror"
"github.com/harmony-one/harmony/internal/shardchain"
"github.com/harmony-one/harmony/internal/utils"
"github.com/harmony-one/harmony/node"
"github.com/harmony-one/harmony/p2p"
p2p_host "github.com/harmony-one/harmony/p2p/host"
"github.com/harmony-one/harmony/p2p/p2pimpl"
)
var (
version string
builtBy string
builtAt string
commit string
nextNonce uint64
)
func printVersion(me string) {
fmt.Fprintf(os.Stderr, "Harmony (C) 2019. %v, version %v-%v (%v %v)\n", path.Base(me), version, commit, builtBy, builtAt)
os.Exit(0)
}
// AccountState includes the balance and nonce of an account
type AccountState struct {
balance *big.Int
nonce uint64
}
const (
rpcRetry = 3
defaultConfigFile = ".hmy/wallet.ini"
defaultProfile = "default"
keystoreDir = ".hmy/keystore"
)
var (
// Transfer subcommands
transferCommand = flag.NewFlagSet("transfer", flag.ExitOnError)
transferSenderPtr = transferCommand.String("from", "0", "Specify the sender account address or index")
transferReceiverPtr = transferCommand.String("to", "", "Specify the receiver account")
transferAmountPtr = transferCommand.Float64("amount", 0, "Specify the amount to transfer")
transferGasPricePtr = transferCommand.Uint64("gasPrice", 0, "Specify the gas price amount. Unit is Nano.")
transferShardIDPtr = transferCommand.Int("shardID", 0, "Specify the shard ID for the transfer")
transferInputDataPtr = transferCommand.String("inputData", "", "Base64-encoded input data to embed in the transaction")
transferSenderPassPtr = transferCommand.String("pass", "", "Passphrase of the sender's private key")
)
var (
walletProfile *utils.WalletProfile
ks *keystore.KeyStore
)
// setupLog setup log for verbose output
func setupLog() {
// enable logging for wallet
h := log.StreamHandler(os.Stdout, log.TerminalFormat(true))
log.Root().SetHandler(h)
}
// The main wallet program entrance. Note the this wallet program is for demo-purpose only. It does not implement
// the secure storage of keys.
func main() {
rand.Seed(int64(time.Now().Nanosecond()))
// Verify that a subcommand has been provided
// os.Arg[0] is the main command
// os.Arg[1] will be the subcommand
if len(os.Args) < 2 {
fmt.Println("Usage:")
fmt.Println(" wallet -p profile <action> <params>")
fmt.Println(" -p profile - Specify the profile of the wallet, either testnet/devnet or others configured. Default is: testnet")
fmt.Println(" The profile is in file:", defaultConfigFile)
fmt.Println()
fmt.Println("Actions:")
fmt.Println(" 1. stressTest - Stress test transactions with corner cases.")
os.Exit(1)
}
ARG:
for {
lastArg := os.Args[len(os.Args)-1]
switch lastArg {
case "--verbose":
setupLog()
os.Args = os.Args[:len(os.Args)-1]
default:
break ARG
}
}
var profile string
if os.Args[1] == "-p" {
profile = os.Args[2]
os.Args = os.Args[2:]
} else {
profile = defaultProfile
}
if len(os.Args) == 1 {
fmt.Println("Missing action")
flag.PrintDefaults()
os.Exit(1)
}
// create new keystore backend
scryptN := keystore.StandardScryptN
scryptP := keystore.StandardScryptP
ks = keystore.NewKeyStore(keystoreDir, scryptN, scryptP)
// Switch on the subcommand
switch os.Args[1] {
case "-version":
printVersion(os.Args[0])
case "stressTest":
readProfile(profile)
processStressTestCommand()
default:
fmt.Printf("Unknown action: %s\n", os.Args[1])
flag.PrintDefaults()
os.Exit(1)
}
}
//go:generate go run ../../../scripts/wallet_embed_ini_files.go
func readProfile(profile string) {
fmt.Printf("Using %s profile for wallet\n", profile)
// try to load .hmy/wallet.ini from filesystem
// use default_wallet_ini if .hmy/wallet.ini doesn't exist
var err error
var iniBytes []byte
iniBytes, err = ioutil.ReadFile(defaultConfigFile)
if err != nil {
log.Debug(fmt.Sprintf("%s doesn't exist, using default ini\n", defaultConfigFile))
iniBytes = []byte(defaultWalletIni)
}
walletProfile, err = utils.ReadWalletProfile(iniBytes, profile)
if err != nil {
fmt.Printf("Read wallet profile error: %v\nExiting ...\n", err)
os.Exit(2)
}
}
// createWalletNode creates wallet server node.
func createWalletNode() *node.Node {
bootNodeAddrs, err := utils.StringsToAddrs(walletProfile.Bootnodes)
if err != nil {
panic(err)
}
utils.BootNodes = bootNodeAddrs
shardID := 0
// dummy host for wallet
// TODO: potentially, too many dummy IP may flush out good IP address from our bootnode DHT
// we need to understand the impact to bootnode DHT with this dummy host ip added
self := p2p.Peer{IP: "127.0.0.1", Port: "6999"}
priKey, _, _ := utils.GenKeyP2P("127.0.0.1", "6999")
host, err := p2pimpl.NewHost(&self, priKey)
if err != nil {
panic(err)
}
chainDBFactory := &shardchain.MemDBFactory{}
w := node.New(host, nil, chainDBFactory, false)
w.Client = client.NewClient(w.GetHost(), uint32(shardID))
w.NodeConfig.SetRole(nodeconfig.ClientNode)
w.ServiceManagerSetup()
w.RunServices()
return w
}
// ./bin/wallet -p local transfer
// --from one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg
// --to one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj
// --amount 1 --shardID 1
func processStressTestCommand() {
/*
Account 17:
Address: one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj
Balance in Shard 0: x.xxx, nonce: 0
Balance in Shard 1: 0.0000, nonce: 0
Account 18:
Address: one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg
Balance in Shard 0: 0.0000, nonce: 0
Balance in Shard 1: x.xxx, nonce: 0
*/
fmt.Println("Creating wallet node")
walletNode := createWalletNode()
senderAddress := common2.ParseAddr("one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg")
receiverAddress := common2.ParseAddr("one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj")
shardID := 1
fmt.Printf("Sender account: %s:\n", common2.MustAddressToBech32(senderAddress))
// default inputData
data := make([]byte, 0)
gasLimit, _ := core.IntrinsicGas(data, false, true)
gasPrice := 0
gasPriceBigInt := big.NewInt(int64(gasPrice))
gasPriceBigInt = gasPriceBigInt.Mul(gasPriceBigInt, big.NewInt(denominations.Nano))
fmt.Printf("gas limit: %d, gas price: %d", gasLimit, gasPriceBigInt.Uint64())
senderPass := ""
var shardIDToAccountStateSender []*AccountState
var shardIDToAccountStateReceiver []*AccountState
var senderState *AccountState
var receiverState *AccountState
var retry uint32
for i := 0; ; i++ {
for retry = 0; retry < 10; retry++ {
shardIDToAccountStateSender = FetchBalance(senderAddress)
shardIDToAccountStateReceiver = FetchBalance(receiverAddress)
senderState = shardIDToAccountStateSender[shardID]
receiverState = shardIDToAccountStateReceiver[shardID]
if senderState.nonce == nextNonce {
break
}
time.Sleep(3 * time.Second)
fmt.Printf(".")
}
if retry == 10 {
fmt.Printf("\nRetry expired. Num txs made: %d\n", i)
break
}
nextNonce++
senderBalance := senderState.balance
receiverBalance := receiverState.balance
// amount 1/10th of the balance
amountBigInt := senderBalance.Div(senderBalance, big.NewInt(10))
fmt.Printf("\nsender: balance (shard %d: %s, nonce: %v)\n", shardID, convertBalanceIntoReadableFormat(senderBalance), senderState.nonce)
fmt.Printf("receiver balance (shard %d: %s, nonce: %v)\n", shardID, convertBalanceIntoReadableFormat(receiverBalance), receiverState.nonce)
// stop stress testing here after printing out the final balance
if i == 10 {
break
}
tx := types.NewTransaction(
senderState.nonce, receiverAddress, uint32(shardID), amountBigInt,
gasLimit, gasPriceBigInt, data)
account, _ := ks.Find(accounts.Account{Address: senderAddress})
ks.Unlock(account, senderPass)
tx, _ = ks.SignTx(account, tx, nil)
if err := submitTransaction(tx, walletNode, uint32(shardID)); err != nil {
fmt.Println(ctxerror.New("submitTransaction failed",
"tx", tx, "shardID", shardID).WithCause(err))
}
}
for shardID, balanceNonce := range FetchBalance(senderAddress) {
fmt.Printf(" Final: Balance in Shard %d: %s, nonce: %v \n", shardID, convertBalanceIntoReadableFormat(balanceNonce.balance), balanceNonce.nonce)
}
}
func convertBalanceIntoReadableFormat(balance *big.Int) string {
balance = balance.Div(balance, big.NewInt(denominations.Nano))
strBalance := fmt.Sprintf("%d", balance.Uint64())
bytes := []byte(strBalance)
hasDecimal := false
for i := 0; i < 11; i++ {
if len(bytes)-1-i < 0 {
bytes = append([]byte{'0'}, bytes...)
}
if bytes[len(bytes)-1-i] != '0' && i < 9 {
hasDecimal = true
}
if i == 9 {
newBytes := append([]byte{'.'}, bytes[len(bytes)-i:]...)
bytes = append(bytes[:len(bytes)-i], newBytes...)
}
}
zerosToRemove := 0
for i := 0; i < len(bytes); i++ {
if hasDecimal {
if bytes[len(bytes)-1-i] == '0' {
bytes = bytes[:len(bytes)-1-i]
i--
} else {
break
}
} else {
if zerosToRemove < 5 {
bytes = bytes[:len(bytes)-1-i]
i--
zerosToRemove++
} else {
break
}
}
}
return string(bytes)
}
// FetchBalance fetches account balance of specified address from the Harmony network
func FetchBalance(address common.Address) []*AccountState {
result := []*AccountState{}
for shardID := 0; shardID < walletProfile.Shards; shardID++ {
// Fill in nil pointers for each shard; nil represent failed balance fetch.
result = append(result, nil)
}
var wg sync.WaitGroup
wg.Add(walletProfile.Shards)
for shardID := 0; shardID < walletProfile.Shards; shardID++ {
go func(shardID int) {
defer wg.Done()
balance := big.NewInt(0)
var nonce uint64
result[uint32(shardID)] = &AccountState{balance, 0}
var wgShard sync.WaitGroup
wgShard.Add(len(walletProfile.RPCServer[shardID]))
var mutexAccountState = &sync.Mutex{}
for rpcServerID := 0; rpcServerID < len(walletProfile.RPCServer[shardID]); rpcServerID++ {
go func(rpcServerID int) {
for retry := 0; retry < rpcRetry; retry++ {
server := walletProfile.RPCServer[shardID][rpcServerID]
client, err := clientService.NewClient(server.IP, server.Port)
if err != nil {
continue
}
log.Debug("FetchBalance", "server", server)
response, err := client.GetBalance(address)
if err != nil {
log.Info("failed to get balance, retrying ...")
time.Sleep(200 * time.Millisecond)
continue
}
log.Debug("FetchBalance", "response", response)
respBalance := big.NewInt(0)
respBalance.SetBytes(response.Balance)
mutexAccountState.Lock()
if balance.Cmp(respBalance) < 0 {
balance.SetBytes(response.Balance)
nonce = response.Nonce
}
mutexAccountState.Unlock()
break
}
wgShard.Done()
}(rpcServerID)
}
wgShard.Wait()
result[shardID] = &AccountState{balance, nonce}
}(shardID)
}
wg.Wait()
return result
}
// GetFreeToken requests for token test token on each shard
func GetFreeToken(address common.Address) {
for i := 0; i < walletProfile.Shards; i++ {
// use the 1st server (leader) to make the getFreeToken call
server := walletProfile.RPCServer[i][0]
client, err := clientService.NewClient(server.IP, server.Port)
if err != nil {
continue
}
log.Debug("GetFreeToken", "server", server)
for retry := 0; retry < rpcRetry; retry++ {
response, err := client.GetFreeToken(address)
if err != nil {
log.Info("failed to get free token, retrying ...")
time.Sleep(200 * time.Millisecond)
continue
}
log.Debug("GetFreeToken", "response", response)
txID := common.Hash{}
txID.SetBytes(response.TxId)
fmt.Printf("Transaction Id requesting free token in shard %d: %s\n", i, txID.Hex())
break
}
}
}
// clearKeystore deletes all data in the local keystore
func clearKeystore() {
dir, err := ioutil.ReadDir(keystoreDir)
if err != nil {
panic("Failed to read keystore directory")
}
for _, d := range dir {
subdir := path.Join([]string{keystoreDir, d.Name()}...)
if err := os.RemoveAll(subdir); err != nil {
fmt.Println(ctxerror.New("cannot remove directory",
"path", subdir).WithCause(err))
}
}
fmt.Println("All existing accounts deleted...")
}
// submitTransaction submits the transaction to the Harmony network
func submitTransaction(tx *types.Transaction, walletNode *node.Node, shardID uint32) error {
msg := proto_node.ConstructTransactionListMessageAccount(types.Transactions{tx})
clientGroup := p2p.NewClientGroupIDByShardID(p2p.ShardID(shardID))
err := walletNode.GetHost().SendMessageToGroups([]p2p.GroupID{clientGroup}, p2p_host.ConstructP2pMessage(byte(0), msg))
if err != nil {
fmt.Printf("Error in SubmitTransaction: %v\n", err)
return err
}
fmt.Printf("Transaction Id for shard %d: %s\n", int(shardID), tx.Hash().Hex())
// FIXME (leo): how to we know the tx was successful sent to the network
// this is a hacky way to wait for sometime
time.Sleep(3 * time.Second)
return nil
}

@ -470,11 +470,9 @@ func main() {
currentNode.ServiceManagerSetup() currentNode.ServiceManagerSetup()
// RPC for SDK not supported for mainnet. // RPC for SDK not supported for mainnet.
if *networkType != nodeconfig.Mainnet {
if err := currentNode.StartRPC(*port); err != nil { if err := currentNode.StartRPC(*port); err != nil {
ctxerror.Warn(utils.GetLogger(), err, "StartRPC failed") ctxerror.Warn(utils.GetLogger(), err, "StartRPC failed")
} }
}
currentNode.RunServices() currentNode.RunServices()
// Run additional node collectors // Run additional node collectors

@ -105,9 +105,9 @@ func (sender *MessageSender) Retry(msgRetry *MessageRetry) {
msgRetry.retryCount++ msgRetry.retryCount++
if err := sender.host.SendMessageToGroups(msgRetry.groups, msgRetry.p2pMsg); err != nil { if err := sender.host.SendMessageToGroups(msgRetry.groups, msgRetry.p2pMsg); err != nil {
utils.GetLogInstance().Warn("[Retry] Failed re-sending consensus message", "groupID", msgRetry.groups, "blockNum", msgRetry.blockNum, "MsgType", msgRetry.msgType, "RetryCount", msgRetry.retryCount) utils.Logger().Warn().Str("groupID[0]", msgRetry.groups[0].String()).Uint64("blockNum", msgRetry.blockNum).Str("MsgType", msgRetry.msgType.String()).Int("RetryCount", msgRetry.retryCount).Msg("[Retry] Failed re-sending consensus message")
} else { } else {
utils.GetLogInstance().Info("[Retry] Successfully resent consensus message", "groupID", msgRetry.groups, "blockNum", msgRetry.blockNum, "MsgType", msgRetry.msgType, "RetryCount", msgRetry.retryCount) utils.Logger().Info().Str("groupID[0]", msgRetry.groups[0].String()).Uint64("blockNum", msgRetry.blockNum).Str("MsgType", msgRetry.msgType.String()).Int("RetryCount", msgRetry.retryCount).Msg("[Retry] Successfully resent consensus message")
} }
} }
} }

@ -19,6 +19,7 @@ package types
import ( import (
"container/heap" "container/heap"
"errors" "errors"
"fmt"
"io" "io"
"math/big" "math/big"
"sync/atomic" "sync/atomic"
@ -27,6 +28,7 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rlp"
common2 "github.com/harmony-one/harmony/internal/common"
) )
// no go:generate gencodec -type txdata -field-override txdataMarshaling -out gen_tx_json.go // no go:generate gencodec -type txdata -field-override txdataMarshaling -out gen_tx_json.go
@ -556,3 +558,30 @@ func (m Message) Data() []byte {
func (m Message) CheckNonce() bool { func (m Message) CheckNonce() bool {
return m.checkNonce return m.checkNonce
} }
// RecentTxsStats is a recent transactions stats map tracking stats like BlockTxsCounts.
type RecentTxsStats map[uint64]BlockTxsCounts
// String returns the string formatted representation of RecentTxsStats
func (rts RecentTxsStats) String() string {
ret := "{ "
for blockNum, blockTxsCounts := range rts {
ret += fmt.Sprintf("blockNum:%d=%s", blockNum, blockTxsCounts.String())
}
ret += " }"
return ret
}
// BlockTxsCounts is a transactions counts map of
// the number of transactions made by each account in a block on this node.
type BlockTxsCounts map[common.Address]uint64
// String returns the string formatted representation of BlockTxsCounts
func (btc BlockTxsCounts) String() string {
ret := "{ "
for sender, numTxs := range btc {
ret += fmt.Sprintf("%s:%d,", common2.MustAddressToBech32(sender), numTxs)
}
ret += " }"
return ret
}

@ -42,6 +42,7 @@ require (
github.com/multiformats/go-multiaddr-net v0.0.1 github.com/multiformats/go-multiaddr-net v0.0.1
github.com/natefinch/lumberjack v2.0.0+incompatible github.com/natefinch/lumberjack v2.0.0+incompatible
github.com/pborman/uuid v1.2.0 github.com/pborman/uuid v1.2.0
github.com/piotrnar/gocoin v0.0.0-20190823153405-50489650c046
github.com/pkg/errors v0.8.1 github.com/pkg/errors v0.8.1
github.com/prometheus/client_golang v0.9.2 github.com/prometheus/client_golang v0.9.2
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 // indirect github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 // indirect

@ -2,6 +2,9 @@ package shardingconfig
import ( import (
"math/big" "math/big"
"time"
"github.com/harmony-one/harmony/common/denominations"
) )
const ( const (
@ -51,6 +54,38 @@ func (s fixedSchedule) RandomnessStartingEpoch() uint64 {
return mainnetRandomnessStartingEpoch return mainnetRandomnessStartingEpoch
} }
func (s fixedSchedule) MaxTxAmountLimit() *big.Int {
amountBigInt := big.NewInt(mainnetMaxTxAmountLimit)
amountBigInt = amountBigInt.Mul(amountBigInt, big.NewInt(denominations.One))
return amountBigInt
}
func (s fixedSchedule) MaxNumRecentTxsPerAccountLimit() uint64 {
return mainnetMaxNumRecentTxsPerAccountLimit
}
func (s fixedSchedule) MaxTxPoolSizeLimit() int {
return mainnetMaxTxPoolSizeLimit
}
func (s fixedSchedule) MaxNumTxsPerBlockLimit() int {
return mainnetMaxNumTxsPerBlockLimit
}
func (s fixedSchedule) RecentTxDuration() time.Duration {
return mainnetRecentTxDuration
}
func (s fixedSchedule) TxsThrottleConfig() *TxsThrottleConfig {
return &TxsThrottleConfig{
MaxTxAmountLimit: s.MaxTxAmountLimit(),
MaxNumRecentTxsPerAccountLimit: s.MaxNumRecentTxsPerAccountLimit(),
MaxTxPoolSizeLimit: s.MaxTxPoolSizeLimit(),
MaxNumTxsPerBlockLimit: s.MaxNumTxsPerBlockLimit(),
RecentTxDuration: s.RecentTxDuration(),
}
}
// NewFixedSchedule returns a sharding configuration schedule that uses the // NewFixedSchedule returns a sharding configuration schedule that uses the
// given config instance for all epochs. Useful for testing. // given config instance for all epochs. Useful for testing.
func NewFixedSchedule(instance Instance) Schedule { func NewFixedSchedule(instance Instance) Schedule {

@ -2,7 +2,9 @@ package shardingconfig
import ( import (
"math/big" "math/big"
"time"
"github.com/harmony-one/harmony/common/denominations"
"github.com/harmony-one/harmony/internal/genesis" "github.com/harmony-one/harmony/internal/genesis"
) )
@ -24,6 +26,12 @@ const (
localnetFirstCrossLinkBlock = 3 localnetFirstCrossLinkBlock = 3
localnetRandomnessStartingEpoch = 0 localnetRandomnessStartingEpoch = 0
localnetMaxTxAmountLimit = 1e2 // unit is in One
localnetMaxNumRecentTxsPerAccountLimit = 2
localnetMaxTxPoolSizeLimit = 8000
localnetMaxNumTxsPerBlockLimit = 1000
localnetRecentTxDuration = 10 * time.Second
) )
func (localnetSchedule) InstanceForEpoch(epoch *big.Int) Instance { func (localnetSchedule) InstanceForEpoch(epoch *big.Int) Instance {
@ -37,7 +45,7 @@ func (localnetSchedule) InstanceForEpoch(epoch *big.Int) Instance {
} }
} }
func (localnetSchedule) BlocksPerEpoch() uint64 { func (ls localnetSchedule) BlocksPerEpoch() uint64 {
return twoOne return twoOne
} }
@ -82,6 +90,38 @@ func (ls localnetSchedule) RandomnessStartingEpoch() uint64 {
return localnetRandomnessStartingEpoch return localnetRandomnessStartingEpoch
} }
func (ls localnetSchedule) MaxTxAmountLimit() *big.Int {
amountBigInt := big.NewInt(localnetMaxTxAmountLimit)
amountBigInt = amountBigInt.Mul(amountBigInt, big.NewInt(denominations.One))
return amountBigInt
}
func (ls localnetSchedule) MaxNumRecentTxsPerAccountLimit() uint64 {
return localnetMaxNumRecentTxsPerAccountLimit
}
func (ls localnetSchedule) MaxTxPoolSizeLimit() int {
return localnetMaxTxPoolSizeLimit
}
func (ls localnetSchedule) MaxNumTxsPerBlockLimit() int {
return localnetMaxNumTxsPerBlockLimit
}
func (ls localnetSchedule) RecentTxDuration() time.Duration {
return localnetRecentTxDuration
}
func (ls localnetSchedule) TxsThrottleConfig() *TxsThrottleConfig {
return &TxsThrottleConfig{
MaxTxAmountLimit: ls.MaxTxAmountLimit(),
MaxNumRecentTxsPerAccountLimit: ls.MaxNumRecentTxsPerAccountLimit(),
MaxTxPoolSizeLimit: ls.MaxTxPoolSizeLimit(),
MaxNumTxsPerBlockLimit: ls.MaxNumTxsPerBlockLimit(),
RecentTxDuration: ls.RecentTxDuration(),
}
}
var localnetReshardingEpoch = []*big.Int{big.NewInt(0), big.NewInt(localnetV1Epoch), big.NewInt(localnetV2Epoch)} var localnetReshardingEpoch = []*big.Int{big.NewInt(0), big.NewInt(localnetV1Epoch), big.NewInt(localnetV2Epoch)}
var localnetV0 = MustNewInstance(2, 7, 5, genesis.LocalHarmonyAccounts, genesis.LocalFnAccounts, localnetReshardingEpoch) var localnetV0 = MustNewInstance(2, 7, 5, genesis.LocalHarmonyAccounts, genesis.LocalFnAccounts, localnetReshardingEpoch)

@ -2,7 +2,9 @@ package shardingconfig
import ( import (
"math/big" "math/big"
"time"
"github.com/harmony-one/harmony/common/denominations"
"github.com/harmony-one/harmony/internal/genesis" "github.com/harmony-one/harmony/internal/genesis"
) )
@ -22,6 +24,13 @@ const (
mainnetV0_2Epoch = 5 mainnetV0_2Epoch = 5
mainnetV0_3Epoch = 8 mainnetV0_3Epoch = 8
mainnetV0_4Epoch = 10 mainnetV0_4Epoch = 10
mainnetV1Epoch = 12
mainnetMaxTxAmountLimit = 1e3 // unit is interface{} One
mainnetMaxNumRecentTxsPerAccountLimit = 1e2
mainnetMaxTxPoolSizeLimit = 8000
mainnetMaxNumTxsPerBlockLimit = 1000
mainnetRecentTxDuration = time.Hour
) )
// MainnetSchedule is the mainnet sharding configuration schedule. // MainnetSchedule is the mainnet sharding configuration schedule.
@ -31,6 +40,9 @@ type mainnetSchedule struct{}
func (mainnetSchedule) InstanceForEpoch(epoch *big.Int) Instance { func (mainnetSchedule) InstanceForEpoch(epoch *big.Int) Instance {
switch { switch {
case epoch.Cmp(big.NewInt(mainnetV1Epoch)) >= 0:
// tenth resharding epoch around 08/16/2019 11:00pm PDT
return mainnetV1
case epoch.Cmp(big.NewInt(mainnetV0_4Epoch)) >= 0: case epoch.Cmp(big.NewInt(mainnetV0_4Epoch)) >= 0:
// tenth resharding epoch around 08/13/2019 9:00pm PDT // tenth resharding epoch around 08/13/2019 9:00pm PDT
return mainnetV0_4 return mainnetV0_4
@ -93,9 +105,43 @@ func (ms mainnetSchedule) RandomnessStartingEpoch() uint64 {
return mainnetRandomnessStartingEpoch return mainnetRandomnessStartingEpoch
} }
var mainnetReshardingEpoch = []*big.Int{big.NewInt(0), big.NewInt(mainnetV0_1Epoch), big.NewInt(mainnetV0_2Epoch), big.NewInt(mainnetV0_3Epoch), big.NewInt(mainnetV0_4Epoch)} func (ms mainnetSchedule) MaxTxAmountLimit() *big.Int {
amountBigInt := big.NewInt(mainnetMaxTxAmountLimit)
amountBigInt = amountBigInt.Mul(amountBigInt, big.NewInt(denominations.One))
return amountBigInt
}
func (ms mainnetSchedule) MaxNumRecentTxsPerAccountLimit() uint64 {
return mainnetMaxNumRecentTxsPerAccountLimit
}
func (ms mainnetSchedule) MaxTxPoolSizeLimit() int {
return mainnetMaxTxPoolSizeLimit
}
func (ms mainnetSchedule) MaxNumTxsPerBlockLimit() int {
return mainnetMaxNumTxsPerBlockLimit
}
func (ms mainnetSchedule) RecentTxDuration() time.Duration {
return mainnetRecentTxDuration
}
func (ms mainnetSchedule) TxsThrottleConfig() *TxsThrottleConfig {
return &TxsThrottleConfig{
MaxTxAmountLimit: ms.MaxTxAmountLimit(),
MaxNumRecentTxsPerAccountLimit: ms.MaxNumRecentTxsPerAccountLimit(),
MaxTxPoolSizeLimit: ms.MaxTxPoolSizeLimit(),
MaxNumTxsPerBlockLimit: ms.MaxNumTxsPerBlockLimit(),
RecentTxDuration: ms.RecentTxDuration(),
}
}
var mainnetReshardingEpoch = []*big.Int{big.NewInt(0), big.NewInt(mainnetV0_1Epoch), big.NewInt(mainnetV0_2Epoch), big.NewInt(mainnetV0_3Epoch), big.NewInt(mainnetV0_4Epoch), big.NewInt(mainnetV1Epoch)}
var mainnetV0 = MustNewInstance(4, 150, 112, genesis.HarmonyAccounts, genesis.FoundationalNodeAccounts, mainnetReshardingEpoch) var mainnetV0 = MustNewInstance(4, 150, 112, genesis.HarmonyAccounts, genesis.FoundationalNodeAccounts, mainnetReshardingEpoch)
var mainnetV0_1 = MustNewInstance(4, 152, 112, genesis.HarmonyAccounts, genesis.FoundationalNodeAccountsV0_1, mainnetReshardingEpoch) var mainnetV0_1 = MustNewInstance(4, 152, 112, genesis.HarmonyAccounts, genesis.FoundationalNodeAccountsV0_1, mainnetReshardingEpoch)
var mainnetV0_2 = MustNewInstance(4, 200, 148, genesis.HarmonyAccounts, genesis.FoundationalNodeAccountsV0_2, mainnetReshardingEpoch) var mainnetV0_2 = MustNewInstance(4, 200, 148, genesis.HarmonyAccounts, genesis.FoundationalNodeAccountsV0_2, mainnetReshardingEpoch)
var mainnetV0_3 = MustNewInstance(4, 210, 148, genesis.HarmonyAccounts, genesis.FoundationalNodeAccountsV0_3, mainnetReshardingEpoch) var mainnetV0_3 = MustNewInstance(4, 210, 148, genesis.HarmonyAccounts, genesis.FoundationalNodeAccountsV0_3, mainnetReshardingEpoch)
var mainnetV0_4 = MustNewInstance(4, 216, 148, genesis.HarmonyAccounts, genesis.FoundationalNodeAccountsV0_4, mainnetReshardingEpoch) var mainnetV0_4 = MustNewInstance(4, 216, 148, genesis.HarmonyAccounts, genesis.FoundationalNodeAccountsV0_4, mainnetReshardingEpoch)
var mainnetV1 = MustNewInstance(4, 250, 170, genesis.HarmonyAccounts, genesis.FoundationalNodeAccountsV1, mainnetReshardingEpoch)

@ -2,8 +2,10 @@ package shardingconfig
import ( import (
"math/big" "math/big"
"time"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/harmony-one/harmony/common/denominations"
"github.com/harmony-one/harmony/internal/genesis" "github.com/harmony-one/harmony/internal/genesis"
) )
@ -51,3 +53,35 @@ func (pangaeaSchedule) FirstCrossLinkBlock() uint64 {
func (pangaeaSchedule) RandomnessStartingEpoch() uint64 { func (pangaeaSchedule) RandomnessStartingEpoch() uint64 {
return mainnetRandomnessStartingEpoch return mainnetRandomnessStartingEpoch
} }
func (pangaeaSchedule) MaxTxAmountLimit() *big.Int {
amountBigInt := big.NewInt(mainnetMaxTxAmountLimit)
amountBigInt = amountBigInt.Mul(amountBigInt, big.NewInt(denominations.One))
return amountBigInt
}
func (pangaeaSchedule) MaxNumRecentTxsPerAccountLimit() uint64 {
return mainnetMaxNumRecentTxsPerAccountLimit
}
func (pangaeaSchedule) MaxTxPoolSizeLimit() int {
return mainnetMaxTxPoolSizeLimit
}
func (pangaeaSchedule) MaxNumTxsPerBlockLimit() int {
return mainnetMaxNumTxsPerBlockLimit
}
func (pangaeaSchedule) RecentTxDuration() time.Duration {
return mainnetRecentTxDuration
}
func (ps pangaeaSchedule) TxsThrottleConfig() *TxsThrottleConfig {
return &TxsThrottleConfig{
MaxTxAmountLimit: ps.MaxTxAmountLimit(),
MaxNumRecentTxsPerAccountLimit: ps.MaxNumRecentTxsPerAccountLimit(),
MaxTxPoolSizeLimit: ps.MaxTxPoolSizeLimit(),
MaxNumTxsPerBlockLimit: ps.MaxNumTxsPerBlockLimit(),
RecentTxDuration: ps.RecentTxDuration(),
}
}

@ -4,6 +4,7 @@ package shardingconfig
import ( import (
"math/big" "math/big"
"time"
"github.com/harmony-one/harmony/internal/genesis" "github.com/harmony-one/harmony/internal/genesis"
) )
@ -34,6 +35,24 @@ type Schedule interface {
// TODO: remove it after randomness feature turned on mainnet // TODO: remove it after randomness feature turned on mainnet
//RandomnessStartingEpoch returns starting epoch of randonness generation //RandomnessStartingEpoch returns starting epoch of randonness generation
RandomnessStartingEpoch() uint64 RandomnessStartingEpoch() uint64
// Max amount limit for a valid transaction
MaxTxAmountLimit() *big.Int
// Max number of transactions of a particular account per block level
MaxNumRecentTxsPerAccountLimit() uint64
// Max total number of transactions allowed as pending transactions in transaction pool
MaxTxPoolSizeLimit() int
// Max total number of transactions allowed to be processed per block
MaxNumTxsPerBlockLimit() int
// How long "recent" means for transaction in time Duration unit
RecentTxDuration() time.Duration
// configuration for throttling pending transactions
TxsThrottleConfig() *TxsThrottleConfig
} }
// Instance is one sharding configuration instance. // Instance is one sharding configuration instance.
@ -60,3 +79,45 @@ type Instance interface {
// ReshardingEpoch returns a list of Epoch while off-chain resharding happens // ReshardingEpoch returns a list of Epoch while off-chain resharding happens
ReshardingEpoch() []*big.Int ReshardingEpoch() []*big.Int
} }
// TxThrottleFlag is the throttling flag for each transaction
// Refer below enum declaration for more context.
type TxThrottleFlag int
// TxThrottleFlag is determined per transaction
// during the new block proposal and pending transactions throttling
const (
TxSelect TxThrottleFlag = iota
TxUnselect
TxInvalid
)
func (result TxThrottleFlag) String() string {
switch result {
case TxSelect:
return "TxSelect"
case TxUnselect:
return "TxUnselect"
case TxInvalid:
return "TxInvalid"
}
return "TxThrottleUnknown"
}
// TxsThrottleConfig contains configuration for throttling pending transactions per node block
type TxsThrottleConfig struct {
// Max amount limit for a valid transaction
MaxTxAmountLimit *big.Int
// Max number of transactions of a particular account for the past hour
RecentTxDuration time.Duration
// Max number of transactions of a particular account for the past hour
MaxNumRecentTxsPerAccountLimit uint64
// Max total number of transactions allowed as pending transactions in transaction pool
MaxTxPoolSizeLimit int
// Max total number of transactions allowed to be processed per block
MaxNumTxsPerBlockLimit int
}

@ -2,7 +2,9 @@ package shardingconfig
import ( import (
"math/big" "math/big"
"time"
"github.com/harmony-one/harmony/common/denominations"
"github.com/harmony-one/harmony/internal/genesis" "github.com/harmony-one/harmony/internal/genesis"
) )
@ -22,6 +24,12 @@ const (
testnetVdfDifficulty = 10000 // This takes about 20s to finish the vdf testnetVdfDifficulty = 10000 // This takes about 20s to finish the vdf
testnetFirstCrossLinkBlock = 100 testnetFirstCrossLinkBlock = 100
testnetMaxTxAmountLimit = 1e3 // unit is in One
testnetMaxNumRecentTxsPerAccountLimit = 1e2
testnetMaxTxPoolSizeLimit = 8000
testnetMaxNumTxsPerBlockLimit = 1000
testnetRecentTxDuration = time.Hour
) )
func (testnetSchedule) InstanceForEpoch(epoch *big.Int) Instance { func (testnetSchedule) InstanceForEpoch(epoch *big.Int) Instance {
@ -81,6 +89,38 @@ func (ts testnetSchedule) RandomnessStartingEpoch() uint64 {
return mainnetRandomnessStartingEpoch return mainnetRandomnessStartingEpoch
} }
func (ts testnetSchedule) MaxTxAmountLimit() *big.Int {
amountBigInt := big.NewInt(testnetMaxTxAmountLimit)
amountBigInt = amountBigInt.Mul(amountBigInt, big.NewInt(denominations.One))
return amountBigInt
}
func (ts testnetSchedule) MaxNumRecentTxsPerAccountLimit() uint64 {
return testnetMaxNumRecentTxsPerAccountLimit
}
func (ts testnetSchedule) MaxTxPoolSizeLimit() int {
return testnetMaxTxPoolSizeLimit
}
func (ts testnetSchedule) MaxNumTxsPerBlockLimit() int {
return testnetMaxNumTxsPerBlockLimit
}
func (ts testnetSchedule) RecentTxDuration() time.Duration {
return testnetRecentTxDuration
}
func (ts testnetSchedule) TxsThrottleConfig() *TxsThrottleConfig {
return &TxsThrottleConfig{
MaxTxAmountLimit: ts.MaxTxAmountLimit(),
MaxNumRecentTxsPerAccountLimit: ts.MaxNumRecentTxsPerAccountLimit(),
MaxTxPoolSizeLimit: ts.MaxTxPoolSizeLimit(),
MaxNumTxsPerBlockLimit: ts.MaxNumTxsPerBlockLimit(),
RecentTxDuration: ts.RecentTxDuration(),
}
}
var testnetReshardingEpoch = []*big.Int{big.NewInt(0), big.NewInt(testnetV1Epoch), big.NewInt(testnetV2Epoch)} var testnetReshardingEpoch = []*big.Int{big.NewInt(0), big.NewInt(testnetV1Epoch), big.NewInt(testnetV2Epoch)}
var testnetV0 = MustNewInstance(2, 150, 150, genesis.TNHarmonyAccounts, genesis.TNFoundationalAccounts, testnetReshardingEpoch) var testnetV0 = MustNewInstance(2, 150, 150, genesis.TNHarmonyAccounts, genesis.TNFoundationalAccounts, testnetReshardingEpoch)

@ -1059,3 +1059,327 @@ var FoundationalNodeAccountsV0_4 = []DeployAccount{
{Index: "270", Address: "one1n0q9vc37g9h6hjplkjjnll7uxz59mnceml67g4", BlsPublicKey: "fa656869591dd33dfb8c395a70303b82e8eefd19f535ce1ea71a9a2e68a74a1e0c8a203f65fd1452c579e7ffed238603"}, {Index: "270", Address: "one1n0q9vc37g9h6hjplkjjnll7uxz59mnceml67g4", BlsPublicKey: "fa656869591dd33dfb8c395a70303b82e8eefd19f535ce1ea71a9a2e68a74a1e0c8a203f65fd1452c579e7ffed238603"},
{Index: "271", Address: "one1lp4spvwyfk9xpnwvn6wk6s49edmysgwmkdy4tj", BlsPublicKey: "9bc2c7dc0ad6c6f0294a615018b386ce2c863a62e96de0f6000f6c05f307eeafb07e2a2b68c69e09367831f42171e589"}, {Index: "271", Address: "one1lp4spvwyfk9xpnwvn6wk6s49edmysgwmkdy4tj", BlsPublicKey: "9bc2c7dc0ad6c6f0294a615018b386ce2c863a62e96de0f6000f6c05f307eeafb07e2a2b68c69e09367831f42171e589"},
} }
// FoundationalNodeAccountsV1 are the accounts for the foundational nodes from Epoch 12.
var FoundationalNodeAccountsV1 = []DeployAccount{
{Index: "0", Address: "one1y0xcf40fg65n2ehm8fx5vda4thrkymhpg45ecj", BlsPublicKey: "9e70e8d76851f6e8dc648255acdd57bb5c49cdae7571aed43f86e9f140a6343caed2ffa860919d03e0912411fee4850a"},
{Index: "1", Address: "one18lp2w7ghhuajdpzl8zqeddza97u92wtkfcwpjk", BlsPublicKey: "fce3097d9fc234d34d6eaef3eecd0365d435d1118f69f2da1ed2a69ba725270771572e40347c222aca784cb973307b11"},
{Index: "2", Address: "one1tqa46jj9ut8zu20jm3kqv3f5fwkeq964t496mx", BlsPublicKey: "edb61007e99af30191098f2cd6f787e2f53fb595bf63fcb4d31a386e7070f7a4fdcefd3e896080a665dc19fecbafc306"},
{Index: "3", Address: "one19y2r8ykaztka3z8ndea0a2afd5kgswyfeahsmf", BlsPublicKey: "475b5c3bbbda60cd92951e44bbea2aac63f1b774652d6bbec86aaed0dabd10a46717e98763d559b63bc4f1bfbde66908"},
{Index: "4", Address: "one16jvl43d059a4wpderqu82wlm7t3qzw8yta3wgn", BlsPublicKey: "f7af1b02f35cdfb3ef2ac7cdccb87cf20f5411922170e4e191d57d6d1f52901a7c6e363d266a1c86bb1aef651bd1ae96"},
{Index: "5", Address: "one1kyyt7j29h4uhtnuhfar5wmngntx4gterrkd8q9", BlsPublicKey: "f400d1caa1f40a14d870640c50d895205014f5b54c3aa9661579b937ea5bcc2f159b9bbb8075b516628f545af822180f"},
{Index: "6", Address: "one10ap00fxkdupc0tnh5gvaqapw3fcxyvw2d22tlx", BlsPublicKey: "bfa025fd7799315e528be8a985d1ab4a90506fca94db7e1f88d29d0f8e8221af742a0f8e9f7f9fbe71c1beca2a6c9690"},
{Index: "7", Address: "one129s9f828f538jrjca2wwlwphsl5k8rlzjdeacq", BlsPublicKey: "eb4d1c141fc6319f32710212b78b88a045ce95437025bfca56ec399cdcd469d1c49081025f859e09b35249cf2cc6bf06"},
{Index: "8", Address: "one19jtrujyvqdvdn9wm9tne5d4vrwvy36y69msczs", BlsPublicKey: "bbd0b173ace9f35c22eb80fe4673497f55c7039f089a3444a329f760f0d4a335927bb7d94a70b817c405351570f3d411"},
{Index: "9", Address: "one180mfv4dneefp9g74duxhspjvkmcjffstd0sj6q", BlsPublicKey: "714fb47f27b4d300320e06e37e973e0a9cfa647f7bdb915262d7fe500252a777f37d8d358dc07b27c7eef88a7521ad06"},
{Index: "10", Address: "one1nvu626slwt6hwq2cup846nepcl2apuhk38gl3j", BlsPublicKey: "663f82d48ff61d09bb215836f853e838df7da62aa90344dcf7950c18378dae909895c0c179c2dd71ea77fa747af53106"},
{Index: "11", Address: "one16y3pzva57c65wwfpwr7ve63q67aztedsphv069", BlsPublicKey: "1e9f5f68845634efca8a64e8ffcf90d63ec196f28fb64f688fb88b868728ab562b702af8414f48c5d045e94433ec5a87"},
{Index: "12", Address: "one14uzsrvucmxx5wwkx46r9a6mpqgtjlrchelw5pp", BlsPublicKey: "43b1376eff41dfdccaeb601edc09b4353e5abd343a90740ecb3f9aac882321361e01267ffd2a0e2115755b5148b1f115"},
{Index: "13", Address: "one1pmcysk3kctszln8n89hzcrgmncnqcdxg6nl2gg", BlsPublicKey: "43f5ed2b60cb88c64dc16c4c3527943eb92a15f75967cf37ef3a9a8171da5a59685c198c981a9fd471ffc299fe699887"},
{Index: "14", Address: "one12z5xslc3654gxs6eh3x5seanhv976dnhvuetsu", BlsPublicKey: "b01f1752fdbe3d21cc9cf9dc3d1a781b216fae48d34a4c3866e36cc686c4d955f66d9bd0bd608ccb3b54565c9125fc12"},
{Index: "15", Address: "one13hrrej58t6kn3k24fwuhzudy7x9tayh8p73cq9", BlsPublicKey: "23ab4b6415a53e3ac398b53e9df5376f28c024e3d300fa9a6ed8c3c867929c43e81f978f8ba02bacd5f956dc2d3a6399"},
{Index: "16", Address: "one1c4w9danpa5v9zqurnl07lkqdcwyn3yfm86anqu", BlsPublicKey: "817d92d1141cf3dee3dd9b522752f4e515fa3d487dd4627951ba3e47a2a2704d1499912b1783cd544cfcdef3abd41b13"},
{Index: "17", Address: "one17nfgz8rtgpl3nlws5q9tdk9y3puyqf847az6ne", BlsPublicKey: "a32c1ba4c89ce5efe3d5756952489f7050bb1123fe38776168b349c01d15813520f87741a24bdba4372caa71096fb308"},
{Index: "18", Address: "one16f3f9y4sqtrk3eq7gnagr4ac8p25rf08u0pxxp", BlsPublicKey: "bde72966189e7377a4f08fff82058fcc508ce1f7778e89c3dab42064bc489e0966c6371f4b1a1857cfea19667346b010"},
{Index: "19", Address: "one1s7s40ku4ms63066h34xwmm5j5k4jwk74gml5nx", BlsPublicKey: "9b58fac96afe10ad8832c1752ef35c7169826aeb05505e25002320e63e6200a9c9bc10233a9a258797084122d4b2a411"},
{Index: "20", Address: "one1gqdnwl6zmn9avnaksqv2555x388nr792v7gzjr", BlsPublicKey: "491d1db6085e08146127635098f45c6dca7be7a5f4a27d5f404bc7064acebaa3518c2dbb7f5b43ae1dc63385c449d00d"},
{Index: "21", Address: "one1zgmd5s6fyv9rm2vuf3augqf3ucnp9a2j0h09u3", BlsPublicKey: "15efd5a3af35b9fca2b0e7264b585b47b0f08d9658ac11df3ee5237be634d2fbfa610bf9bd8eef5fecb38828e250340d"},
{Index: "22", Address: "one10dw0xnkm6qvpmsmeszw5wn29et9jmek9sc6dmw", BlsPublicKey: "3f9c6d55095433092416ed39bcac4fb1c7aee67f7b658c09266201a094708f7101ae8dfdddca13ed3021ca798f731992"},
{Index: "23", Address: "one1ldthk5zyrea6w60rptcfyzlftd8fsn9fhkeps7", BlsPublicKey: "e4727b3185b807983d2775983f5a6c269736b7000ff6ff4435354473ff0539707ff4584f5b2b7fb1f7275271e34ac88c"},
{Index: "24", Address: "one17nacqwrnwgq7pk8eehn7j6jphxt0draqpkztpf", BlsPublicKey: "249b2776b64f0fb04fb76f184da218541b727970e9ae3b79e1dd0ed673567a5fd8c4870cf604eb14c5a004972d5f5f13"},
{Index: "25", Address: "one1sedghemtml7xad54fdvglvch29ajv85qe2td4l", BlsPublicKey: "9b93fb2a6c33e28593760e73bacaa3aa14cc4836cdd2a274cf68b31809a756922c2fae184d5eb7795c374272daca4b16"},
{Index: "26", Address: "one1mk6g87mtgcyy95xp0v87q0srggmusp950gpn3w", BlsPublicKey: "325c13b66bb05cbd7ec95d78e754cde2afdfef83490253ba96a64b3be73fb862bab57dadd42816462a0aafa48fa08d06"},
{Index: "27", Address: "one16295hjtqyr0z22swaqthv7mvmvn2gltnj5gera", BlsPublicKey: "fca5bb8c78055a4927bb3b8e60917e87dffd00d5f4a818111113c6ddff4e4af69f0d878a49c8f39c0842c15b40d0d603"},
{Index: "28", Address: "one1q563tnpv4tnh7l30p2wy3gnu3akhd6va97w7ku", BlsPublicKey: "4cb81c627f179a67085ed9fc80f851ea357debad60ebaaca7e8e091a54efd1ca5849094524aa55527b0c173530b1c392"},
{Index: "29", Address: "one1y7fs65ul4zc33d2502ql6nxs7r7jj4grs5x3y9", BlsPublicKey: "847ba7e5422187c2c0e594efa31840d117641d9a156ffc076d9194ab71f7ce95b59f2c00a822312da60f39f2d6437583"},
{Index: "30", Address: "one149aw0kne2qwyxkxhz9v0msgf00lndvvdjne4rq", BlsPublicKey: "00508bf582665b3c75442231397f061ac3b9fedc5edc3343a465d9153ea7eca5ed97c33c097ac7a75533a420149dc492"},
{Index: "31", Address: "one1grt0frrmy7a8239sg3tygh83nd5q74yymq2ljh", BlsPublicKey: "7e86af118409e2677ab7c3043cd383e98a8ae27bf711eaa57782f7e8e9df5499085dc5ae3e7acc0c4cb362dc6005ab81"},
{Index: "32", Address: "one1zzhwus03x3j3fgtust0v07k7rf583rrp84zdet", BlsPublicKey: "7f01b62e63b020c1406558153393f346230e7a87d4921bc756bc08e49b88f749b45bb624dbe79e4d95bd83bfbdac6605"},
{Index: "33", Address: "one1sp687xe0kk93ngp8kaxa2qd8yjm56wjmup8mf5", BlsPublicKey: "c48e26ce1e845cfbb032fc08b91cbcb7caa8cfae8f28db54e71271cd53423a37eed40e75884c21cf1b47636fdf77058b"},
{Index: "34", Address: "one1ksqcladc3r5s90v494h9tfwdhkx88tq6j549f6", BlsPublicKey: "286c00f71145c770f2c791492b3f26f7150ff2362780755530539c02c9115de76503ad367ab981065d3c7aa658140b18"},
{Index: "35", Address: "one1a37yjkrxdzwkkl3ntkqsv305grcklpksxkwsrq", BlsPublicKey: "afe3e92e45d8e49b8b90957cd8cd6f312d0588d823d761ea2ef0248c9baebdcede4565054a56483edca065c0e72b5d16"},
{Index: "36", Address: "one1c0aau6shrtxqgenpf5ymtrspxpvw0sxj0c7hrq", BlsPublicKey: "ec2fa7a80bb5643958765cc4285eafced0c7be0b7b5543454554f764e187d63ff7952be490428974b8c81cc90db44899"},
{Index: "37", Address: "one1w2m2al52exugww4c2nn0fl2gqx3lfvhsq3x4k3", BlsPublicKey: "6558c3beb184401ba26e00cb10d09a01ead04581c86074a596d0c80cc2ef05c9fbfbb6068ea1f556345e6cb39e2cbb8e"},
{Index: "38", Address: "one1zvaqqafg0nvmxtsvzkqalc3lz378qw5j6ysz5l", BlsPublicKey: "829246b61310fc6d48de362ba51c85764b0e4e594f38fb21fa14df203dbabcbc1c45e2c53d5d06677a1d6dce3cdcb282"},
{Index: "39", Address: "one1z39jl5tgz3e3ra6fkru4wdnyvakrx0323zyr8v", BlsPublicKey: "0e8ce22d33fd39b74e6ebe72f037dd575d82d779a339557369fc65eec6db2dd14c1989ba786f5e6fbd13b9aa5eaea903"},
{Index: "40", Address: "one1sgcpjc405ueglhp5udsskjxcn8crrc2lmuf35c", BlsPublicKey: "dc9e4e6c9e4782012ccf628e3d3e7c1763ba2f78de99b98b89fac63b1f4375e288d5e155e9ee64fe126f78ce0088db10"},
{Index: "41", Address: "one1teymhzlyuxv73hw78gy7vlfuyv3e4stvsmer5l", BlsPublicKey: "6b3469bfd08d2a690f731f97d679e15ff565d4f2911f5875f058062239109ba1e3c5a73bfb21b034db9b28ae3f564001"},
{Index: "42", Address: "one1dsgmswzkspx3at5gywltd97sj45lapaqmk0hzw", BlsPublicKey: "934fe59ff2fd6cb296885e35d7e722a8c4da27a65a8b81bc73d82fca822f3a2c35ad6b7b5f70f6992f1f92d5d6bbad8f"},
{Index: "43", Address: "one17y8k8adagmzc6t54xrnl3jmtgvmdqh2wzexn3x", BlsPublicKey: "31c2be76384a46b596943d5071300d18f1e3ca3cc4418557cbe7645f141d163a448e750f876ace5663ac5cc8dca2e78e"},
{Index: "44", Address: "one108uwrdejhf3es7rn6h4cdjqnvnpv75pp7t5ne9", BlsPublicKey: "c541fa6d4d97bcae0e502d5dbe64ba9d2b6b28fc8cf498728ab249d9c9efaa5148eb91b0d9827d7effeb36720f0ab813"},
{Index: "45", Address: "one1u33urreh2uquc562geg34q374l2clqammt6fpr", BlsPublicKey: "cfdeaa5af9c2d0b489b6d27505a773259d8835ac8c22ff4562162927b789721094347882a5dbe83d50d583da5931ed0c"},
{Index: "46", Address: "one12zelq8ax3k48tfzl5zz37ndknremq6um62dwxa", BlsPublicKey: "0171f68b35f45281222ff9008d40301d20fb5c328fd8126cf24f50f15b879b818c14b4f98b58ad7864cb75509993190b"},
{Index: "47", Address: "one1df4tldae3amrkyrf96tg9pqccjvkjetattl4w8", BlsPublicKey: "3fc212e1bb7594018c0882d2aa1818e9401209f8e41cdee613fd6bec096872d55c01ea02e091063f6ce49dbca49b3f14"},
{Index: "48", Address: "one1yeay879a7dln5ltnchytx8eennpz332qn7yjx3", BlsPublicKey: "ad94bb49728b51a77b8912e70e260b37b8dab638988ead18413f772546944e2b42370e570cc1e01a862de82c1e7b0081"},
{Index: "49", Address: "one1tqwwn2rh58fjafysl9rgpxjgjz8wdjmqgdwlv3", BlsPublicKey: "7534285f7b04f505ff327e592370b6687d9dcc18e6fdd29bd97b54fdb13139113d715e76982fd9594ca876ecfd50fa11"},
{Index: "50", Address: "one15n4k4d7cw5wyyf3pt3fnwuvcweuxmmq0knpnyh", BlsPublicKey: "04bd80917f8a95b5074eeb3e413f810585eed1974057080d7f1422928113d3cb8a36d6d8e665dae71148a28d74d59b95"},
{Index: "51", Address: "one18ky073zdrrmme3fs7h63wyzguuj6a3uukuc3gk", BlsPublicKey: "457e99a40be9356c4acc53f02de4480927e0c6c0733087a46f53b59744affb2776700625370c09bf4e778e715a5f6e8a"},
{Index: "52", Address: "one1a4nhuqsa7d2znx8yq7tsuyf86v6tuq597y925l", BlsPublicKey: "7f24f0c9af2239090e6ae593d665589651f4d8c4f5bf8ad40537ea8d3e912da82588ea3b505991b2aa96057015d1458d"},
{Index: "53", Address: "one12tthayx2u7g262afmcfca29ktnx9aajjd8uj5j", BlsPublicKey: "bf1899cd9eab89216cbaed1d126f8b2f6b482132787f0d34020cfe8fdf0af8aff2c38b9848c3726745bbdeebd7d6bf96"},
{Index: "54", Address: "one1c6m2w8t0p3de3cjleu2t2duvspas6366jtf8da", BlsPublicKey: "47ab7b7cbbc5b95ddab000c5d2643aaf9f916d776bd4adb05e509add43d54579f69e3e5898df5dd15a4332112c1b3d87"},
{Index: "55", Address: "one1y5686zfh8vnygxglrhztahh7hcn2tvk33vsgrt", BlsPublicKey: "ed59468d36e33f0e2cd21951c55e41420a6736d23ef013eb3a39f6b4a9290c6353c0a3ea996bc5ae65bd4a5776f76c96"},
{Index: "56", Address: "one15u2v6f56pj3rzvwge4dwl3ylg5zh3395nzj57y", BlsPublicKey: "43b6dd212b5ec9aa1c8055653813f7d0edbeb4ac8e1b679246efcfd709965df0ab6537c791423ec14a5f05a47cbd110d"},
{Index: "57", Address: "one1s3typcymaa5dgvfu68jw0hufl7vyu0hd3hscku", BlsPublicKey: "d8bcb7ef85977e33f429374b68ac7e8b1d9296b82a074aec212ba570cfa0a5489df9c020f941039ad48497adc7833a96"},
{Index: "58", Address: "one1qcecvkv9w77rfz75t0s7x8xpgtw0nwve2vk2sv", BlsPublicKey: "d12e2b82d430ff6ce19651363bc29e438169ed1cd481adccdc0a82b74e789e18f330b7be9c1e399cce30506ec726c80f"},
{Index: "59", Address: "one14tdlgysvnqcdgwnduttd0y5pp2y7m8cpss30j4", BlsPublicKey: "4ce4d4c2f2a4e115d5c2253a4d5d17c8fb4a585280eda890983309595b2bbb596ec71284105c67618f1fb2e7f7cb6f84"},
{Index: "60", Address: "one12vyznqd6lz6wwr9gkvd6q5zy9sswx792dh2eyv", BlsPublicKey: "90afed6000f27a5c47f04bf072efc3a7e75a6f75993c91a56a29d3c367f0952d97620fecd06c879c13d1068d62128506"},
{Index: "61", Address: "one1fdtcrkpkhm2ppnu05zmddgqvledqh7g6r2tgdy", BlsPublicKey: "493fb42bd1fa4c0e01e88002d2a0a1f443cbc9e7ea17536e8a83ae5c911530b2534d00b1d681e253318be7e1fab1f193"},
{Index: "62", Address: "one1s4rypls26kmzg03dxkklmpwhmv8u4nlh6vqkdv", BlsPublicKey: "0d42e7e1c9ef4c1425bbc767b172154ea3e3d630b23b7a92d5cbceeaed3652e9c3ff2779bdce5bb85f1d328458b80117"},
{Index: "63", Address: "one1uhqaf9jgeczmuxs7ydzfeevwnt63ftps752cnr", BlsPublicKey: "9c99088bf4e3d367183036041a32e534c2e045d9af2d4d9591252a74ab38b878d89f2863a1f5934501a8e9cb82b08b07"},
{Index: "64", Address: "one1khuc8sclm8lr09e0r64kf3jjt684leggzp22h4", BlsPublicKey: "3af05ef78a3e2b4ef4f2726284705300b88066f350506027ed853dd96a270671b46cd4b0ec675f8c9ebcacac7f99b984"},
{Index: "65", Address: "one1ee39d33k3ns8wpjae6kdm46620m0v2djhacas0", BlsPublicKey: "514b80600fd2b70fa83dd0a49b526289acee59d95ebcc50e87e05acb690821da064e43c9664683b519352861852de401"},
{Index: "66", Address: "one1yqu97zy04zy0cu6mr2gddvs94d4j2zums7ttvt", BlsPublicKey: "0a551033f14306b088545b07ee0f8919b6bbe41d1fe220dc37749b8fdc71ae01dc520f786c8dd3af4bc9cf1fc4b4168f"},
{Index: "67", Address: "one1lhyk86r4a2v7gd8yhq2m0k9l2pk64y3z75zx8r", BlsPublicKey: "6bf1696e1fb4c52710a42ced76e0deb458a92d1539efc4632f88f51aa882d9685ea154d126fdaa375add29a90ebc4c87"},
{Index: "68", Address: "one1xhwspfzgv3vh5fp9hxwngv8tvdj2qr338lmavw", BlsPublicKey: "014d802636d36a50a687512b4f81f4d93324518c8099884b90e5467fa3d7f7fd52ed2e65892db70edf6df4a30530a78e"},
{Index: "69", Address: "one19verfm5jyu9ys6s4nrzm6a8888kzdlvmqpenh4", BlsPublicKey: "7fb7ccadd6fa57a04fa49e6128063fc003dfc543688a1dcb15546ffe9e180467f85f0b3aa0382472f27a2e0db050ed09"},
{Index: "70", Address: "one19qy96szsrhuyjfrqgr4gzhaaw8cgct7ym83wy3", BlsPublicKey: "9c3012f2cc4f8db309ce046663f546cf72d92d8d539b27759decbb57ab6c49f2049725fc9d4c80de0108a9ac50b67b17"},
{Index: "71", Address: "one17tka7fdf9s95c597e2petfrqtnylcksvnuelzz", BlsPublicKey: "14552cf51cdac18b399590bf3266a0032719f4a3e86a4cd31bb80eed2b016dfaac19aaa3694c06f428d30fe771dc6385"},
{Index: "72", Address: "one1juqumez0qr2jwacj7vvvf79t2pnmnr24nw3cec", BlsPublicKey: "1b808984cd5580e7393b77b3927d5ca6a8b3ca80f68a7d4dbd517e95309f8fae25dc237229cd755b13b7605f873eeb0b"},
{Index: "73", Address: "one12lecjc8a3sk35hyc5dg7te2q2cakt24d6lj2p4", BlsPublicKey: "713d612ce8932081fa4d88f898db96d33d683a4f3a93c5d8aa608b8dcc64b753b57775dab9b360d2bf0ce0c3a2b0bd86"},
{Index: "74", Address: "one1780wg58e86rs38we6ze2ts930s0qmmu40vmzya", BlsPublicKey: "109c9d8364b1634802b53be754a5faea7c6f5655f0990de979038462ada5cbef325c36032e6673d30c3349936b0bce18"},
{Index: "75", Address: "one1r9hjnk6zmnkageyvvsypcw2p675x7qrurjeaan", BlsPublicKey: "3f74037361a915ad7718d96e225e4803c9b8a31bc287f246d6eb84328c5bb63ccf32975644d6a74b3820d3dc7811e592"},
{Index: "76", Address: "one1mgwlvj9uq365vvndqh0nwrkqac7cgep2pcn6zl", BlsPublicKey: "ca5b587ecbc68c1f9af60dc6452f98705073029c27422a37898dacc3451594dcd2da7b75d62a387e3520240ae46e130e"},
{Index: "77", Address: "one1xsf70cu7uuu5k6f0kpxp9at8r4dmg0sttzx40t", BlsPublicKey: "577bac828dacca2acf29f8d38365a5af015b88298482c38f09ccde44f3c1a2d7011f710c4a7fe450d8b5d4e7a6950a05"},
{Index: "78", Address: "one1df49l0afjgltkaheussp8e7y708ac9zuyfpfle", BlsPublicKey: "e1febbaf5af29b651662f1f2ff2af2ef9e3d9ca324c9c8526f3486a148293fd5d4b591b63f1912422a4ea162758eed12"},
{Index: "79", Address: "one1kq0xzzzlrpkzslwfesrgmp5e7umuxl3m3dgk27", BlsPublicKey: "7df3e402538cd967ac002d9140167fe2c70f591b487235e5b1929ef128cf93174545d663b1d73923acefc6c629368484"},
{Index: "80", Address: "one16m5r7awa4y2z2cyage4cns4uejxx8rn0gw77ug", BlsPublicKey: "056f7e81e119f343ff72223955f7c007ffeff58dbb6e67bdb99d8c187068eda288b7dfec63dd7dae5546d9da3b89af84"},
{Index: "81", Address: "one1ha85rtgc4u96v4v9nwam5qhchswx8d579dw0sl", BlsPublicKey: "5655e508219092659e9440a642f58f3476a09539b552dd7d5d5fa4f1fbae006347ad7a3ff3ba59d3996a724822ca0e87"},
{Index: "82", Address: "one10hzlc82dhc35nz75srutrhqkk7vvvyjnewclt7", BlsPublicKey: "bf3d3bfc8e90d4622eaf52a0d9b3d8803821ea7eb638453cc151f05d6ddee552486b52ddd001d0180ef3374b6ddc1086"},
{Index: "83", Address: "one10z5d98vpm5pvzw32vpma3p70vcdk0ckq0znapk", BlsPublicKey: "8fcd36c080db9b9168d5f3e6b6854546544f62fd0b224c79c1e12e3b93674bec513cd5fc1e9748690e0e5d14a9066c86"},
{Index: "84", Address: "one12saruhnv9f63dqhuadjq3vhqm3nwyw2ac40uyz", BlsPublicKey: "b443ad07d019e1ab4c1cf8d18d493f34003a6e22d28b79218ed77d072925deb852bf74488bff67ca0126738aaf58e08e"},
{Index: "85", Address: "one1zfare9m39n3m4h5sj6rpfdkatzheww3zs8ctwg", BlsPublicKey: "56d2e4fd4f3702dba733b02657e660edbfd759cb4adb04f262dcddf72ce2b57873e7c1ddca82619731d7a1a99503c383"},
{Index: "86", Address: "one1cxc5j0ygyrkq4lsvln3amdu3ys239jqzk56ykc", BlsPublicKey: "3a28937b75ecc10393aa125e6680e0c83763ef9671949162c86ea6e7d1dde5cce7eebcc03d6ff73d535d1db208f68e8f"},
{Index: "87", Address: "one1mr3mt2ra8mwpr55uv3ymv0lmdy2s0w4m5nt0jh", BlsPublicKey: "9bffcf238da1966163905e83b8b9b4193fc0a0408091347f3618d652f67ce5d40991381f96e85782ad94c705177c3082"},
{Index: "88", Address: "one1gemlvpun4528ajv7pcn2d9fufzcv80kjt3dxwg", BlsPublicKey: "ed5560d677881b6da88b81f00c7d50619d2d73323dad581d50074a7dd95d4ad373c8ec7ec2e42b922ffaa5d12da4820e"},
{Index: "89", Address: "one1pnjl29uv2avuv5ts9nejwecc5em37yu92vllqn", BlsPublicKey: "6c7b993ef4c28d1c9533942fe7391a7ec21f861d154346512691c14c5b1d250fb425607a903aa5bf6d14980ae877820a"},
{Index: "90", Address: "one1nhu8np4ztt3f5xpxt4rznshhc7amm5p7fsf3xe", BlsPublicKey: "7bb5a343a82999be275df2fe2a46f1670c762b5719fabaedae3e52ed02f22f5b51e224aa048c72d8164736e21dec6d15"},
{Index: "91", Address: "one1lg5nes6j2gy5tkhexhc0zs98uay9ddj05tdpq9", BlsPublicKey: "1b4097c857ce4f6e22c649cd19b5b3e145c4b7fff45be2399465a16ee9d2e396bbc1342e74e8349ed22407c735e0ff95"},
{Index: "92", Address: "one1mzlm2tt9uhas0qnk86nwxqfuhvjnh5349pf23z", BlsPublicKey: "7b6bbfa895e0a5fbff75be2f34fad079fcc6e1a8c6574d4dbd92179d17e31c3eb8934841ebfffc84f93b3d2804217a8b"},
{Index: "93", Address: "one1ymudu3v8f8uv3gvzr7p6n0z0wyvsqkls6mhef0", BlsPublicKey: "b85cae0c69bba7715d5e06d9499802aad9d7bab8e1906ad1dd77ff2868539283799e482479d14195df8da8fea1ddaf01"},
{Index: "94", Address: "one1nek27yzpawmqyw5lpm5tshcruz3c08sum5eke3", BlsPublicKey: "79845e1c32e40bf15fdbba4d4c2b3464faa5bf570c17404ec1424e620ce8dd1fa823e8f4778221e36c72a7b90231f992"},
{Index: "95", Address: "one1trghegqlxyvkq8suavy6tmhfppcdg4rng3xlct", BlsPublicKey: "75d444674de15cc92180fbe2ae5d41a8d43b157c838ceb5d9da881b5ecdac41940e2cd5c4e01b60b83b78cb50b1b5210"},
{Index: "96", Address: "one1mna6y63xwzh5zaajsj42trrn9tgkqcwa2gaszs", BlsPublicKey: "f28fb1c2cb46870629665e46dc2e439a5c3e1129077bd28449c6093e88353d6e58b668525e8173f60847475bbb436e13"},
{Index: "97", Address: "one1madlfrpp4t7z8mgk86smfqnvcssfvclzszscg0", BlsPublicKey: "c11fe53327a8d6e5453351e519504a3f02685b5b50903fe018e8d26ca79ba49e08eb5e7fd8955170fbabce0db5860819"},
{Index: "98", Address: "one15pgqyp9lshxg5p0ssxsw7fjgy4mj83q95yzc9j", BlsPublicKey: "3636afc78c42eaef5db14e31e593761f7dbf6118e9e2b9d36063d90302946480c63f7407f02e6804fa2b515c3cd58284"},
{Index: "99", Address: "one1528xlrfresl7wl2nr37kp0tnlr7hr3w8u5y4dp", BlsPublicKey: "91058b91d14936926f279a407dcb679f8756a51b3ca68cfed10c2c67aad13d1dc4bce417cd8a6553d7343bc0aed5ef02"},
{Index: "100", Address: "one1284fqe06amt67j6cwrj6c2yrcjudeq0uygjyq3", BlsPublicKey: "2eb142677d24082e1435ac54dee102c9fc9d897c2f87ad9f99a88cac93445be8cc295c6b2ac34c196cd9b6f1b376d711"},
{Index: "101", Address: "one1ughluft6keduyy8v8nhczkyfmcc2qhe9wxpmrz", BlsPublicKey: "edde5546ec7c94a212068f4d5e6e8008e0ee6701e510517a4185b1a9831a8a0cdf05309f550c0907cbd644e3ded9a787"},
{Index: "102", Address: "one1yshyk4y59na2lzscgpmw4jqgtjpl33vrpnukep", BlsPublicKey: "1946a9915ee84d29b57261ce4fdf8c8be580a07ae76a055cce1a53dcbba2134912497d5e0b2320d60068522404b0f296"},
{Index: "103", Address: "one160wta3dr4jt85d70ct7psuumduf8yayysnq5j3", BlsPublicKey: "7e07a606ca551ec57af30a661f277ad7f1205425a79ab5fe2f8a6a92a6f7e6fc9aa4f6cffc2c8b89eca30b74da522994"},
{Index: "104", Address: "one1y469t49t34c7sylrd9pthfam6xmlz5p3zh2zdj", BlsPublicKey: "effc27695b63bdf62d46f83bc145ad491c893697513cbe25ca86927e8fb846657423e269727aa7bea36d8ffb66ae0d17"},
{Index: "105", Address: "one1vme5xkhn8mtff325jz0frcy8k5zru88zz75gn5", BlsPublicKey: "d95ac66d3fe763baa607d6828e75107947d8152c21eb58d877163b8d4902cb62e0d984dfb13547d717bd1fdc46c0f419"},
{Index: "106", Address: "one1c2rtqwsqs65cput3q9yaejp3dxjwct207we9hm", BlsPublicKey: "c3b34279c80884c5f5a3d7bc31478f63960a0d1900622fe0912c9bc547d8bb0fa7964fe698a1bffef67749ca995e9084"},
{Index: "107", Address: "one12l30mhevl4q3wqde2jm28fp8jqxqmjhxrn5asq", BlsPublicKey: "06b6c68c089e74a991df62ad727969ad2e5e1fc6beb2c2e15f0685ff59b9b1be94bf267790613e706c941d54fa96f790"},
{Index: "108", Address: "one17ffl9csu7ln3jw07fcvlmh2h8e5pv3ddk9p5sv", BlsPublicKey: "eea71fd6de285a1031f67fd63774eff75b7803be888de7eb64b9a325c0b8543101d91cfac04f0d6f61ee6102350f9c89"},
{Index: "109", Address: "one1flv4r3udp08az7axdcz9me50kr2r4z65c8s39m", BlsPublicKey: "306a3077bc5dc0914a1a08451e6d68072e5ac25cb9be3f4a272f9870614d36f5e96a02e6e571248abb2f174a144f3989"},
{Index: "110", Address: "one198azjqrgmnj3nzrau8r67n8c74ggrh7nys0p88", BlsPublicKey: "b7bd649d63c4a3605cc8e00347c02c9f466f717a3e5bbe0fd60aa79aa675f3df9592c661cfb9bcb2f3ec802523d52f0f"},
{Index: "111", Address: "one1tl3alzt8a82n86uzeedrjn8tmxwh9mf3xmw04t", BlsPublicKey: "552361fb9aa9c5fed72ec9a4ba7816e3665a2b7a73cc26e215f745fdb61d5344fcf99a95c68a5031e024c1bad7b2150f"},
{Index: "112", Address: "one1nlptlw8srthgljachm4w5rgv8ulvkt3cgk4uqq", BlsPublicKey: "4669655c95a53997e01f176f8f5fd6038f324aab149f5cd5aa16da4e2400df7eea6d9a69ce6c2c1a4f2e879a0f9c2484"},
{Index: "113", Address: "one1dmh3frumlx4xrwymfdx5g7an8nrm4jjc0msgfm", BlsPublicKey: "5ea1739b1aca48023edfb21f66e8a1cd794b82446eb2d38a54b12c1aaf9e100b795f46c964a756dd938850fcce3e1894"},
{Index: "114", Address: "one135mn6c90n0kd4247cramqxgeqqx5hvp506g3vd", BlsPublicKey: "8ec82c7446879630891855345bd3ea5f16cc6cd6e7425ffbe6c7037fab0c9c9be7688b6fe2ef593c4cc94a24b8a3b999"},
{Index: "115", Address: "one14ajehwyxpzpzxhke77mhtt0z6k5z6cevgf6rfa", BlsPublicKey: "52ba9ca9d046ac237214e81438b054d42b17c16654b041562723d8e6e928f92a83e6373da28a821d285ebfe118e81884"},
{Index: "116", Address: "one1hxqhp9tls9r4v5hz208g93exhvz5ak258ut7d2", BlsPublicKey: "95bad32a857901a2eecf20aa516a6fc0c21d85015ba0dc70a966f0bd70b0f3bc0f5af356fac630ef53e5e1a329d7fe0a"},
{Index: "117", Address: "one1wt5darzj8wd385xl8stccj4sv6553hgckaypfr", BlsPublicKey: "9622f8a5590d6ef8ca94e6c866d663aa0398caf00a88b2dd059dc7a63daa8600828a85737eca4e595caa382b5d407205"},
{Index: "118", Address: "one19rcnp7l258uevu2h8vcraklt7uw38l4w0ll88z", BlsPublicKey: "c2ca2a4b66130f04b7f924c9000316e02afb9e334242aacbd4514442cfbe9c904c4c54491c19da71730a1d0c29920003"},
{Index: "119", Address: "one1kwqkyzq2pmhvufe9528g9nd966ur54v6auzruf", BlsPublicKey: "aaac4eb8260e6cee7f19fbcae721ce2d68f125461953a583adca44407194452e7ac41de0757e2921c8fed83469172f92"},
{Index: "120", Address: "one1kykp8kzgmrkvhsz60t4yx8a06s44wt6jvpuuzg", BlsPublicKey: "85d0761a56dd18a67ee71e38ff949d93301467e5fbf9ab3fcb6875a6778341b271ae6acfc94d3046f454aeda138a1b89"},
{Index: "121", Address: "one1zcgx6pncyxrv6t7cza0f6r0e0pnp0gqd6knvcw", BlsPublicKey: "f1787fff85d1d5a6d458e768b425d2d9a9aec09ad8ddd020fd7d2f275970a8bef1f9a0c4a705e8f8b8734f9daf39d604"},
{Index: "122", Address: "one1vhqp3g7epjzvemr2w6rc4xglen53vwlnkdpgzy", BlsPublicKey: "cfd385fd66adc6a39cf1f1e27c7b6f0a8edfa2e2475e9389b4fa6b74373949933185c956899bad3c134e2331ce039f11"},
{Index: "123", Address: "one18xnzxwn5hwuuh229cuv7mr0hnjcvgru7qt2wdv", BlsPublicKey: "83426cbc962bc18900540a3f886486f35c17d182f2e13c06a23d3242c5ca50138aa98ac842d2a3d03d8a273a8329ac82"},
{Index: "124", Address: "one1efat5elqnvttf7gm86q9kmt48z69njax464rhv", BlsPublicKey: "2066a0b39474b9cdaec88bb94953219a2690e1dd6008bb6dc31c7f76c08a9db54758ff3aaed3249fcb0029dfc1e92995"},
{Index: "125", Address: "one1jqzm93lcjyyxdg8tad53gksly4ym5fvx3zpkw2", BlsPublicKey: "7ecf7f3d263a3201f2726706a98c979046906d3fd157b2f25ec2056770006172ed7f1987226cb28bfa0941f2b9697387"},
{Index: "126", Address: "one1kgehgr6z0aqc43g9uqla3xnenv29kvua90pmns", BlsPublicKey: "5d4394251062f2b6da56087ce64a8cf6ae06e8563a7554315bedc3bcc0400de464a68215d104c7fc6be7e844bef2b888"},
{Index: "127", Address: "one18r7axamzxgn57s9xcsvhevv58ukxrhsrfug6vg", BlsPublicKey: "17cd5fbf29ff9d1e21fc0f1b22be0dbaa9b05b49e011cbedceb6584153669e1318c052d431d9e3faec82fff823a0fb90"},
{Index: "128", Address: "one1w3pvyg56gal0ajef487944gzjkg6sv68j26pey", BlsPublicKey: "dc2f315a1dbe67ed3cfd8925fbfed964203c11e5c77112643d53b51e3c23135c695d218233c8a6cccea4a5032488d28c"},
{Index: "129", Address: "one1hrdt5e5lepygmj2vfthjzauuc9085lpnfjhha4", BlsPublicKey: "c6404146b9655332ff5e2ad4877c2689658bb037e7da9a4114806a2ba8b1c9bd0af8062e4cba22e68466336f3dba6a0e"},
{Index: "130", Address: "one17kjexl6hyh0evgt7en7q04m9q7lwgym5grs9q7", BlsPublicKey: "6c793f4a4d09ac07fe6b8fb7fcc4796b08c37994f9b5ec3a68e30ff48c32bd3fed1e358fced864558054f5e11f7e1398"},
{Index: "131", Address: "one12kdc0fqxne5f3394wrwadxq9yfaquyxgtaed3q", BlsPublicKey: "826f98d1f8ce8751dac0441888f4b4f1190ec90691d5e40110c39068d0f95ea9cca8efe23d0f7a865bd9ed37ebf38d12"},
{Index: "132", Address: "one1h2dynptqmtgdfg9fgpd8dvmv8scupkgtzapx4l", BlsPublicKey: "814843ee8475adb2245027e9531e036c4135cf25a1051d5ea97f9f9cea506503e4a83a49bea1ee40e5b9a9c5f55f8014"},
{Index: "133", Address: "one1l4yrxjz8ugwjdcxrm5snwgmgk8few9v2q2xv8h", BlsPublicKey: "aa37a8ad8fb42a5b1413be9ae5b053e7a47d2f36a11a1e7ba74c4b338919c9c76eca3a6332c06fbbd161a6aef20e9a0b"},
{Index: "134", Address: "one1qndvm7y956s00ewfmtt6vf5qpzl7f3pa3q4lsa", BlsPublicKey: "4566f15e6616b56b1c5c877846def0f20c4a60e3f13710a9c021f54a63af68330fbcf870c9c4bc12251522d77b1d6219"},
{Index: "135", Address: "one173275rcmnj8q2yxcqpwc8383hqmzudmxltu3fg", BlsPublicKey: "17cbb66d2ca63f15e9d808b0dcdeb8c612c36107d401d0797a70627935239b4117718349cb3a977e47078b19bbba9892"},
{Index: "136", Address: "one1jqr79m3dyzrar5ng5zwmvrycz08mrxtj508kyz", BlsPublicKey: "06e44c46a1be20eacf21c36993f31eac57b393ce7fca8edcb535d17134d88b6b04a32d538a601392807dbf78cc517989"},
{Index: "137", Address: "one1gct963u6x83dfp5quehzvuwcmhpgnamhemkvq4", BlsPublicKey: "c20abcb18d6ea49c40a70591de6b6622d0f74161eadb64765a2aaabaaa887e631a54affe5a4fdf7458c9d4b3bd99da03"},
{Index: "138", Address: "one1cx5dtllm52wrur463t04szxqc6mpjdn0u8h4qt", BlsPublicKey: "1f53d21ef9baec26bd484ee8e17f852df71c6bf7f3313a99c9882d553f0c1361bda7af2415caf62d0c7566750ed7bc8e"},
{Index: "139", Address: "one13k023waf63pep2pkltdqrjlgl02s2e0lctkfwp", BlsPublicKey: "d0e950a7e952f0c100f0ac9ee1232a33b1eb579ab975ca3be9f442f33845e6c4e028998fc07c492c5558c966b0752c92"},
{Index: "140", Address: "one1p3u89p0p4nxaj5sdcx0s20g5u9a3xjccjmfwuu", BlsPublicKey: "1484952d700eeddecbcc5093e38628e7f342b1974d411858b21ab5eeddd3411c185b38a22537b95a3c29bcbd7124d383"},
{Index: "141", Address: "one1ljvq9tkvfp583zzl85mgjh3qjvjufnuwmn7krv", BlsPublicKey: "37644619ae24ffa2ab63dde85f8116effddaa500c6e28c57a5f100cb8a97262ed97f671d903a9c32a53301eec1100b96"},
{Index: "142", Address: "one12c23ekslj469g0g0tu9jcvecfkla7rahmrhe37", BlsPublicKey: "19101de3d0578c3146a1904f25a3344a998dcb0a18433dc5cc977d05f378676b0652b4a64fa8dff6c819cfd52dc94c14"},
{Index: "143", Address: "one19l9equxmql4jkcah8g4f6qva732npajarffj6q", BlsPublicKey: "f531f442dc19d2967fbcdcab68e77b16bc49cd05698ed8a56b39f3704315915c2b2b0175be6982be7238290b3504d487"},
{Index: "144", Address: "one1nq5dglmw0vunsa34mve8sdyrkhfd0373v4xgtv", BlsPublicKey: "a48d7cd3f3004cf2cecd4d4eba14d257da046f13ff461fedc2c3daaf725776e9a96ef38098a9a04f968f9c2287fc220d"},
{Index: "145", Address: "one1qmgqawpflw4pu9ytryz69mrk0mhhsswdmjgfrj", BlsPublicKey: "013116498f069ab0b1e3bb1043e45283c9fb8641eed8470d77d59bc8a42fca53ce6d3714ceb5c37aa71e3d1839b25690"},
{Index: "146", Address: "one1h7c7pgwnht4nns40k6swdzwy8xn9uvl0e65e49", BlsPublicKey: "05f9655186ef16363e2ae14629bc0fef17781bac5eed7875e3b442e57e45340115f6d087035f626a84832479c9a54a03"},
{Index: "147", Address: "one1cwzleselrsq3x76vjzy7u65a9tqmsrcne2w83h", BlsPublicKey: "783841b0eaea497e2f894d482b6bde16b96359cb837a9f7dc3bf89abcb45b75e8ea597d60d2e89775c6fb37164fa3694"},
{Index: "148", Address: "one1kkcw2y5d9w9celf0vu025hflyxu33gekmntx9u", BlsPublicKey: "b12b30b10c9b002ec0832d061025b99a695052800ebf642299fd439be505322208543566efda12b524b284ce5ea06510"},
{Index: "149", Address: "one16xzyq2zarperhxjzmk8dyp629v4vugdkzfx7r2", BlsPublicKey: "4ff265748fbc2e3f99e95fc2e1818d02a38bcb72e95efa8ffb50820919f543f98705b330522d51e5272a5427e98ad38b"},
{Index: "150", Address: "one175jcxcdk2xlmccndr2mux3c8se8gsmddesg5ed", BlsPublicKey: "74a8762803bfbe8893540480cc9f789914b56f86a1458c38d5bf1b6737cd149a28f761bec95f3e9cf4095fb55a6e7294"},
{Index: "151", Address: "one1lmqycl6wezcdf7nqxj34slstamt0hlhp4s0rj4", BlsPublicKey: "764cec13fff061afecd226e167ac0452e2f16e5e8faa9c2152ba060243e6c29220850c9acae6f13612c842d277d5118b"},
{Index: "152", Address: "one1w7ly3zmxn2qe65hddqk9tepgt7nnypn52ua7fg", BlsPublicKey: "9f93417f500c8791a890880b45b040792648806280cac3d67b7445f74817e60eff803dbc68b4bda38ebbb376d54a3d00"},
{Index: "153", Address: "one1nv4auwyhu7nnkcgwk4dx8z3lqt9xqvp6vw57p8", BlsPublicKey: "d9565fbcbf88929df0dc8a8b143a0172a4a038f90edc1cf91711d152b5f7fb626a1c9a9ce40d40e54a443f08cc991818"},
{Index: "154", Address: "one1wnhm4jaq96gzk7xa0ch9alrez3lm3zuu3qaxfg", BlsPublicKey: "b506426b514ee39d3c4746cce5de4720411151cf65d50106b5bd90d50fe2099bd924967517dfa0c08871fa83ba581b00"},
{Index: "155", Address: "one10uyfuzaztcccz97w29v0k64rzmhj4k862kfh5q", BlsPublicKey: "e75e5a222bd9e9004385d593194606f48b3e6bf8a95c68830ea1cd8f56bbcdedcb680c9598c66230ea0c2b79a6c58296"},
{Index: "156", Address: "one1s3dx73sa5dzrksmds5recptale8pxsa4d4hzt4", BlsPublicKey: "87d4f6c37073a108b94a6e7799f62b2051c44892328bdcb8e5dd4f4596b1ba2952947c744b5daf183e9f8361282c9101"},
{Index: "157", Address: "one1vfglvsfuk52025r5apqlfaqky37462tsdjeemf", BlsPublicKey: "6d320742fbff3aa1877aadb9316a865edbdecb0fb74fc973272d73ec1deaff131b653c3ab7a2b26753c717347f450a00"},
{Index: "158", Address: "one1pjn8zz5av5ddenaxmu6qrs38lxuapygkeatxga", BlsPublicKey: "71c907378831009328f28db0e324848767b58e49eae1f2774e81276e25732bfea5ed8a567fed15afb010be05b9732b16"},
{Index: "159", Address: "one1fzh923dkauvyye7w68nc38j2dw54gldu5mheaz", BlsPublicKey: "b5c94a5071f942c77f3599098430b8f2dbd6da70c5ef830192bdef5638908cd1fa188059d7aecc8b721116b946c4cc8e"},
{Index: "160", Address: "one1hdxnmfgkxtlmrym9ljjw2dpweke85pheu8g8zl", BlsPublicKey: "95f9d0f1a688b9c4d2a9d876580f7920625f0859846711203fb4f0f364290895daab76557d09f4acb6d3b562eed00782"},
{Index: "161", Address: "one1d0k2x6ue6yd0pvuumxgxjk3qqfjpn08mu7r253", BlsPublicKey: "254772532f47cd28c0ed95986c678e589661de36eeef7502c57a95f753e1c0c1ea6348f6f19e10729faf31ae37fe1a0c"},
{Index: "162", Address: "one10j0tswg6x4udqafvsetjj3fl0g4e52spwp0wsh", BlsPublicKey: "289eb7f7c6b601dc83534734f500365f4fcf2189a5813b806b9ef6a777183c697d5fb22c07a26d19b63f1e10fa88e50c"},
{Index: "163", Address: "one15fswyv4znc8mw5dqutgssdj35ut2ghpg0wqg7p", BlsPublicKey: "4f5e3f01edbfc48e6260a8557f2bafd7bdfe76e727055110882ccadbcbba2ddd96a7f4008f576c94977e488c35086c18"},
{Index: "164", Address: "one1txjkm9v7avmpy4u9ugktwwt4tkkfz2r40v6v7a", BlsPublicKey: "998bb2fc775f08bc748acded8f2b331edf3d01da8d7bf5f1c6cc7bb8afb3bd384bb2fb40351c245ba7b5027c2f1c0608"},
{Index: "165", Address: "one10jkak35au0w9lmsqvjvpnx7t0qc6svklup48k3", BlsPublicKey: "1acf941d944db3f7410f4bf4f2d541e17d50bfde0f853ddcb2630b7ecf701c7be454ec6577aabe9320e2a8524cc60715"},
{Index: "166", Address: "one1zy628rt2d87nlad0dlvlzrnnqsv5cnt4uaa05m", BlsPublicKey: "898c9ec1fa5073e96ff71b66a5353eb2d9bbbaf103adeac5625ccae8cc926e99165ca2afed4f22065e8becf7b012f20f"},
{Index: "167", Address: "one1zefrcfgjuaqxggql0syz28cq40cy6ujwq6zmpx", BlsPublicKey: "6510d39a8db76f952c9dfa34b16cd1324877dabef2f441095c8b1f9809b884c4628b16363349871350d4422f4c61bf0c"},
{Index: "168", Address: "one1ngc83stdm7k7n4qlrzjzfk7xxput48gtvcj32q", BlsPublicKey: "33edded01b9afe97e890954dc0d564774eb65079bf319e0ab203cb0b1ed13554d557d2eb366cedadeadec173f46db68a"},
{Index: "169", Address: "one1m3jm7rxkxl3l4wdtlsz9hlqlqk7ytzp7ah7sxy", BlsPublicKey: "bbcccc9f75cbf76929091ee7b932cac76ad1cff05b2b010ef52e38d5df139f66bc04af6e3533723288e666d77b325905"},
{Index: "170", Address: "one12cycytj72gkrz6pt9sdhwx5l3cy8lydvp0xqkw", BlsPublicKey: "d07e5071d585cc120676ecb8f7efadaf5e4ae8452ddc1adde720319be1b9e0c08674c78387d6a99846cde0fd3b6dd802"},
{Index: "171", Address: "one1jhjt9fgk00f34v34pm7vmlfjqx2what2y7txge", BlsPublicKey: "037ebb312f6b971708b522b5a83c142f88c1cf833f7d8a8726cea8fdeddf0e204b8cb01744abfdf674cfa6ab3b188b12"},
{Index: "172", Address: "one16ru662mq0yh6lup030g09kwwy7g8yfcxc5fcfp", BlsPublicKey: "d35d26c704c0094abf6c1b19e1d6ea6021eb20bf347e9c20ff5a710bde93e9d41977ba6eb5191809758cceff59132508"},
{Index: "173", Address: "one1hch48y73sra2g0fr8waaglgv2gmr3634s7dh7y", BlsPublicKey: "ac165755e0416a46446345a899c6253ba79ed40e03cd8dfcc6249381ae3cf8eee03ba78f54e8e79188e4c9b520f83987"},
{Index: "174", Address: "one1aha9g2d6scsyktjgx7wm9jwssxjp6lrtl8959z", BlsPublicKey: "80e43b7381b0d2405b44a6a6293a5174fe4ef3e32b26a10c4af20e213d6ae17d778eb54e7129f5ac69343eac40fc1b95"},
{Index: "175", Address: "one1x8fhymx4xsygy4dju9ea9vhs3vqg0u3ht0nz74", BlsPublicKey: "f82d30adadabaaaeba00406a5d607134343888dccf4fc45bdc22f02ad10df3ddeed1656a2a253262dae92095297e3f84"},
{Index: "176", Address: "one1737c59mjlcrzswzw79w65xxjg7tm5pyn6jwsju", BlsPublicKey: "eb7e503cf67f6817b92abafcdd3b6276d67f2a0c8f83c56a8b5de93836d2c1197ce150d70f2f31db2bf2e35bec2d4603"},
{Index: "177", Address: "one1cz4vfaf2j99h759c69l74yk4wfk6mxzrkg49su", BlsPublicKey: "0e079c8d8ce3369cd252ffd8b7ce06fbd8f607bfccd3ef91f9cf4868c0fa7785e84e8f1f666a72321f938c2d30482e8a"},
{Index: "178", Address: "one1spnnh4excv6uvwzx8mj64w6n8wt2k6z9ndphsg", BlsPublicKey: "733c974600c08a368c634aaf4044feacb8dd274e2dce08e1a9c9490dded88129b52609d0e7113ca9736b82387f710004"},
{Index: "179", Address: "one18275j9m2q377cpgkwkea838cdva2p6a4837xlw", BlsPublicKey: "0c9b550925208cdf1a6d916579e96f485a14bd5bcbba23e0b719adb68a0062de96755d5fe8a47669eac60ce3fbb1e606"},
{Index: "180", Address: "one1myf9fq6lt4f0lc5nfuuhe3kjlr3fn93xy26xer", BlsPublicKey: "6689f75ae2a7afb458af4505516f1656e99e0356b7c06cd8b8854f3bf0ffcf350c572cf6b5c4614865ea626c8a22c70c"},
{Index: "181", Address: "one1c336y6s99zudg637tdlrnd4amlcd6c8s00pcrf", BlsPublicKey: "cd25ebf073520521577f009c1efdcaee10bc890040df9f9c53ee4f8882821b27c15cefbff00cace98e1d6d13070a1196"},
{Index: "182", Address: "one1k57u35ycut268vdn054tf3h24pewc0e6yz9tej", BlsPublicKey: "23f983c8ea8467040f63a53f1f262a871956c510dc6b2484ccee57552dea27a211f3ba4a3050baf35957e2d380096484"},
{Index: "183", Address: "one1933f2dpa5a7ezh2q6ul5nakd26tynn4l75pt6h", BlsPublicKey: "7fa5a39d171f5ceb2c58571731d6273e55420722984caaf17607a6ebdc18e32350406f5e537474a26cb31b9c97504a04"},
{Index: "184", Address: "one1wrvlznh27fywscexnc2l9fxk5gjelcqdnw8pvw", BlsPublicKey: "84b6b842abc1c28aa505f22ac553443f919ff742f1b6cc2c1b9ab07518a649dafc4d5e1360ee20462168753361569293"},
{Index: "185", Address: "one1v6e7uc4jwamdcjw43042jt5fw5ck5mxzt8c4wx", BlsPublicKey: "eb0f1af6910302340af0c20f05c08654131bf7eb0e8118548e7dfe25cc2991d953bbe8ace2786f5aed77484ee0adeb95"},
{Index: "186", Address: "one1q50h43adwq85nd28pq5yhw3sjlcd63x6urhmnh", BlsPublicKey: "c9e1ff04c12679c5315d960ecd5c1ced35616381c33ab8bb612eb78088c601295535a2f43140d647e6d9095b6ef60380"},
{Index: "187", Address: "one1hyqkrvkad8kpttpglrl42rcthd6h0uqg2etgf4", BlsPublicKey: "1bc81f9fd333524032c5a8fbbd976b00ba8d5e0e2efe60fd8336abbaec1b5744ecef07b242efddf09bd42dbcbd2f5795"},
{Index: "188", Address: "one12xfkkmqm7cnv52tml8vpdawvax0kr8f4wrlp96", BlsPublicKey: "64745645766808aeee7eb00081d6d11119dcd3a925255960faccc0c6d22f17b6fd0814c061dd3ab39b5877df119f6711"},
{Index: "189", Address: "one1yuqws7le57naq90w2z42k3undccy8nh7wdmuhz", BlsPublicKey: "2611e59381f2f117746ea12cea76a09ba5895bc503d4bc5561b546d673ccc4fff854aea26e9c43c3682444c25396490a"},
{Index: "190", Address: "one19us7lt0ee7t2t2vy55ss7xnet6wx3myuny565q", BlsPublicKey: "1afea99e56b80d68ee8c7b4ddb3d7b6144dda350c90f8b11c0acb6d404a651fe8a562467f74fa60aee83c9a9b8a3de8e"},
{Index: "191", Address: "one13fnskkve55zhqr3nwrmxp2f8yxyjxagpwhf7xh", BlsPublicKey: "42d5aeaa2e9913cd54c95882e5343d8b1b15314dd2baa694fa77b79ec52727d98f602906e115a872a446f110797bdd90"},
{Index: "192", Address: "one1fuhwmxdr4zulfm0lxndp7lgrstrmfpdam0w7x9", BlsPublicKey: "d0e5396e4eca701674e30acedb7ae2cf440fd429a17a08439946c711cb52fea53557f92230833b7ff5e96f297e9b368b"},
{Index: "193", Address: "one19jk2rkkww7seu0prw58khw0whn73r2em47d8z9", BlsPublicKey: "c803c57b1f3b834adfe73a92d3ae3b4fb1f70902b1a955f4c75b685322e14013b3d67d77b6a47621c84c0b94cb299b18"},
{Index: "194", Address: "one15vkywmeq9l0hx93zvgrdd58nyvd9yjd7l3myyx", BlsPublicKey: "0bfc81ad64427416b0495179a8744b0303e32e90d649e9db02c9c5df6ff647df9b377c82feaba8bf935b71c846be8b13"},
{Index: "195", Address: "one127p7l3xcsslutld9d3pmj44vkza6048dtev2vj", BlsPublicKey: "3b7b6a3246c956f98af384820bf451b65b9e8770319cf7d7c37958a0f678682f47dcd9a120a27405a41e2d9186cf7886"},
{Index: "196", Address: "one1nvct6um8vz698pz7rjqe7m2gcqezqek3h7dc6c", BlsPublicKey: "1c9c46000feb86456fe349fc355d9a6e70a0d125292deafd5490543df0789b07b4de420c5774f35a3115dbf7fe184383"},
{Index: "197", Address: "one137x3qnxekuew5v74myypk4pjr3cuzldg639n4k", BlsPublicKey: "23cc21507963af79a385dcf4fdc915330eaea4b8e4346d53292b06fc5de5d886ed87d8aa2d0ef36703b40276d2404114"},
{Index: "198", Address: "one1jd3v62xz8syc0c466vcrq9q5ylxt8pkzzptkxn", BlsPublicKey: "cc0fbd9bee704cb4c4117a1dd2ffb6e0f541a174e520eca7f101a6e8fcd231095e6779f59948db95efbb9cbb65647411"},
{Index: "199", Address: "one13hd3zyl0jhupv6uv7lv9lcsa9ggp5l24kzdgqs", BlsPublicKey: "0d7b8e7234d46191aa27e26399c4ffb515b31d8d828f8647fca43019d02a64ad857761504454e326938192a2c65dd311"},
{Index: "200", Address: "one1kua9tettjz0rpmp3977rhgrslw4gvm6mxw2ttl", BlsPublicKey: "91bb550fc173ecfd7af89bf292446f17cb2984c1c6f24e058ef5f9729a6a135f539489e8a068a7b1d9aa2525d87cb080"},
{Index: "201", Address: "one1fgsn4xrhtq4ljfd394gesj4aj6pkkf0lsytmnn", BlsPublicKey: "11e163fab1c890a81d224dc9d462d56b0cef5cd1645d2edd848067ff34f480b02ac8c920c4646618f235a7e3f9bdc505"},
{Index: "202", Address: "one1g6l7xj9w8z3uxjud8da69twzvyccqam6k5xymd", BlsPublicKey: "a11451a324fffc50f33e934bcee1bd673b7e285c24817285cea8207212aad9951aa9b6c40a5b78a7fea7ed047c48d188"},
{Index: "203", Address: "one1l476nnnhekrnnk5m78k8jr9uxvh6y4ql7xq9fq", BlsPublicKey: "4fd4f3a680528b60f6de7d944febe5426485f0ca0816a7c44fe3355bef2f48519f75235f42732678b2a5fab860e67304"},
{Index: "204", Address: "one134phdwr88wnpadw4x8p7r972f7wkqerd7kwxg9", BlsPublicKey: "7a37baf96f89557f4157d206af89ac343b17df147e44d6d94b76637ba16668854205a639f39d2c7f51b8d1e26205b296"},
{Index: "205", Address: "one1qfs3q0mwzmg3dsyzc6vf2telzx54t0t3zlc8a7", BlsPublicKey: "b3edc1d8778cae41255c06f2425347c7230de80e5f6a3b9e46a28a5223fb36d3fa6433cb5d589ee990ab73db3ea8a419"},
{Index: "206", Address: "one1kgu8jl9vtff4yklvxspg4whjwdvkqsx50zwy6g", BlsPublicKey: "94c13845fa5fb93967e1f4485255993e42cddc6cef75bd5709af76275fd9a6d6fc4e062a9f4d2b776348794fc25a2408"},
{Index: "207", Address: "one1zr57fc7txdwvcwd6w2rn4yg6tdy0j0tjhvyj8f", BlsPublicKey: "76ac6c7d29e5e47874619816d6a441645adb0138bd02aa71d5b654cfeb9bdc1d4dd66d4e493100d48aeb558824d63408"},
{Index: "208", Address: "one1p6gqsxydrjdflw9ynksvale8dtzdj5neskyw20", BlsPublicKey: "e95026c93df171841e10d764127f8d8c391165b714566641a3aba2ec8c68ce31678e3616c1e2de181479949b209b0915"},
{Index: "209", Address: "one1chd2m6tgk3ppx562wt6me7ke8uk2fe5uw4zsk5", BlsPublicKey: "6d463c9ec25b8a90e2df2d8f491f731353f3fdee8320c46934e073687ab596eedfd75a4fe961b7e3edbb61d717694688"},
{Index: "210", Address: "one1f6duu3nl6xrjvux0wdecp4xxngn3s0w0hf8n4m", BlsPublicKey: "12e3c3331c568209b4b74dcb7862c0798612afbbe5528ea08944b5e4d13246f2885828c4989ef8191b131bd16d51f98e"},
{Index: "211", Address: "one1jgmygypu7098eeukg68v7hqcm49pgg36jmm76g", BlsPublicKey: "5ce144deecfb6239d51fbf085b9c981b109c28a683872b0ffa1add7701bb587b05b337067b484d6201d846ea496d5d08"},
{Index: "212", Address: "one1fl6y26c9f2hpj7q5sywfjph6z75ch74z0xx033", BlsPublicKey: "e39f7c79edff73d1dad9a443a3cf4f7b8e17157f22ff232545c563ebcb833738ade2e9074a19ead4c81c06b15993cd00"},
{Index: "213", Address: "one14qfvtjw8ftfuv2hlajxtejvejhu9w8qxw74hwq", BlsPublicKey: "a4c095fbc8dcbf183a9703b4d2311b219a5ac3c7864b7f972869b3c8c925de442d7c5b7138ec32b4de7b214eec00bc84"},
{Index: "214", Address: "one1mfdr8jl85rv6cslc5kkrvh738pqfw74hgvdla7", BlsPublicKey: "a64c38240813e1b3db0bebba228ce1bc724b55d2e07c94294beb62af425edaa56400c8c650b8c5466fbbb25be1a05500"},
{Index: "215", Address: "one1trlcqr4lmc0vsttw6vnltq9cvdx8xs99zltqzt", BlsPublicKey: "2721514a6dd8c48c7c1d5920a65e00eaa85d4062087fd001d0fd73258d485b7f422180970524764d6d185d71e63eb592"},
{Index: "216", Address: "one194ff64hex7sagaedfsct7qtgqpf8f2zp3lql2f", BlsPublicKey: "662b3dca17c55134d5b27727c6ec0f9fa53215f746c8bb71db2a909e8751438c8ecf118cd9f860bfce514caf94cf510a"},
{Index: "217", Address: "one1w0leg0cqmy29duerq7u8qdjtzucl3p007tuqms", BlsPublicKey: "ead2f1e354057aa8386186755576854bf9c960050ad1578b13d68ac04923396e22e88d193e42e06413f8db18d8a1be87"},
{Index: "218", Address: "one1rn35jk07e4sy8nqet46wpkd5spsl3hdyed5na0", BlsPublicKey: "53d36996dae36b90d3bcb7e666752917091d8e637d7c0b81077edbdd26a40aa1c02e7f3f0e8fae9f6eb63a12b4dfa50e"},
{Index: "219", Address: "one1d2xqazxgcv05y9fgnmpz5u0vcqdp0zja9vq7dm", BlsPublicKey: "1f02bed5077cb1b1d7afb468d26104265b60efd2cf60c85e5c74dfb077862b09aade08b4377cb8ad03e6fe74891da289"},
{Index: "220", Address: "one1yqtjyle3f9xq3602cqp70zlrvp4swkt6ca3ach", BlsPublicKey: "88269fc4a28733d428ce393e94d9772cf7331817477bd507bb266962f1293a4d5cd16d166967693d610af628b1178917"},
{Index: "221", Address: "one1fa4qz0t90jtey9v60hqyvknavty3upt9rt2cj6", BlsPublicKey: "cb610cbd62a499ea3e91ced5a151d0121ba140517a796daa2d184526d564c93a68becc5b37c3f499beb6a460420ba507"},
{Index: "222", Address: "one1jhqwxlduf0zscrsh3jcw9a7myswxld6acwgllu", BlsPublicKey: "88e4aa7392f80f863807d6bd7aad4bf6b3246f21a6a27241e2160d8126c9bbb785e6070e3936743942bcd5a7d67be307"},
{Index: "223", Address: "one19yh7lug7x76xtyvhqqlz0yahh3fz7vhlj50s2j", BlsPublicKey: "99a7932b86a4ae54b21818373e31e83e890ebc2863d92ff0af37eb79153101e1dbec38a9ad20d6fc733d203898f07086"},
{Index: "224", Address: "one13rnn8uawlpqpcsh0hpm2k26xxusq639wkvl7r5", BlsPublicKey: "64393fd2e257d318ae55685edfed3285a4ef3280749a63e95833e79fac608bcba83332328057a83ddc7206848769e103"},
{Index: "225", Address: "one1kcyh7s00kr3ncf4splpy8gygethp0h4a4hlrf7", BlsPublicKey: "68075ac169e0bcb74a3f4c9bba7dbb76fe7393d2b4b0113e619fa1921115d297cc4feb1c47f0d6192e4379773afffe11"},
{Index: "226", Address: "one1tgcmx89hq37pqenjc22lmr0pvn42c9vw7j9ar4", BlsPublicKey: "16c037570a76e08b6f8b65a493083952daf3892956cece41ce63c385c53167c2c95b29bb8835781e0c619f25ef31de04"},
{Index: "227", Address: "one17v78jnvt8wwawtulx59a9zc3awjyuvujlm333q", BlsPublicKey: "a74c8999cb6b006688f89f22deb77ed252ecf4dea429e3b9398f50eeae00115bed82302867b2b0697e3aaae37a6ca208"},
{Index: "228", Address: "one1s4604lg40q9tvzaaf3wp9rtr3txzl2796p6dgf", BlsPublicKey: "97462122cbc981bdf5de852a7a36f36cabda6444dcd03bb7278f2e88c602adf7e764299312732ff9b464c29970131b07"},
{Index: "229", Address: "one1tuqpwd2jmhjkjpm55gux3cq622utskh9cljlxx", BlsPublicKey: "120d55b6f6e6d213ce6f69fe05c40bd00b48610f8a37914840f8f54690bb19b69d5ed3075f17d93af50f0c4de4759688"},
{Index: "230", Address: "one1249g9d04pkuxe2u620pnukl3ktfp2fnnywcs3t", BlsPublicKey: "bdefadfda6fc32f8b1436dda647f806b79688301561f2eb39a477383cdcdebb86946de0e4896ee2e01bc6a57db277e05"},
{Index: "231", Address: "one1v3m4hzwapym7sjr0q7xvry5jmxdr42vdnjdkhv", BlsPublicKey: "b272bf06d88fc0d746234b482b283ac1aaa6d3b355074fb882e1cfede0c1f3826d34a64ba71ee4ba1c98e1b2fae06208"},
{Index: "232", Address: "one1ssppn7nu98v6f9us8hzqmxe9x224x4e7g8yrn9", BlsPublicKey: "400d2e06add9327584a6ede5d0052be4fd6d0ed76c509bc61684b9895bc004f55c871093f3b672e08b30a13a64c90c8d"},
{Index: "233", Address: "one1apnpuzvys4snw7c767mpx4mztau32uheeeg3rm", BlsPublicKey: "43dc22780ada0dc7d8f8d5be4186bae9516ab5ce478f931c213e9e758cf4e8e4223cd85ffdc8eb717c702465b957bd93"},
{Index: "234", Address: "one1d9t6pah9kaws3w403z4z2hnlem4g5tced6se0z", BlsPublicKey: "11b03ebd65fe67f437066c144314f73bfac84b919e2f7bbc8446b46432c3e362aa2d66db5444c3e6a9b6bfa21a5c6910"},
{Index: "235", Address: "one132sam2j2n3rwel44h552ke8q9ycfjszjfsfcpc", BlsPublicKey: "006e3ce73164f2358102147bc49dc56b96f4ffb7c9d5daed7177bc4fb580816c7e97527f6154d2673a8eae8789d68407"},
{Index: "236", Address: "one10p09fugsgse0wl0vwglckw20243tzgx33g0stw", BlsPublicKey: "19b506b4bb9d8dbcc1c10c76e0383661b0c9f754cd94b79e6793a76108ca4d4243c60c501c5e0d5b703d956295c7b011"},
{Index: "237", Address: "one1upl0papn6gknk9tcvxh3sm0y68jrv0zkvzmlaf", BlsPublicKey: "6b22381df3a6bd83eeada465ddb3b59c81d89cfe3bbd25d35569feb05330616cdd6c734af7d1b96ed29a0075e869d090"},
{Index: "238", Address: "one1kdag5d3p2g2h4ypmy3u8emm2ddyjwhgs6jdnxh", BlsPublicKey: "9492d73d124f27caf7315d3e81ff98706b0bbbd2290bc17514a2e56fcc9d9517255baaaac389dee717ccf2b5a3c1848c"},
{Index: "239", Address: "one1hlxe68d7trza48k0n4y77antwaken3x99pgw75", BlsPublicKey: "8f797e45b12648c3b9c8e8bb7eaabe7eaac7836d901eb798470cccfb6414e2e54516cbb2de1aeaf7a5d381651cdc5f0a"},
{Index: "240", Address: "one1f0yvhlqc5z7v5w5fnk7x7t38tuvjefnyyw258l", BlsPublicKey: "dbf440b2edb6f2ce9f1ead59eeb14b9073e9941a88c8d2aa75ddef246ce3965c4a4af00dcff8e436af2b01ca7a4e140d"},
{Index: "241", Address: "one1nc46dhk8p68rvh4asn08wyx06jdazee808uydt", BlsPublicKey: "e0494119115eb4a8ba7620973200741773dd8ec0661640396afce247ba90f64cbe76c10e1fd7ce826df1afc5b2ec3c11"},
{Index: "242", Address: "one12s2rjhvm7exvv7v6xxtt9psve9fucayk3uyl6d", BlsPublicKey: "85d20b10c6a2bbd68133919a0dbae94f3459eb683ba3f346aa5796ec708bb824a2c7785a064e28147051105059aa9d80"},
{Index: "243", Address: "one1dwc9weha5xl0nmy4g4tw9g0j9lpaf2hal90skf", BlsPublicKey: "a0a54e174f470e03c1305e8e9c6daf73014a846e5641cd2aeb42e76ce2f38b501f02803e2fa81910ec3fd996f700fa8e"},
{Index: "244", Address: "one1qqdx33jf4uzkda546cr6av58wgc5fhf2la77ee", BlsPublicKey: "9c9776a447ffce36f9c65b48850024b4bd121a8631c8fdf8bc58e63ee48bdaf0ebdc9262fd62238215909543ecec8687"},
{Index: "245", Address: "one1xfm4e8xpppyujvk489t6kgdyfcpc7pq9uk9ep0", BlsPublicKey: "a827047180ef3afa2e03f8b7cabc4453cb2f5768e5d142892ffe1e985d8654d8c7c6b561a1c9e9595b86560601bd7297"},
{Index: "246", Address: "one1mqnquf7jmulg3cdyazay0p6w9w75qmcxp59nra", BlsPublicKey: "73376c20ea73b76a8857fb15841ccc4b50d74a523c2554f261e003bcc9fab9a4487448726e14c36c0879d38fe7b15294"},
{Index: "247", Address: "one12adq0qpa64fp9yrwemawetapsxyv5964553rz3", BlsPublicKey: "c46b4c64ca8a76d11d4dc1472a928949e973b46ab41e0e2abdb9fd42b58791874a70796b8b747717f4206dc3fe571912"},
{Index: "248", Address: "one1dy45f05wtdyx8rn824j3fslc8sv0c50ksu8fwu", BlsPublicKey: "ca027bf6ca93fa5afd4b4145d3fe2738b9778b3a18ae43511a1c1ca827fad879f34c2fa450f39c37dceeed98e5de2480"},
{Index: "249", Address: "one1vzurzrkmzlvus7dwcguzdlt6pz6zgnuxdvsjaz", BlsPublicKey: "217dbe8eeeedba0b2917012dedb0e13f50462afee6e843b9c38d9a8bafc4c2c1fb60186eea9d89cd71aa18943f9bbc13"},
{Index: "250", Address: "one12g4tzvgcg7lvqfrye9h5qvwz24psccsp3r2rew", BlsPublicKey: "08a80ef165db6660b7eb092905b401b28fde486be42ba5f72622033f45d4d23ba49bec50999de2906af74b1352ccfc99"},
{Index: "251", Address: "one1ltdr7wke9swudj022dnkkwrsgzsaqdtvhpuuqu", BlsPublicKey: "6a3d429b7eecc85bbd2db8c8fc88c57ce5ad71d314f34d393ce22618c62df9dd78210aff109fea7b5607fd055e303380"},
{Index: "252", Address: "one1ygq5gu7vtgfff65mcqvhsjxpadrygwc25k37zx", BlsPublicKey: "20eaf3d7968ac65d5508c4b4728fbfd34ac0c874d96b4d8809a09144aeeb30c35a5dd9e39dcdeb706a2490fb7ba5c507"},
{Index: "253", Address: "one1029yaac9572k79f4dq93838azru7qsg3hrzxdc", BlsPublicKey: "4dfdde892c9d61269e0884fc5eccea27a79de584b2a80ca2fe529d381ada513e8d6c1f884cb4e72aabe1a6b431a6f317"},
{Index: "254", Address: "one125q55zhpwa7pq6nfea3ara6unhy9580q8up0ed", BlsPublicKey: "2e82958230586d53b02aa1ac3469d1db3fcf764118fdc0aace304a7cdd58bcf75a90c73cdc96624ef42102a95a8cdd0a"},
{Index: "255", Address: "one1wewjner3mw562s9c69mm2uds2umrfvkas9w2eg", BlsPublicKey: "137a2cb5895f37a7edf2b9c2dcd28e16451c15443340e3512306efdbdb49ec8f0607b828fb69a54a5012d1f9ef0ef596"},
{Index: "256", Address: "one1rdv6v2hyjayvwh5ezrnncphghu4scpxvruwv96", BlsPublicKey: "c2c1ab6644c4a3f9e2a8cf0fabda31bead71294c6ee8c943072ad2231229ff5e920efb0c7540e9d7cd1d52abef3cd40b"},
{Index: "257", Address: "one1y9p60vrlycpnz35nr9t04ejc0j6dtufjskn3v4", BlsPublicKey: "395c5cd08ca5278a4ba69adc009d6502b049afcaac21cd128f1263788e695eec512a7bab68befdd615f97c3634fd098c"},
{Index: "258", Address: "one1fudxzktt29z6xh05934dxtrr8nmf67htkxq5zp", BlsPublicKey: "523e69f312fafcfc0283262989f17e2b1ce9a40d5e59c77cc8c3e1fb803342f5812b4d56a2af0f8779d259e0f6bf2e05"},
{Index: "259", Address: "one1tckzrwkq5n5j85x0dw30hnzqkm3rmkggyq4dzk", BlsPublicKey: "2a43f9ec20e3785f0f19f04bfdc201715856e32f3a27be8782ec982dbc7e6f1937b985479498492508569910b4f5c980"},
{Index: "260", Address: "one10xp2vm3qq25f8j7wjs5hhkau8seme8yjy0ckpq", BlsPublicKey: "8d4a2159ea1bd1cd65d68f68f0208d3273faf2ad3f6af8c9702ac5a7c0ef1eef01b15aa2a22891d2693f640af666a711"},
{Index: "261", Address: "one12cvzqwpxsq866ku4vzc6xvanwhj54wa6pkx602", BlsPublicKey: "0ad1c2f191e6197352b6e6a2a88b1361b6505cc2390c7bb1850f872760e88cda9b807c5e5063ad3f18e5ca8998ee8912"},
{Index: "262", Address: "one1ge96pkg4vzhvr2cdew2vmksa47aqq5g9qgzvct", BlsPublicKey: "9321038ff841a622c3df090a3b51e32e230cd5d52d21fc27cd70a351a7d51c7bb85ee19e619ec99684f801dde6330519"},
{Index: "263", Address: "one1cqkrs6cttaqlww8kx2s88a6pajk6ua37u47gwt", BlsPublicKey: "be99bcc37d27005bb0b9b8017556c70d77286adaa50c20576265ef44de7c01566bc9a96ce36cac6c7b8fa0d5e0fa7c89"},
{Index: "264", Address: "one1uzcaptmh25ec0407fs8ra9f8kesxvaqpw6nfjs", BlsPublicKey: "da487df0f1c809a475098ec65092a659d434eb61a4f92d1215df5afe703a3abb05ceda3a3b3de3256ea0c6e6aa0c8a16"},
{Index: "265", Address: "one1e06d6ldcr846z866wtdzm4c5h0zrlazgacz30u", BlsPublicKey: "7ab1ca94c701efacd2511eb12106cc0e0da35ef5d25574a79d0e38a0ee931657d9d10c7c4867df8b732d28041e8daa09"},
{Index: "266", Address: "one1efyllkjzayyc72xna69qp64s6aw02ak9sfcxle", BlsPublicKey: "ca3cf15d43efa692e4fc8db6ebe0f63b23f12d4347ce399d67a243375e2f04bfe90e7a8f435b89c5774b061d73ab3485"},
{Index: "267", Address: "one1ypjapaa5mhtu32tc4ezg5d5xxl6mnl5qd9qff9", BlsPublicKey: "d93e40e252d36f40678ddda2837603eaa6510430ec223cc10421fe3add924b75320c647ba2cb9ba4eda7d286849b2f0f"},
{Index: "268", Address: "one1mkx7gu70c47c83uee5agnp9zx20h3eqz3rau2d", BlsPublicKey: "f8b63af7bb83cf6fd963354a40e857a4b9b6ae3072bb8db6104070436cc7ba684e4c34ba2156c710eee3c69d6ab79981"},
{Index: "269", Address: "one1z37zj4dvmlcvuy3n3ajq57pzvn2fuxvzh2uzwc", BlsPublicKey: "625c3b79a01fee63728e21a7cec7560655df565a07f1090333f167a45acaf2d8e66eedf8feb1faf4ede1be773a8e5895"},
{Index: "270", Address: "one1n0q9vc37g9h6hjplkjjnll7uxz59mnceml67g4", BlsPublicKey: "fa656869591dd33dfb8c395a70303b82e8eefd19f535ce1ea71a9a2e68a74a1e0c8a203f65fd1452c579e7ffed238603"},
{Index: "271", Address: "one1lp4spvwyfk9xpnwvn6wk6s49edmysgwmkdy4tj", BlsPublicKey: "9bc2c7dc0ad6c6f0294a615018b386ce2c863a62e96de0f6000f6c05f307eeafb07e2a2b68c69e09367831f42171e589"},
{Index: "272", Address: "one1fxtqcmentn0eqske6s70gnry6czdtr25wh3yda", BlsPublicKey: "811513a51c742278990415c648b7dacb40f4d1533b3fe101330553a5d14ea2e19d8a410ef9f29db02e29a0ef86d47405"},
{Index: "273", Address: "one1m48ugw5grk9spkdmquegsyy6see278h2zalwrv", BlsPublicKey: "15ee2ae7e4fdb6e86f2fc8973d0599cdb1db69746c1888901daedabaa5db20dca332e21ff071a19711f6ad36699c5283"},
{Index: "274", Address: "one1aq6znwr8urphg242fp8dwg57yk3js5ng8pc5l8", BlsPublicKey: "cefd83ec5884f6dc8db44c089901240c5678d8972e0a54a347dfad6db190390661f5fe6e588605d1dd2f90e72513ef05"},
{Index: "275", Address: "one15hnzhrdr96hkat0v4xcf2jhm2kwyle3qcfspz0", BlsPublicKey: "30547b7dc67c7d067ea1854e22526f532807fb5ff5027d573f648006fd675e8bd51bc89a769f6bb988c5e58b30c10c08"},
{Index: "276", Address: "one19vqra78q5mwevchkf4ypcew6ask959tnallz3v", BlsPublicKey: "0d6b063bd939266baddd8024342e91782ea3239640fff0b22595b62e9e6b2cd430c86ed57c3b4a82d84eb35e80eee812"},
{Index: "277", Address: "one1m0e0l70dafzh0qwxhcpd7hwkvcc5w54r7ngfjz", BlsPublicKey: "cda929d246febc84dc1a5b08b67081dc15a51151280069640b9af90aa03705dd448ae22b912399339153723f16c6b302"},
{Index: "278", Address: "one1eunxsyxtke88xel47hpj54tqm3tw8rd46r5ht9", BlsPublicKey: "f7ea2ab7042cbc695f0627c9f6133ae8afcf6f3f7288811281e9d7345cc6f6e587c7b716b48c6388bc288955c163e08b"},
{Index: "279", Address: "one1w8lcu9ltg8lhha4x9mtx8aq02nxkhgxgr6haf7", BlsPublicKey: "3bb33747342a36c9f889ad5df05586e7877d1eee289108594cfebcdecd4ef9a04051a819eaae9b454568999fd2056c8c"},
{Index: "280", Address: "one1pa05jy8q8py5833k9jymh3jc2t5y905uaypl46", BlsPublicKey: "b00a837f8432681a6baadaf0e1447922156c47e065e42c012cd47ac4f36e7f91078e66dad85d897a6266ad662efdd883"},
{Index: "281", Address: "one17h54wwmru7cr53alqll6fy4xf422mkn625gq4l", BlsPublicKey: "2040ffa5b8dda317eb06206e432c56b08ec5249d6a26dd76b6c5e4c89fb07add5964b6e70c6e2eb0f47bd5f44a3cd692"},
{Index: "282", Address: "one1aszeul2dgu6ucku6caz4qdavu24l6ulxkywpz2", BlsPublicKey: "b64b6c624a1238a267f3cdb7783f5501406a980b4d12795b68a691c9f8d1196ddffd259160dedcae53fb55ddd25d6895"},
{Index: "283", Address: "one1kt4f8hkq3vv2gkhdnp0zzjyewm9gxp90dwh46t", BlsPublicKey: "c32ae619496c3c4bfb4ba271a5ed95a64e4e68bee90dd4e81d05eccea60ef5555ca29e0b88e0df238a8ecb125279a08d"},
{Index: "284", Address: "one1nhz45acq3x7z0a0qkyjuw54ctqe63lsrecjaly", BlsPublicKey: "01a817b85d52b32d77f00c78addd1fc38cb0a79fc257bf2304916f65c05f9628b6c429aa6d57a3cd16931dc32f6d9e00"},
{Index: "285", Address: "one1n0y43284m4rx9r5q0dgsq7lnr5hfyxnuph7qsk", BlsPublicKey: "451f86182c7ae7c89693a27562438f592055bb7ac429c790ca0b6f0f788613e26dfd721947b550c9163af98df8ce6014"},
{Index: "286", Address: "one12xd8xprzmwk7wdu825vcuweu0crlp0666fxcnr", BlsPublicKey: "a39ca6cbc5bf8a2e4455c390aabddee408190bd66285b25d70fb26a464baa38e4301e882ffcd2bf4fb3f1fa2362bb899"},
{Index: "287", Address: "one1kqnxwp2sv8ncc4ftl0d8mle7sehuvdzj5g2eke", BlsPublicKey: "ab23499c8a9be55fc429ce0b856abc7f794f2ea93396c4e84d30f31f44d061e6c9bbbc77b207c729a52f9c19f96c0897"},
{Index: "288", Address: "one1tg2t6dku6u8ewmtsc3ud57z9nkuu27z38kfusc", BlsPublicKey: "ed5d0527603cc15a6e746d16619b799085a660137c55346fa9fc60f35befb12378e15ae6446c22ba7b920db4c8469003"},
{Index: "289", Address: "one14kf8n8u0p9nfxf0g0rdym9n3gey9furq00csef", BlsPublicKey: "cab7be5c297dcb1e264a2e1beb224685a6b9da0229bdbad2b737681f086295fe8404565cd6b4d365d5d9476ae771c004"},
{Index: "290", Address: "one1cele0398awp9r4646kh9dta72wqjkwnntrkfxk", BlsPublicKey: "5e20a525fa0dc7c627cfb04b0c1b2d35caa1db1b33de124246b84ba8567c9f9b326fa48d4bb618be65ea3d59a89c7b82"},
{Index: "291", Address: "one1rmw3r0mp255am06au737l7luwstrnju4w6w08l", BlsPublicKey: "12fc6bbf5e4920c3bc124918a2fc551dea30af76535ff77d3be79757886412af1342f96aee1641f88363f178c2ed0e02"},
{Index: "292", Address: "one1ux3gysrzuzcwpv6kz9g26q55fpnm46gs3uca3f", BlsPublicKey: "b5165bb89cbd9bf6670bc251997aaaefae2477800235105a9c02b0a177e936fa739f591ebcd4f658bc470f31e1db3f0d"},
{Index: "293", Address: "one1pe6qmn05zgshwp45srd9yf8j6fuqngaaa788a8", BlsPublicKey: "11bc345bb06c3c82b07ee7c859fb5547406b19c89a0317431f7a81fb42aac8ad8f6164e4ed28a7ad2a26e0189d248884"},
{Index: "294", Address: "one1u33ecnyad786tra3cfsuyqahsdsz47jyap5985", BlsPublicKey: "5859ea74344252f86ae28c77a0dbf3691405e4aa160fd8344e2cce018e864af39fcf2a01254a58d62463aba3592e6214"},
{Index: "295", Address: "one18ec2d0vz2dz7q9lvddfhdrld4mccdvn9fv9e6u", BlsPublicKey: "0500e601641924acbe1f583dd4917ee2f3e8ad15b1b27793cd886546528e0c93b8f8ab64237faa50dd05b714c87f2d89"},
{Index: "296", Address: "one1gnmnfqhumcpvnre23g5t43ne6he69l66ay8a6z", BlsPublicKey: "b980095774c5dba353eec08cfd4463d65aad54707247e4ee87ec04f6197024dd289077e16e786555854c841f8646b084"},
{Index: "297", Address: "one1usn6y0z9g9a9w0lnvfu6j756pu2cdh5m8wzqhx", BlsPublicKey: "94f717b822401b64b6eaf6d740832467321bb82ec2fbaf62acf2a8774acb26ae9dc45f08e24b98422c97d0c768f7e082"},
{Index: "298", Address: "one10sfghmyd8n0vlu2na3muvlk4ck563cve4euhv5", BlsPublicKey: "6a703a35090461e20f543bee3afb2f55aed72ba36872dba7bb345e02de61a9a24193aaa3ca04900353c97d7357aa1103"},
{Index: "299", Address: "one1d4uc733wu5ghhqvyrxn8rc8jvs40ay35tx07ev", BlsPublicKey: "3b7af98797be9a8935787264fb409b7273a3b82818f5641b2536634e6ac1a4b69b37fe9ecb57e540cc18f7f0fa2fe28e"},
{Index: "300", Address: "one12n7a3xwsxwj7t2wy5hppmc7deepextjufuc4w9", BlsPublicKey: "7a17929d85415e64373f19475edc9fcb2769c3a6bfddc863d577ce926e98a98ebf7775c2cbb490db4cf85dcd69778f06"},
{Index: "301", Address: "one14z5ks7yj9tzpyt0p7na5dfpau5vj07sggxzyqm", BlsPublicKey: "b394c8a587f84686917960353df8adcdc305182030dcdad5dbf3312a9ebfaf38b8cbe7ecf91a00fd0a69810e1eba2e98"},
{Index: "302", Address: "one10pptg3m2k4c7ntgyqqpdmcamwg9e29naq4a4gd", BlsPublicKey: "931c600eb04d9fe1fde45104a00e5da9bcdd94787e18b5867ab6c0c5d33834f9a1fb7f090f3eafcb26e368b43f82f213"},
{Index: "303", Address: "one1hcru2lx6nagvf49hfc5skhhxummq863nlmvvu5", BlsPublicKey: "9a2529a40c23b45e33058e4758e63d2c5285bc64c0f71563725767274e9d0c25b6a9e96cf37d8ddf3a7047a2f5f8778d"},
{Index: "304", Address: "one13zzrvzrdxz2pf4y6ewkgjy7h2f602esjzjx4zv", BlsPublicKey: "48c89306e6eda48a4bd55145a89dc55ef7fdee4f3938afd1a6a3c503be8678e9aee3636f63b0df08a7491597e793f492"},
{Index: "305", Address: "one1zkpxghkct52crp2tda7xkdpxga32j56jjevntf", BlsPublicKey: "8137e81449de355de1befa684f89c38f5769a3744af8f9066d517474476b20be930cfad7de30b73b26c2353480111d92"},
{Index: "306", Address: "one1r8ywmftsqgew4sfx9808dtww4r6j3a3v98c8vt", BlsPublicKey: "a221b590df1f201b653c31c0df894471519c0601dac36189ddb9511b4b920d5a43e597842971e784d0e0cb17bda7e983"},
{Index: "307", Address: "one1w2t3d2g435az4cnyqf7rkuzq2mu08mfuwlqhcz", BlsPublicKey: "8520f6519d3bc40fbffc703248cdcb6222e24394238cc7e705048ea62dceb35c3a2d0151d863556e8f172ca54ab8fe87"},
{Index: "308", Address: "one1hz4n5vn4e6ucvppxf6n8zayhml8wsqken60ksg", BlsPublicKey: "9d5063f3d82ca4b6855f3b00a45bdff5dd309fd6c4e12488ef18fbe808c847c2ff89334e641b3850e025b9bb85f4538b"},
{Index: "309", Address: "one1qcdduv4rravchv44lfp4c30u4gyq9fqly6pw28", BlsPublicKey: "5b47cf92f361102522c1f24ea3bc0dd6cfd913bd8ae69a39eb8218fa9d3ce4a152b42bf14ddda5f6b4769ba7f0936d99"},
{Index: "310", Address: "one1zsp8n0fghqjjlhmqga8uaf05jy6v2wtp3g4exh", BlsPublicKey: "543f3377c2d3c3f20dcaaa24d91937c13c5af668862bc0848bbbeed487105d443c37c4b4e5298f1316ee07191ddb0017"},
{Index: "311", Address: "one1trecmah3u87sdwetkcwmfyhey2vwwsky69jnnz", BlsPublicKey: "d44bfa0de6d2993518b5d35d2166c761563725ced6976b40d87b2babbf790d51f6c9ad6a2d3d8e1b90caf131c527ff89"},
{Index: "312", Address: "one180ynkcryyy4wc4uchjmmztdhgwmt5tvql6vnnd", BlsPublicKey: "0d49a99b8a964fb5019b8bd1c67e7866d149bfc14d1271d6f8f5986550e6878c75069851d16b9cedcbbee530cc556f82"},
{Index: "313", Address: "one1mlc7ph0hg7q2lwpg0g0jdnwznw9dcuv3486z4m", BlsPublicKey: "67ea05360eb33ab4003e31907c5546f7fbeab057d25a3597bd1659869d9d5a308ebd39d507dbcfd791a4eb0c6354f311"},
{Index: "314", Address: "one1kzhs0vfhv6q52xh5pq6z25qnaeaztrkmh50zfa", BlsPublicKey: "a1319b8151d84da78374c4bd071b49288fb99593ff0c4b248df881abaa7e6f777e53b94e7a9f89f26cf59833063d9184"},
{Index: "315", Address: "one18ysrar3hzvgkduvuqtf9e0wrschtxlf4u2qu7e", BlsPublicKey: "ef5d7aa1bd308a73a962438bf6e7acfa8f4ae6537c51b2566e243d4b799dda53e56f8715b65c4d8e2e5871b6a5a5848e"},
{Index: "316", Address: "one1u2p7afhq0kw4e9j4c9349na79tasewhfqucasl", BlsPublicKey: "f9cf575ba0e5fed25a606c3945f7e4f1b73d94a6293abb79cd79aef4a77148c6998892e6593a20af3ad299bbdbd5818c"},
{Index: "317", Address: "one1qtah9p2et4mt7x49xygqfhs2d9hgjvmrek9ppg", BlsPublicKey: "14436d6a0dcb68557a5e54f44ae33470b07552f80b6c74eea55b7375e2b4332523208fcbb90b0888b95266a59e0dc615"},
{Index: "318", Address: "one1zpsyshpqt63kxveescaa88d5rk5mwuqqzs8uru", BlsPublicKey: "f0d4fbf087583f18459ed7e7e719f717d268c1c64c430cdcfec46a4cb379fc53d94e8a349d4e8d6e976b046180b72197"},
{Index: "319", Address: "one19c4uqfzezuws7e4ka4kvc5r09suks2ghpyg6xw", BlsPublicKey: "51b2019b222df63fc99d202b03834dee09f1ef11e25a03592a96c1d01bca2bedfc25e0f26d88dcbb8a7176e30e1ec116"},
}

@ -0,0 +1,16 @@
package genesis
import "testing"
func TestFoundationalNodeAccounts(t *testing.T) {
for name, accounts := range map[string][]DeployAccount{
"V0": FoundationalNodeAccounts,
"V0_1": FoundationalNodeAccountsV0_1,
"V0_2": FoundationalNodeAccountsV0_2,
// V0_3 exempted due to historical mistakes (dups at 187/204 & 202/205)
//"V0_3": FoundationalNodeAccountsV0_3,
"V0_4": FoundationalNodeAccountsV0_4,
} {
t.Run(name, func(t *testing.T) { testDeployAccounts(t, accounts) })
}
}

@ -9,7 +9,10 @@ import (
"testing" "testing"
"github.com/btcsuite/btcutil/bech32" "github.com/btcsuite/btcutil/bech32"
ethCommon "github.com/ethereum/go-ethereum/common"
"github.com/harmony-one/bls/ffi/go/bls" "github.com/harmony-one/bls/ffi/go/bls"
"github.com/harmony-one/harmony/internal/common"
) )
func TestString(t *testing.T) { func TestString(t *testing.T) {
@ -82,3 +85,40 @@ func testAccounts(test *testing.T, accounts []DeployAccount) {
} }
} }
} }
func testDeployAccounts(t *testing.T, accounts []DeployAccount) {
indicesByAddress := make(map[ethCommon.Address][]int)
indicesByKey := make(map[string][]int)
for index, account := range accounts {
if strings.TrimSpace(account.Index) != strconv.Itoa(index) {
t.Errorf("account %+v at index %v has wrong index string",
account, index)
}
if address, err := common.Bech32ToAddress(account.Address); err != nil {
t.Errorf("account %+v at index %v has invalid address (%s)",
account, index, err)
} else {
indicesByAddress[address] = append(indicesByAddress[address], index)
}
pubKey := bls.PublicKey{}
if err := pubKey.DeserializeHexStr(account.BlsPublicKey); err != nil {
t.Errorf("account %+v at index %v has invalid public key (%s)",
account, index, err)
} else {
pubKeyStr := pubKey.SerializeToHexStr()
indicesByKey[pubKeyStr] = append(indicesByKey[pubKeyStr], index)
}
}
for address, indices := range indicesByAddress {
if len(indices) > 1 {
t.Errorf("account address %s appears in multiple rows: %v",
common.MustAddressToBech32(address), indices)
}
}
for pubKey, indices := range indicesByKey {
if len(indices) > 1 {
t.Errorf("BLS public key %s appears in multiple rows: %v",
pubKey, indices)
}
}
}

@ -0,0 +1,7 @@
package genesis
import "testing"
func TestHarmonyAccounts(t *testing.T) {
testDeployAccounts(t, HarmonyAccounts)
}

@ -0,0 +1,16 @@
package genesis
import "testing"
func TestLocalTestAccounts(t *testing.T) {
for name, accounts := range map[string][]DeployAccount{
"HarmonyV0": LocalHarmonyAccounts,
"HarmonyV1": LocalHarmonyAccountsV1,
"HarmonyV2": LocalHarmonyAccountsV2,
"FoundationalV0": LocalFnAccounts,
"FoundationalV1": LocalFnAccountsV1,
"FoundationalV2": LocalFnAccountsV2,
} {
t.Run(name, func(t *testing.T) { testDeployAccounts(t, accounts) })
}
}

@ -2,14 +2,14 @@ package genesis
// NewNodeAccounts are the accounts for the new node // NewNodeAccounts are the accounts for the new node
var NewNodeAccounts = [...]DeployAccount{ var NewNodeAccounts = [...]DeployAccount{
{Index: "0", Address: "0x0e59b767D5E74cf7B29Ef9bEc3dA4c402d357C6C", BlsPublicKey: "92fa832056e71ea833e24a7e877e2f371ca645cf338a4cb93c2ced40d8d6676eaf15dac642f22c238d58fed279f34700"}, {Index: "0", Address: "one1pevmwe74uax00v57lxlv8kjvgqkn2lrv843nt9", BlsPublicKey: "92fa832056e71ea833e24a7e877e2f371ca645cf338a4cb93c2ced40d8d6676eaf15dac642f22c238d58fed279f34700"},
{Index: "1", Address: "0x0fAAda81c203C74CAc786786f7D428477a04bF9c", BlsPublicKey: "d1ac9bbf790e347cbe5e6fb9145f5ffd93e335452f94829df6376c6924fbceea4b96ac8c29778e7b06a92e25bd06f892"}, {Index: "1", Address: "one1p74d4qwzq0r5etrcv7r004pggaaqf0uu273jdl", BlsPublicKey: "d1ac9bbf790e347cbe5e6fb9145f5ffd93e335452f94829df6376c6924fbceea4b96ac8c29778e7b06a92e25bd06f892"},
{Index: "2", Address: "0x0fd228bdFbe9ad0c898e9A0Fee2E6FB01f596F0d", BlsPublicKey: "0a4d8c3168072ac82604103b3ca5efd038ae38c6062f303b08a24152b8c58d1ff3b578521f80a386bcfa2ad6c680ba14"}, {Index: "2", Address: "one1plfz300maxksezvwng87utn0kq04jmcd4jx4c8", BlsPublicKey: "0a4d8c3168072ac82604103b3ca5efd038ae38c6062f303b08a24152b8c58d1ff3b578521f80a386bcfa2ad6c680ba14"},
{Index: "3", Address: "0x123FF831333e2662D00c60A2C46f7196204506e9", BlsPublicKey: "a31b122157b1d6d958a184361299396b3b72a3cdcd20eb5e07e18bc03034fa1a8ddbd2e0f9e3ed68cd412b7b673c0094"}, {Index: "3", Address: "one1zgllsvfn8cnx95qvvz3vgmm3jcsy2phf4wj7hm", BlsPublicKey: "a31b122157b1d6d958a184361299396b3b72a3cdcd20eb5e07e18bc03034fa1a8ddbd2e0f9e3ed68cd412b7b673c0094"},
{Index: "4", Address: "0x1240775288d0EE975583A2A7022006539dADb354", BlsPublicKey: "1aeaebce1a8a8aabb64877491a392f63682b3e2a223d1d3c7c5ef8d5b33e5e700543d5c9d8017c8520e6d7193f496f05"}, {Index: "4", Address: "one1zfq8w55g6rhfw4vr52nsygqx2ww6mv658l4r5y", BlsPublicKey: "1aeaebce1a8a8aabb64877491a392f63682b3e2a223d1d3c7c5ef8d5b33e5e700543d5c9d8017c8520e6d7193f496f05"},
{Index: "5", Address: "0x127b8Cb71Fb78338d9EFFe47bB51c2EAd3995378", BlsPublicKey: "3ec3dd79bd1a8e27d0fa927bbf0f425ce564a962389a723924f071fc7802bc5924d848980595cd584e3588a6d3e0a191"}, {Index: "5", Address: "one1zfacedclk7pn3k00lermk5wzatfej5mct4hh5r", BlsPublicKey: "3ec3dd79bd1a8e27d0fa927bbf0f425ce564a962389a723924f071fc7802bc5924d848980595cd584e3588a6d3e0a191"},
{Index: "6", Address: "0x141B0e0f05739B7B784654E973e9b9146473aAb9", BlsPublicKey: "f2f085fb9258e47601db4c3b87f9d603b7557b57e1c4e0361f86f42070b45bca09d69276c4717846589b3a99481eed80"}, {Index: "6", Address: "one1zsdsurc9wwdhk7zx2n5h86dez3j8824ef59clr", BlsPublicKey: "f2f085fb9258e47601db4c3b87f9d603b7557b57e1c4e0361f86f42070b45bca09d69276c4717846589b3a99481eed80"},
{Index: "7", Address: "0x1492ebD0EcfD54B4c211b37C8891bA3493c52100", BlsPublicKey: "01c91a20ec490e2e6663a3c5ce04e57b991998f8967453535360de66e14dca797aa5fd270cc6d3dbc31d684d2622af05"}, {Index: "7", Address: "one1zjfwh58vl42tfss3kd7g3yd6xjfu2ggqsg2ecs", BlsPublicKey: "01c91a20ec490e2e6663a3c5ce04e57b991998f8967453535360de66e14dca797aa5fd270cc6d3dbc31d684d2622af05"},
{Index: "8", Address: "0x1530A04592F9C3bF06aC6044525f08937ED38edB", BlsPublicKey: "fe3f52d068bb83211b3e804a29f27699f9388d2dd0fcbf91353e4dd68da69636046a24fd5912f8dd5e97388577fd388a"}, {Index: "8", Address: "one1z5c2q3vjl8pm7p4vvpz9yhcgjdld8rkmu9uwdh", BlsPublicKey: "fe3f52d068bb83211b3e804a29f27699f9388d2dd0fcbf91353e4dd68da69636046a24fd5912f8dd5e97388577fd388a"},
{Index: "9", Address: "0xE2ab78ecf325084485957B2599d53Bcf944Cbca8", BlsPublicKey: "c02e49e1395c6fbbabf0d619d872f74774d34ddec83553cf7f687da593253d072d5d050b3b4a3005304e504781847999"}, {Index: "9", Address: "one1u24h3m8ny5yyfpv40vjen4fme72ye09gn5mr9q", BlsPublicKey: "c02e49e1395c6fbbabf0d619d872f74774d34ddec83553cf7f687da593253d072d5d050b3b4a3005304e504781847999"},
} }

@ -0,0 +1,7 @@
package genesis
import "testing"
func TestNewNodeAccounts(t *testing.T) {
testDeployAccounts(t, NewNodeAccounts[:])
}

@ -0,0 +1,11 @@
package genesis
import "testing"
func TestTNHarmonyAccounts(t *testing.T) {
testDeployAccounts(t, TNHarmonyAccounts)
}
func TestTNFoundationalAccounts(t *testing.T) {
testDeployAccounts(t, TNFoundationalAccounts)
}

@ -90,8 +90,6 @@ type Node struct {
BlockChannel chan *types.Block // The channel to send newly proposed blocks BlockChannel chan *types.Block // The channel to send newly proposed blocks
ConfirmedBlockChannel chan *types.Block // The channel to send confirmed blocks ConfirmedBlockChannel chan *types.Block // The channel to send confirmed blocks
BeaconBlockChannel chan *types.Block // The channel to send beacon blocks for non-beaconchain nodes BeaconBlockChannel chan *types.Block // The channel to send beacon blocks for non-beaconchain nodes
pendingTransactions types.Transactions // All the transactions received but not yet processed for Consensus
pendingTxMutex sync.Mutex
DRand *drand.DRand // The instance for distributed randomness protocol DRand *drand.DRand // The instance for distributed randomness protocol
pendingCrossLinks []*types.Header pendingCrossLinks []*types.Header
pendingClMutex sync.Mutex pendingClMutex sync.Mutex
@ -116,7 +114,12 @@ type Node struct {
// BeaconNeighbors store only neighbor nodes in the beacon chain shard // BeaconNeighbors store only neighbor nodes in the beacon chain shard
BeaconNeighbors sync.Map // All the neighbor nodes, key is the sha256 of Peer IP/Port, value is the p2p.Peer BeaconNeighbors sync.Map // All the neighbor nodes, key is the sha256 of Peer IP/Port, value is the p2p.Peer
TxPool *core.TxPool TxPool *core.TxPool // TODO migrate to TxPool from pendingTransactions list below
pendingTransactions types.Transactions // All the transactions received but not yet processed for Consensus
pendingTxMutex sync.Mutex
recentTxsStats types.RecentTxsStats
Worker *worker.Worker Worker *worker.Worker
BeaconWorker *worker.Worker // worker for beacon chain BeaconWorker *worker.Worker // worker for beacon chain
@ -233,31 +236,29 @@ func (node *Node) Beaconchain() *core.BlockChain {
} }
func (node *Node) reducePendingTransactions() { func (node *Node) reducePendingTransactions() {
// If length of pendingTransactions is greater than TxPoolLimit then by greedy take the TxPoolLimit recent transactions. txPoolLimit := core.ShardingSchedule.MaxTxPoolSizeLimit()
if len(node.pendingTransactions) > TxPoolLimit+TxPoolLimit {
curLen := len(node.pendingTransactions) curLen := len(node.pendingTransactions)
node.pendingTransactions = append(types.Transactions(nil), node.pendingTransactions[curLen-TxPoolLimit:]...)
// If length of pendingTransactions is greater than TxPoolLimit then by greedy take the TxPoolLimit recent transactions.
if curLen > txPoolLimit+txPoolLimit {
node.pendingTransactions = append(types.Transactions(nil), node.pendingTransactions[curLen-txPoolLimit:]...)
utils.GetLogger().Info("mem stat reduce pending transaction") utils.GetLogger().Info("mem stat reduce pending transaction")
} }
} }
// Add new transactions to the pending transaction list. // Add new transactions to the pending transaction list.
func (node *Node) addPendingTransactions(newTxs types.Transactions) { func (node *Node) addPendingTransactions(newTxs types.Transactions) {
if node.NodeConfig.GetNetworkType() != nodeconfig.Mainnet {
node.pendingTxMutex.Lock() node.pendingTxMutex.Lock()
node.pendingTransactions = append(node.pendingTransactions, newTxs...) node.pendingTransactions = append(node.pendingTransactions, newTxs...)
node.reducePendingTransactions() node.reducePendingTransactions()
node.pendingTxMutex.Unlock() node.pendingTxMutex.Unlock()
utils.Logger().Info().Int("num", len(newTxs)).Int("totalPending", len(node.pendingTransactions)).Msg("Got more transactions") utils.Logger().Info().Int("length of newTxs", len(newTxs)).Int("totalPending", len(node.pendingTransactions)).Msg("Got more transactions")
}
} }
// AddPendingTransaction adds one new transaction to the pending transaction list. // AddPendingTransaction adds one new transaction to the pending transaction list.
func (node *Node) AddPendingTransaction(newTx *types.Transaction) { func (node *Node) AddPendingTransaction(newTx *types.Transaction) {
if node.NodeConfig.GetNetworkType() != nodeconfig.Mainnet {
node.addPendingTransactions(types.Transactions{newTx}) node.addPendingTransactions(types.Transactions{newTx})
utils.Logger().Error().Int("totalPending", len(node.pendingTransactions)).Msg("Got ONE more transaction") utils.Logger().Debug().Int("totalPending", len(node.pendingTransactions)).Msg("Got ONE more transaction")
}
} }
// AddPendingReceipts adds one receipt message to pending list. // AddPendingReceipts adds one receipt message to pending list.
@ -272,12 +273,24 @@ func (node *Node) AddPendingReceipts(receipts *types.CXReceiptsProof) {
// Take out a subset of valid transactions from the pending transaction list // Take out a subset of valid transactions from the pending transaction list
// Note the pending transaction list will then contain the rest of the txs // Note the pending transaction list will then contain the rest of the txs
func (node *Node) getTransactionsForNewBlock(maxNumTxs int, coinbase common.Address) types.Transactions { func (node *Node) getTransactionsForNewBlock(coinbase common.Address) types.Transactions {
if node.NodeConfig.GetNetworkType() == nodeconfig.Mainnet {
return types.Transactions{}
}
node.pendingTxMutex.Lock() node.pendingTxMutex.Lock()
selected, unselected, invalid := node.Worker.SelectTransactionsForNewBlock(node.pendingTransactions, maxNumTxs, coinbase)
txsThrottleConfig := core.ShardingSchedule.TxsThrottleConfig()
// the next block number to be added in consensus protocol, which is always one more than current chain header block
newBlockNum := node.Blockchain().CurrentBlock().NumberU64() + 1
// remove old (> txsThrottleConfigRecentTxDuration) blockNum keys from recentTxsStats and initiailize for the new block
for blockNum := range node.recentTxsStats {
recentTxsBlockNumGap := uint64(txsThrottleConfig.RecentTxDuration / node.BlockPeriod)
if recentTxsBlockNumGap < newBlockNum-blockNum {
delete(node.recentTxsStats, blockNum)
}
}
node.recentTxsStats[newBlockNum] = make(types.BlockTxsCounts)
selected, unselected, invalid := node.Worker.SelectTransactionsForNewBlock(newBlockNum, node.pendingTransactions, node.recentTxsStats, txsThrottleConfig, coinbase)
node.pendingTransactions = unselected node.pendingTransactions = unselected
node.reducePendingTransactions() node.reducePendingTransactions()
@ -287,6 +300,7 @@ func (node *Node) getTransactionsForNewBlock(maxNumTxs int, coinbase common.Addr
Int("invalidDiscarded", len(invalid)). Int("invalidDiscarded", len(invalid)).
Msg("Selecting Transactions") Msg("Selecting Transactions")
node.pendingTxMutex.Unlock() node.pendingTxMutex.Unlock()
return selected return selected
} }
@ -359,6 +373,7 @@ func New(host p2p.Host, consensusObj *consensus.Consensus, chainDBFactory shardc
node.BlockChannel = make(chan *types.Block) node.BlockChannel = make(chan *types.Block)
node.ConfirmedBlockChannel = make(chan *types.Block) node.ConfirmedBlockChannel = make(chan *types.Block)
node.BeaconBlockChannel = make(chan *types.Block) node.BeaconBlockChannel = make(chan *types.Block)
node.recentTxsStats = make(types.RecentTxsStats)
node.TxPool = core.NewTxPool(core.DefaultTxPoolConfig, node.Blockchain().Config(), blockchain) node.TxPool = core.NewTxPool(core.DefaultTxPoolConfig, node.Blockchain().Config(), blockchain)
node.Worker = worker.New(node.Blockchain().Config(), blockchain, chain.Engine, node.Consensus.ShardID) node.Worker = worker.New(node.Blockchain().Config(), blockchain, chain.Engine, node.Consensus.ShardID)
if node.Blockchain().ShardID() != 0 { if node.Blockchain().ShardID() != 0 {

@ -37,8 +37,6 @@ import (
) )
const ( const (
// MaxNumberOfTransactionsPerBlock is the max number of transaction per a block.
MaxNumberOfTransactionsPerBlock = 8000
consensusTimeout = 30 * time.Second consensusTimeout = 30 * time.Second
) )

@ -30,7 +30,7 @@ func TestAddNewBlock(t *testing.T) {
nodeconfig.GetShardConfig(0).SetNetworkType(nodeconfig.Devnet) nodeconfig.GetShardConfig(0).SetNetworkType(nodeconfig.Devnet)
node := New(host, consensus, testDBFactory, false) node := New(host, consensus, testDBFactory, false)
selectedTxs := node.getTransactionsForNewBlock(MaxNumberOfTransactionsPerBlock, common.Address{}) selectedTxs := node.getTransactionsForNewBlock(common.Address{})
node.Worker.CommitTransactions(selectedTxs, common.Address{}) node.Worker.CommitTransactions(selectedTxs, common.Address{})
block, _ := node.Worker.Commit([]byte{}, []byte{}, 0, common.Address{}) block, _ := node.Worker.Commit([]byte{}, []byte{}, 0, common.Address{})
@ -59,7 +59,7 @@ func TestVerifyNewBlock(t *testing.T) {
} }
node := New(host, consensus, testDBFactory, false) node := New(host, consensus, testDBFactory, false)
selectedTxs := node.getTransactionsForNewBlock(MaxNumberOfTransactionsPerBlock, common.Address{}) selectedTxs := node.getTransactionsForNewBlock(common.Address{})
node.Worker.CommitTransactions(selectedTxs, common.Address{}) node.Worker.CommitTransactions(selectedTxs, common.Address{})
block, _ := node.Worker.Commit([]byte{}, []byte{}, 0, common.Address{}) block, _ := node.Worker.Commit([]byte{}, []byte{}, 0, common.Address{})

@ -10,7 +10,6 @@ import (
"github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rlp"
"github.com/harmony-one/harmony/core" "github.com/harmony-one/harmony/core"
"github.com/harmony-one/harmony/core/types" "github.com/harmony-one/harmony/core/types"
nodeconfig "github.com/harmony-one/harmony/internal/configs/node"
"github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/ctxerror"
"github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/internal/utils"
) )
@ -59,9 +58,9 @@ func (node *Node) WaitForConsensusReadyv2(readySignal chan struct{}, stopChan ch
} }
// Normal tx block consensus // Normal tx block consensus
selectedTxs := types.Transactions{} // Empty transaction list selectedTxs := node.getTransactionsForNewBlock(coinbase)
if node.NodeConfig.GetNetworkType() != nodeconfig.Mainnet { if err := node.Worker.UpdateCurrent(coinbase); err != nil {
selectedTxs = node.getTransactionsForNewBlock(MaxNumberOfTransactionsPerBlock, coinbase) utils.GetLogger().Error("Failed updating worker's state", "Error", err)
} }
utils.Logger().Info(). utils.Logger().Info().
Uint64("blockNum", node.Blockchain().CurrentBlock().NumberU64()+1). Uint64("blockNum", node.Blockchain().CurrentBlock().NumberU64()+1).

@ -38,7 +38,7 @@ func TestUpdateStakingList(t *testing.T) {
node := New(host, consensus, testDBFactory, false) node := New(host, consensus, testDBFactory, false)
for i := 0; i < 5; i++ { for i := 0; i < 5; i++ {
selectedTxs := node.getTransactionsForNewBlock(MaxNumberOfTransactionsPerBlock, common.Address{}) selectedTxs := node.getTransactionsForNewBlock(common.Address{})
node.Worker.CommitTransactions(selectedTxs, common.Address{}) node.Worker.CommitTransactions(selectedTxs, common.Address{})
block, _ := node.Worker.Commit([]byte{}, []byte{}, 0, common.Address{}) block, _ := node.Worker.Commit([]byte{}, []byte{}, 0, common.Address{})

@ -13,6 +13,8 @@ import (
"github.com/harmony-one/harmony/core/state" "github.com/harmony-one/harmony/core/state"
"github.com/harmony-one/harmony/core/types" "github.com/harmony-one/harmony/core/types"
"github.com/harmony-one/harmony/core/vm" "github.com/harmony-one/harmony/core/vm"
shardingconfig "github.com/harmony-one/harmony/internal/configs/sharding"
"github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/ctxerror"
"github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/internal/utils"
) )
@ -44,11 +46,49 @@ type Worker struct {
shardID uint32 shardID uint32
} }
// Returns a tuple where the first value is the txs sender account address,
// the second is the throttling result enum for the transaction of interest.
// Throttling happens based on the amount, frequency, etc.
func (w *Worker) throttleTxs(selected types.Transactions, recentTxsStats types.RecentTxsStats, txsThrottleConfig *shardingconfig.TxsThrottleConfig, tx *types.Transaction) (common.Address, shardingconfig.TxThrottleFlag) {
var sender common.Address
msg, err := tx.AsMessage(types.MakeSigner(w.config, w.chain.CurrentBlock().Number()))
if err != nil {
utils.Logger().Error().Err(err).Str("txId", tx.Hash().Hex()).Msg("Error when parsing tx into message")
} else {
sender = msg.From()
}
// already selected max num txs
if len(selected) > txsThrottleConfig.MaxNumTxsPerBlockLimit {
utils.Logger().Info().Str("txId", tx.Hash().Hex()).Int("MaxNumTxsPerBlockLimit", txsThrottleConfig.MaxNumTxsPerBlockLimit).Msg("Throttling tx with max num txs per block limit")
return sender, shardingconfig.TxUnselect
}
// throttle a single sender sending too many transactions in one block
if tx.Value().Cmp(txsThrottleConfig.MaxTxAmountLimit) > 0 {
utils.Logger().Info().Str("txId", tx.Hash().Hex()).Uint64("MaxTxAmountLimit", txsThrottleConfig.MaxTxAmountLimit.Uint64()).Uint64("txAmount", tx.Value().Uint64()).Msg("Throttling tx with max amount limit")
return sender, shardingconfig.TxInvalid
}
// throttle too large transaction
var numTxsPastHour uint64
for _, blockTxsCounts := range recentTxsStats {
numTxsPastHour += blockTxsCounts[sender]
}
if numTxsPastHour >= txsThrottleConfig.MaxNumRecentTxsPerAccountLimit {
utils.Logger().Info().Str("txId", tx.Hash().Hex()).Uint64("MaxNumRecentTxsPerAccountLimit", txsThrottleConfig.MaxNumRecentTxsPerAccountLimit).Msg("Throttling tx with max txs per account in a single block limit")
return sender, shardingconfig.TxInvalid
}
return sender, shardingconfig.TxSelect
}
// SelectTransactionsForNewBlock selects transactions for new block. // SelectTransactionsForNewBlock selects transactions for new block.
func (w *Worker) SelectTransactionsForNewBlock(txs types.Transactions, maxNumTxs int, coinbase common.Address) (types.Transactions, types.Transactions, types.Transactions) { func (w *Worker) SelectTransactionsForNewBlock(newBlockNum uint64, txs types.Transactions, recentTxsStats types.RecentTxsStats, txsThrottleConfig *shardingconfig.TxsThrottleConfig, coinbase common.Address) (types.Transactions, types.Transactions, types.Transactions) {
if w.current.gasPool == nil { if w.current.gasPool == nil {
w.current.gasPool = new(core.GasPool).AddGas(w.current.header.GasLimit) w.current.gasPool = new(core.GasPool).AddGas(w.current.header.GasLimit)
} }
selected := types.Transactions{} selected := types.Transactions{}
unselected := types.Transactions{} unselected := types.Transactions{}
invalid := types.Transactions{} invalid := types.Transactions{}
@ -57,20 +97,41 @@ func (w *Worker) SelectTransactionsForNewBlock(txs types.Transactions, maxNumTxs
invalid = append(invalid, tx) invalid = append(invalid, tx)
continue continue
} }
sender, flag := w.throttleTxs(selected, recentTxsStats, txsThrottleConfig, tx)
switch flag {
case shardingconfig.TxUnselect:
unselected = append(unselected, tx)
case shardingconfig.TxInvalid:
invalid = append(invalid, tx)
case shardingconfig.TxSelect:
snap := w.current.state.Snapshot() snap := w.current.state.Snapshot()
_, err := w.commitTransaction(tx, coinbase) _, err := w.commitTransaction(tx, coinbase)
if len(selected) > maxNumTxs {
unselected = append(unselected, tx)
} else {
if err != nil { if err != nil {
w.current.state.RevertToSnapshot(snap) w.current.state.RevertToSnapshot(snap)
invalid = append(invalid, tx) invalid = append(invalid, tx)
utils.Logger().Debug().Err(err).Msg("Invalid transaction") utils.Logger().Error().Err(err).Str("txId", tx.Hash().Hex()).Msg("Commit transaction error")
} else { } else {
selected = append(selected, tx) selected = append(selected, tx)
// handle the case when msg was not able to extracted from tx
if len(sender.String()) > 0 {
recentTxsStats[newBlockNum][sender]++
}
} }
} }
// log invalid or unselected txs
if flag == shardingconfig.TxUnselect || flag == shardingconfig.TxInvalid {
utils.Logger().Info().Str("txId", tx.Hash().Hex()).Str("txThrottleFlag", flag.String()).Msg("Transaction Throttle flag")
} }
utils.Logger().Info().Str("txId", tx.Hash().Hex()).Uint64("txGasLimit", tx.Gas()).Msg("Transaction gas limit info")
}
utils.Logger().Info().Uint64("newBlockNum", newBlockNum).Uint64("blockGasLimit", w.current.header.GasLimit).Uint64("blockGasUsed", w.current.header.GasUsed).Msg("Block gas limit and usage info")
return selected, unselected, invalid return selected, unselected, invalid
} }

@ -7,6 +7,7 @@ SRC[harmony]=cmd/harmony/main.go
SRC[txgen]=cmd/client/txgen/main.go SRC[txgen]=cmd/client/txgen/main.go
SRC[bootnode]=cmd/bootnode/main.go SRC[bootnode]=cmd/bootnode/main.go
SRC[wallet]="cmd/client/wallet/main.go cmd/client/wallet/generated_wallet.ini.go" SRC[wallet]="cmd/client/wallet/main.go cmd/client/wallet/generated_wallet.ini.go"
SRC[wallet_stress_test]="cmd/client/wallet_stress_test/main.go cmd/client/wallet_stress_test/generated_wallet.ini.go"
BINDIR=bin BINDIR=bin
BUCKET=unique-bucket-bin BUCKET=unique-bucket-bin

Loading…
Cancel
Save