diff --git a/node/node.go b/node/node.go index 1d6ef5344..ac07250a0 100644 --- a/node/node.go +++ b/node/node.go @@ -285,8 +285,8 @@ func New(host p2p.Host, consensus *bft.Consensus, db ethdb.Database) *Node { node.BlockChannel = make(chan *types.Block) node.TxPool = core.NewTxPool(core.DefaultTxPoolConfig, params.TestChainConfig, chain) node.Worker = worker.New(params.TestChainConfig, chain, node.Consensus, pki.GetAddressFromPublicKey(node.SelfPeer.PubKey), node.Consensus.ShardID) - node.AccountKey, node.Address = GetAccountReady(node.SelfPeer.IP, node.SelfPeer.Port) - + node.AccountKey, _ = ecdsa.GenerateKey(crypto.S256(), strings.NewReader(node.SelfPeer.IP+node.SelfPeer.Port)) + node.FundMyAccount() node.AddFaucetContractToPendingTransactions() if node.Role == BeaconLeader { node.AddDepositContractToPendingTransactions() @@ -428,41 +428,6 @@ func (node *Node) GetSyncingPeers() []p2p.Peer { return res } -// CreateStakingDepositTransaction creates a new deposit staking transaction -func (node *Node) CreateStakingDepositTransaction(stake int) (*types.Transaction, error) { - //These should be read from somewhere. - DepositContractPriKey, _ := ecdsa.GenerateKey(crypto.S256(), strings.NewReader("Deposit Smart Contract Key")) //DepositContractPriKey is pk for contract - DepositContractAddress := crypto.PubkeyToAddress(DepositContractPriKey.PublicKey) //DepositContractAddress is the address for the contract - - state, err := node.blockchain.State() - if err != nil { - log.Error("Failed to get chain state", "Error", err) - } - nonce := state.GetNonce(crypto.PubkeyToAddress(DepositContractPriKey.PublicKey)) - callingFunction := "0xd0e30db0" - dataEnc := common.FromHex(callingFunction) //Deposit Does not take a argument, stake is transferred via amount. - tx, err := types.SignTx(types.NewTransaction(nonce, DepositContractAddress, node.Consensus.ShardID, big.NewInt(int64(stake)), params.TxGasContractCreation*10, nil, dataEnc), types.HomesteadSigner{}, node.AccountKey) - return tx, err -} - -//CreateStakingWithdrawTransaction creates a new withdraw stake transaction -func (node *Node) CreateStakingWithdrawTransaction(stake int) (*types.Transaction, error) { - //These should be read from somewhere. - DepositContractPriKey, _ := ecdsa.GenerateKey(crypto.S256(), strings.NewReader("Deposit Smart Contract Key")) //DepositContractPriKey is pk for contract - DepositContractAddress := crypto.PubkeyToAddress(DepositContractPriKey.PublicKey) //DepositContractAddress is the address for the contract - - state, err := node.blockchain.State() - if err != nil { - log.Error("Failed to get chain state", "Error", err) - } - nonce := state.GetNonce(crypto.PubkeyToAddress(DepositContractPriKey.PublicKey)) - callingFunction := "0x2e1a7d4d" - contractData := callingFunction + hex.EncodeToString([]byte(strconv.Itoa(stake))) - dataEnc := common.FromHex(contractData) - tx, err := types.SignTx(types.NewTransaction(nonce, DepositContractAddress, node.Consensus.ShardID, big.NewInt(0), params.TxGasContractCreation*10, nil, dataEnc), types.HomesteadSigner{}, node.AccountKey) - return tx, err -} - //AddFaucetContractToPendingTransactions adds the faucet contract the genesis block. func (node *Node) AddFaucetContractToPendingTransactions() { // Add a contract deployment transactionv @@ -470,25 +435,34 @@ func (node *Node) AddFaucetContractToPendingTransactions() { contractData := "0x6080604052678ac7230489e8000060015560028054600160a060020a031916331790556101aa806100316000396000f3fe608060405260043610610045577c0100000000000000000000000000000000000000000000000000000000600035046327c78c42811461004a5780634ddd108a1461008c575b600080fd5b34801561005657600080fd5b5061008a6004803603602081101561006d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166100b3565b005b34801561009857600080fd5b506100a1610179565b60408051918252519081900360200190f35b60025473ffffffffffffffffffffffffffffffffffffffff1633146100d757600080fd5b600154303110156100e757600080fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526020819052604090205460ff161561011a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260208190526040808220805460ff1916600190811790915554905181156108fc0292818181858888f19350505050158015610175573d6000803e3d6000fd5b5050565b30319056fea165627a7a723058203e799228fee2fa7c5d15e71c04267a0cc2687c5eff3b48b98f21f355e1064ab30029" dataEnc := common.FromHex(contractData) // Unsigned transaction to avoid the case of transaction address. - contractFunds := big.NewInt(8000000) contractFunds = contractFunds.Mul(contractFunds, big.NewInt(params.Ether)) mycontracttx, _ := types.SignTx(types.NewContractCreation(uint64(0), node.Consensus.ShardID, contractFunds, params.TxGasContractCreation*10, nil, dataEnc), types.HomesteadSigner{}, priKey) node.ContractAddresses = append(node.ContractAddresses, crypto.CreateAddress(crypto.PubkeyToAddress(priKey.PublicKey), uint64(0))) - node.addPendingTransactions(types.Transactions{mycontracttx}) } +//CallFaucetContract invokes the faucet contract to give the walletAddress initial money +func (node *Node) CallFaucetContract(walletAddress common.Address) common.Hash { + state, err := node.blockchain.State() + if err != nil { + log.Error("Failed to get chain state", "Error", err) + } + nonce := state.GetNonce(crypto.PubkeyToAddress(node.ContractKeys[0].PublicKey)) + callingFunction := "0x27c78c42000000000000000000000000" + contractData := callingFunction + hex.EncodeToString(walletAddress.Bytes()) + dataEnc := common.FromHex(contractData) + tx, _ := types.SignTx(types.NewTransaction(nonce, node.ContractAddresses[0], node.Consensus.ShardID, big.NewInt(0), params.TxGasContractCreation*10, nil, dataEnc), types.HomesteadSigner{}, node.ContractKeys[0]) + node.addPendingTransactions(types.Transactions{tx}) + return tx.Hash() +} + //AddDepositContractToPendingTransactions adds the deposit smart contract the genesis block. func (node *Node) AddDepositContractToPendingTransactions() { //These should be read from somewhere. DepositContractPriKey, _ := ecdsa.GenerateKey(crypto.S256(), strings.NewReader("Deposit Smart Contract Key")) //DepositContractPriKey is pk for contract DepositContractAddress := crypto.PubkeyToAddress(DepositContractPriKey.PublicKey) //DepositContractAddress is the address for the contract - - // Add a contract deployment transaction - //Generate contract key and associate funds with the smart contract - //Initially the smart contract should have minimal funds. contractFunds := big.NewInt(0) contractFunds = contractFunds.Mul(contractFunds, big.NewInt(params.Ether)) @@ -501,20 +475,38 @@ func (node *Node) AddDepositContractToPendingTransactions() { node.addPendingTransactions(types.Transactions{mycontracttx}) } -//CallFaucetContract invokes the faucet contract to give the walletAddress initial money -func (node *Node) CallFaucetContract(walletAddress common.Address) common.Hash { +// CreateStakingDepositTransaction creates a new deposit staking transaction +func (node *Node) CreateStakingDepositTransaction(stake int) (*types.Transaction, error) { + //These should be read from somewhere. + DepositContractPriKey, _ := ecdsa.GenerateKey(crypto.S256(), strings.NewReader("Deposit Smart Contract Key")) //DepositContractPriKey is pk for contract + DepositContractAddress := crypto.PubkeyToAddress(DepositContractPriKey.PublicKey) //DepositContractAddress is the address for the contract state, err := node.blockchain.State() if err != nil { log.Error("Failed to get chain state", "Error", err) } - nonce := state.GetNonce(crypto.PubkeyToAddress(node.ContractKeys[0].PublicKey)) - callingFunction := "0x27c78c42000000000000000000000000" - contractData := callingFunction + hex.EncodeToString(walletAddress.Bytes()) - dataEnc := common.FromHex(contractData) - tx, _ := types.SignTx(types.NewTransaction(nonce, node.ContractAddresses[0], node.Consensus.ShardID, big.NewInt(0), params.TxGasContractCreation*10, nil, dataEnc), types.HomesteadSigner{}, node.ContractKeys[0]) + nonce := state.GetNonce(crypto.PubkeyToAddress(DepositContractPriKey.PublicKey)) + callingFunction := "0xd0e30db0" + dataEnc := common.FromHex(callingFunction) //Deposit Does not take a argument, stake is transferred via amount. + tx, err := types.SignTx(types.NewTransaction(nonce, DepositContractAddress, node.Consensus.ShardID, big.NewInt(int64(stake)), params.TxGasContractCreation*10, nil, dataEnc), types.HomesteadSigner{}, node.AccountKey) + return tx, err +} - node.addPendingTransactions(types.Transactions{tx}) - return tx.Hash() +//CreateStakingWithdrawTransaction creates a new withdraw stake transaction +func (node *Node) CreateStakingWithdrawTransaction(stake int) (*types.Transaction, error) { + //These should be read from somewhere. + DepositContractPriKey, _ := ecdsa.GenerateKey(crypto.S256(), strings.NewReader("Deposit Smart Contract Key")) //DepositContractPriKey is pk for contract + DepositContractAddress := crypto.PubkeyToAddress(DepositContractPriKey.PublicKey) //DepositContractAddress is the address for the contract + + state, err := node.blockchain.State() + if err != nil { + log.Error("Failed to get chain state", "Error", err) + } + nonce := state.GetNonce(crypto.PubkeyToAddress(DepositContractPriKey.PublicKey)) + callingFunction := "0x2e1a7d4d" + contractData := callingFunction + hex.EncodeToString([]byte(strconv.Itoa(stake))) + dataEnc := common.FromHex(contractData) + tx, err := types.SignTx(types.NewTransaction(nonce, DepositContractAddress, node.Consensus.ShardID, big.NewInt(0), params.TxGasContractCreation*10, nil, dataEnc), types.HomesteadSigner{}, node.AccountKey) + return tx, err } // JoinShard helps a new node to join a shard. @@ -771,11 +763,11 @@ func (node *Node) RunServices() { node.serviceManager.RunServices() } -//Creates node key nad address and funds them. -func (node *Node) GetAccountReady(ip, port string) (*ecdsa.PrivateKey, common.Address) { - priKey, _ := ecdsa.GenerateKey(crypto.S256(), strings.NewReader(ip+port)) - address := crypto.PubkeyToAddress(priKey.PublicKey) - //Make FaucetContract Calls with these addresses to get some money - node.CallFaucetContract(address) - return priKey, address +//FundMyAccount creates node key and address and funds them. +func (node *Node) FundMyAccount() common.Address { + //Fund the Account with the AccountKey == node.AccountKey + // Return the address of the account. + fmt.Println(node.AccountKey) + var address common.Address + return address }