diff --git a/node/contract.go b/node/contract.go index 02a33393b..6aa414d30 100644 --- a/node/contract.go +++ b/node/contract.go @@ -4,6 +4,7 @@ import ( "crypto/ecdsa" "math/big" "strings" + "sync/atomic" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -170,8 +171,8 @@ func (node *Node) CallFaucetContract(address common.Address) common.Hash { } func (node *Node) callGetFreeToken(address common.Address) common.Hash { - nonce := node.GetNonceOfAddress(crypto.PubkeyToAddress(node.ContractDeployerKey.PublicKey)) - return node.callGetFreeTokenWithNonce(address, nonce) + nonce := atomic.AddUint64(&node.ContractDeployerCurrentNonce, 1) + return node.callGetFreeTokenWithNonce(address, nonce-1) } func (node *Node) callGetFreeTokenWithNonce(address common.Address, nonce uint64) common.Hash { diff --git a/node/node.go b/node/node.go index f2b20595d..5aafad723 100644 --- a/node/node.go +++ b/node/node.go @@ -144,9 +144,10 @@ type Node struct { Address common.Address // For test only - TestBankKeys []*ecdsa.PrivateKey - ContractDeployerKey *ecdsa.PrivateKey - ContractAddresses []common.Address + TestBankKeys []*ecdsa.PrivateKey + ContractDeployerKey *ecdsa.PrivateKey + ContractDeployerCurrentNonce uint64 // The nonce of the deployer contract at current block + ContractAddresses []common.Address // Shard group Message Receiver shardGroupReceiver p2p.GroupReceiver diff --git a/node/node_handler.go b/node/node_handler.go index a7de6831e..83a17d2f9 100644 --- a/node/node_handler.go +++ b/node/node_handler.go @@ -11,9 +11,12 @@ import ( "os" "os/exec" "strconv" + "sync/atomic" "syscall" "time" + "github.com/ethereum/go-ethereum/crypto" + "github.com/harmony-one/harmony/core" "github.com/ethereum/go-ethereum/common" @@ -315,6 +318,10 @@ func (node *Node) PostConsensusProcessing(newBlock *types.Block) { node.AddNewBlock(newBlock) + // Update contract deployer's nonce so default contract like faucet can issue transaction with current nonce + nonce := node.GetNonceOfAddress(crypto.PubkeyToAddress(node.ContractDeployerKey.PublicKey)) + atomic.StoreUint64(&node.ContractDeployerCurrentNonce, nonce) + if node.Consensus.ShardID == 0 { // ConfirmedBlockChannel which is listened by drand leader who will initiate DRG if its a epoch block (first block of a epoch)