Skip to main content

Transactions on Ganache using Golang

 

Previous Topic: Connect to Ganache using golang

In the pervious topic, we showed how to connect with ganache and retrieving balance for the account using Golang. Now, we are going to transfer some ethers from one account to another account using Golang.

Transfer Fund:

Here we are going to transfer 5 ethers,

From Address : 0x532205E897418D09F2C0253E5A31e666eE87cb1A

To Address : 0x3fCf008C3d40C0af410CD122F00eFA77288A2E13

Each account has balance of 100 eth.



First, we need to find the nonce of the From Address and generate the unsigned raw transaction and using the private key of the From Address sign the unsigned raw transaction. 
To get the Private Key follow the steps:
1. Click the show keys.
2. We will able to see the private key details of the respective address.
After Signing the transaction, we need to broadcast that signed transaction in the network.
 package main

 import (
	"context"
	"fmt"
	"log"
	"math/big"
	"strings"

	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/crypto"
	"github.com/ethereum/go-ethereum/ethclient"
 )

 func main() {

	client, err := ethclient.Dial("http://127.0.0.1:7545")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("Connection with ganache successful")

	fromAddress := common.HexToAddress("0x532205E897418D09F2C0253E5A31e666eE87cb1A")
	toAddress := common.HexToAddress("0x3fCf008C3d40C0af410CD122F00eFA77288A2E13")

	chainId, err := client.ChainID(context.Background())
	if err != nil {
		log.Fatal(err)
	}

	nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
	if err != nil {
		log.Fatal(err)
	}

	// amount of the ethers needs to be transfer in wei
	value := big.NewInt(5000000000000000000)

	var gasLimit = uint64(21000)

	gasPrice, err := client.SuggestGasPrice(context.Background())
	if err != nil {
		log.Fatal(err)
	}

	// Generating unsinged Raw tx
	var data []byte
	var rawTxObject types.LegacyTx
	rawTxObject.Nonce = nonce
	rawTxObject.Data = data
	rawTxObject.To = &toAddress
	rawTxObject.Gas = gasLimit
	rawTxObject.GasPrice = gasPrice
	rawTxObject.Value = value

	rawTx := types.NewTx(&rawTxObject)

	fmt.Println("Raw Unsigned transaction generated successfully")

	// Signing the Tx
	fromAddressPrivKey := "0x90f4d50d7e43a0c6312bc55754b5c8b888090df72f3407cfb69c0d3965864f90"
	fromAddressPrivKey = strings.TrimPrefix(fromAddressPrivKey, "0x")

	prvKey, err := crypto.HexToECDSA(fromAddressPrivKey)
	if err != nil {
		log.Fatal(err)
	}

	signedTx, err := types.SignTx(rawTx, types.LatestSignerForChainID(chainId), prvKey)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("signing the transaction successfully done")

	// Broadcasting Tx

	err = client.SendTransaction(context.Background(), signedTx)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("broadcasting the transaction successfully done")
	fmt.Println("Tx hash :", signedTx.Hash().Hex())
 }

Output:

Connection with ganache successful
Raw Unsigned transaction generated successfully
signing the transaction successfully done
broadcasting the transaction successfully done
Tx hash : 0xdb09d87c8f99368b7dc88e3973499e1728bc77558beefbe2ebe845e6a5474aa3



Now, The transferring funds from one account to another account is done in Ganache using Golang. You can able to see the block details and transaction details in the Ganache.

Comments

Popular posts from this blog

Ethereum Overview

Origin of Ethereum:  At Some point Blockchain technology became very popular. One Blockchain per Application. It's very difficult to create our own blockchain for every new applications. Ethereum concept came here, it's aim to create a single blockchain for that will allow to create any kind of new applications on top of it.   History of Ethereum: 2013 - Ethereum whitepaper by Vitalik buterin   2014 - Ethereum Development 2015 - Olympic Release Eth network was created 2020 - Boom in DeFi Activities 2022 - The Merge Upgrade of Execution layer Overview: Ethereum Projects: AUGUR - Prediction Market OPENSEA - digital collectibles UNISWAP - Assets Exchange COMPOUND - Leading platform Decentralized Application : Ethereum allows us to build new applications called Decentralized Applications . Just as regular applications, they run on multiple machines. But what differs them is that these machines are not owned by single group or organization. They are owned by different people in diff

Why Go Language?

Go Language: Open Source Programming language Statically Typed language Makes sharing code easy Similar to C programming language Organization that use Go includes Google, Docker, Kubernetes, Cloudflare, Dropbox, Netflix & Uber. Why Go language? C like Syntax Compiles to native code i.e. one executable file is need to run the whole program. Garbage collection Concurrency built-in language Compatibility promise → Once a program written to the go one specification will continue to compile and run correctly, over the lifetime of that specification. Why Go Compiler is fast? Simple and Minimalistic (20 keywords only) Does not allows unused dependencies No circular dependencies Does not use header files Solving Modern problems with Go: Go has concise syntax with few keywords to remember. Languages like C or C++ offers fast execution, whereas languages like Ruby or Python offers rapid application development, Go bridges these computing worlds and offers development fast. Modern Computers

Crypto ED25519 Signing and Verifying using Golang

The Edwards-curve Digital Signature Algorithm (ECDSA) is used to create a digital signature using an enhancement of the Schnorr signature with Twisted Edwards curves. Overall it is faster that many other digital signature methods, and is strong for security. One example of ECDSA is Ed25519, and which is based on Curve 25519. It generates a 64-byte signature value of (R,s), and has 32-byte values for the public and the private keys. Example : package main import ( "crypto/ed25519" "crypto/rand" "encoding/hex" "fmt" "log" ) func main() { publickey, privatekey, err := ed25519.GenerateKey(rand.Reader) if err != nil { fmt.Println("cannot generate ecdsa keys") log.Fatal(err) } msg := "hello" signedBytes := ed25519.Sign(privatekey, []byte(msg)) fmt.Println("Signed Message :", hex.EncodeToString(signedBytes)) if !ed25519.Verify(publickey, []byte(msg), signedBytes) { fmt.Println("ver