Ethereum Golang API
The requirements to develop are:
- Golang version 1.14 or later
- NewWeb3()
- SetChainId(chainId int64)
- SetAccount(privateKey string) error
- GetBlockNumber()
- GetNonce(addr common.Address, blockNumber *big.Int) (uint64, error)
- NewContract(abiString string, contractAddr ...string) (*Contract, error)
- Call(methodName string, args ...interface{}) (interface{}, error)
- EncodeABI(methodName string, args ...interface{}) ([]byte, error)
- SendRawTransaction(to common.Address,amount *big.Int,gasLimit uint64,gasPrice *big.Int,data []byte) (common.Hash, error)
Creates a new web3 instance with http provider.
// change to your rpc provider
var rpcProviderURL = "https://rpc.flashbots.net"
web3, err := web3.NewWeb3(rpcProviderURL)
if err != nil {
panic(err)
}
Get current block number.
blockNumber, err := web3.Eth.GetBlockNumber()
if err != nil {
panic(err)
}
fmt.Println("Current block number: ", blockNumber)
// => Current block number: 11997285
Setup chainId for different network.
web3.Eth.SetChainId(1)
Setup default account with privateKey (hex format)
pv, err := crypto.GenerateKey()
if err != nil {
panic(err)
}
privateKey := hex.EncodeToString(crypto.FromECDSA(pv))
err := web3.Eth.SetAccount(privateKey)
if err != nil {
panic(err)
}
Get transaction nonce for address
nonce, err := web3.Eth.GetNonce(web3.Eth.Address(), nil)
if err != nil {
panic(err)
}
fmt.Println("Latest nonce: ", nonce)
// => Latest nonce: 1
Init contract api
abiString := `[
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]`
contractAddr := "0x6B175474E89094C44Da98b954EedeAC495271d0F" // contract address
contract, err := web3.Eth.NewContract(abiString, contractAddr)
if err != nil {
panic(err)
}
Contract call method
totalSupply, err := contract.Call("totalSupply")
if err != nil {
panic(err)
}
fmt.Printf("Total supply %v\n", totalSupply)
// => Total supply 10000000000
EncodeABI data
data, err := contract.EncodeABI("balanceOf", web3.Eth.Address())
if err != nil {
panic(err)
}
fmt.Printf("Data %x\n", data)
// => Data 70a08231000000000000000000000000c13a163dd812ed7eb8bb9152651054eae5ee0999
SendRawTransaction(to common.Address,amount *big.Int,gasLimit uint64,gasPrice *big.Int,data []byte) (common.Hash, error)
Send transaction
txHash, err := web3.Eth.SendRawTransaction(
common.HexToAddress(tokenAddr),
big.NewInt(0),
gasLimit,
web3.Utils.ToGWei(1),
approveInputData,
)
if err != nil {
panic(err)
}
fmt.Printf("Send approve tx hash %v\n", txHash)
// => Send approve tx hash 0x837136c8b6f34b519c049d1cf703d3bba47d32f6801c25d83d0113bdc0e6936a
Go-Web3 welcome contributions. Please follow the guidelines when opening issues and contributing code to the repo.
We follow the fork-and-pull Git workflow:
- Fork the repo on GitHub
- Clone it to your own machine
- Commit changes to your fork
- Push changes to your fork
- Submit a Pull request for review
NOTE: Be sure to merge the latest changes before making a pull request!
As outlined in Keavy McMinn's article "How to write the perfect pull request", you should include:
- The purpose of the PR
- A brief overview of what you did
- Tag any issues that the PR relates to and close issues with a keyword
- What kind of feedback you're looking for (if any)
- Tag individuals you want feedback from (if any)
Feel free to submit issues and enhancement requests here. Please consider how to ask a good question and take the time to research your issue before asking for help.
Duplicate questions will be closed.
The go-web3 source code is available under the LGPL-3.0 license.