The core protocol of WoopChain
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
woop/internal/genesis/genesis.go

79 lines
2.4 KiB

package genesis
import (
"crypto/ecdsa"
"fmt"
"os"
"strings"
"github.com/ethereum/go-ethereum/crypto"
"github.com/harmony-one/harmony/internal/common"
"github.com/harmony-one/harmony/internal/utils"
)
const genesisString = "https://harmony.one 'Open Consensus for 10B' 2019.06.01 $ONE"
// DeployAccount is the account used in genesis
type DeployAccount struct {
Index string // index
Address string // account address
BlsPublicKey string // account public BLS key
ShardID uint32 // shardID of the account
}
func (d DeployAccount) String() string {
6 years ago
return fmt.Sprintf("%s/%s:%d", d.Address, d.BlsPublicKey, d.ShardID)
}
// BeaconAccountPriKey is the func which generates a constant private key.
func BeaconAccountPriKey() *ecdsa.PrivateKey {
prikey, err := ecdsa.GenerateKey(crypto.S256(), strings.NewReader(genesisString))
if err != nil && prikey == nil {
utils.GetLogInstance().Error("Failed to generate beacon chain contract deployer account")
os.Exit(111)
}
return prikey
}
// FindAccount find the DeployAccount based on the account address, and the account index
// the account address could be from HarmonyAccounts or from FoundationalNodeAccounts
// the account index can be used to determin the shard of the account
func FindAccount(address string) (int, *DeployAccount) {
addr := common.ParseAddr(address)
for i, acc := range HarmonyAccounts {
if addr == common.ParseAddr(acc.Address) {
return i, &acc
}
}
for i, acc := range FoundationalNodeAccounts {
if addr == common.ParseAddr(acc.Address) {
return i + 8, &acc
}
}
return 0, nil
}
// IsBlsPublicKeyIndex returns index and DeployAccount.
func IsBlsPublicKeyIndex(blsPublicKey string) (int, *DeployAccount) {
for i, item := range HarmonyAccounts {
if item.BlsPublicKey == blsPublicKey {
return i, &item
}
}
for i, item := range FoundationalNodeAccounts {
if item.BlsPublicKey == blsPublicKey {
return i + 8, &item
}
}
return -1, nil
}
// GenesisBeaconAccountPriKey is the private key of genesis beacon account.
var GenesisBeaconAccountPriKey = BeaconAccountPriKey()
// GenesisBeaconAccountPublicKey is the private key of genesis beacon account.
var GenesisBeaconAccountPublicKey = GenesisBeaconAccountPriKey.PublicKey
// DeployedContractAddress is the deployed contract address of the staking smart contract in beacon chain.
var DeployedContractAddress = crypto.CreateAddress(crypto.PubkeyToAddress(GenesisBeaconAccountPublicKey), uint64(0))