How to interact with smart contract in GO?

0 votes
I’m modifying go-ethereum for a particular function in my application. I am writing a contract to give rewards to miners if a certain condition is met. For this, I need to change the go-ethereum to call a function that gives out reward to miners.  So I wanted to know how to build a Raw transaction in Go to call the reward function.  Can someone help me out with this?
Jul 26, 2018 in Blockchain by slayer
• 29,270 points
203 views

1 answer to this question.

0 votes

I am providing an example. Modify it according to your requirement.

store.sol

pragma solidity ^0.4.24;

contract Store {

  event ItemSet(bytes32 key, bytes32 value);

  string public version;

  mapping (bytes32 => bytes32) public items;

  constructor(string _version) public {

    version = _version;

  }

  function setItem(bytes32 key, bytes32 value) external {

    items[key] = value;

    emit ItemSet(key, value);

  }

}

main.go

package main

import (

    "context"

    "crypto/ecdsa"

    "fmt"

    "log"

    "math/big"

    "github.com/ethereum/go-ethereum/accounts/abi/bind"

    "github.com/ethereum/go-ethereum/common"

    "github.com/ethereum/go-ethereum/crypto"

    "github.com/ethereum/go-ethereum/ethclient"

    store "./contracts" // for demo

)

func main() {

    client, err := ethclient.Dial("https://rinkeby.infura.io")

    if err != nil {

        log.Fatal(err)

    }

    privateKey, err := crypto.HexToECDSA("fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19")

    if err != nil {

        log.Fatal(err)

    }

    publicKey := privateKey.Public()

    publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)

    if !ok {

        log.Fatal("error casting public key to ECDSA")

    }

    fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA)

    nonce, err := client.PendingNonceAt(context.Background(), fromAddress)

    if err != nil {

        log.Fatal(err)

    }

    gasPrice, err := client.SuggestGasPrice(context.Background())

    if err != nil {

        log.Fatal(err)

    }

    auth := bind.NewKeyedTransactor(privateKey)

    auth.Nonce = big.NewInt(int64(nonce))

    auth.Value = big.NewInt(0)     // in wei

    auth.GasLimit = uint64(300000) // in units

    auth.GasPrice = gasPrice

    address := common.HexToAddress("0x147B8eb97fD247D06C4006D269c90C1908Fb5D54")

    instance, err := store.NewStore(address, client)

    if err != nil {

        log.Fatal(err)

    }

    key := [32]byte{}

    value := [32]byte{}

    copy(key[:], []byte("foo"))

    copy(value[:], []byte("bar"))

    tx, err := instance.SetItem(auth, key, value)

    if err != nil {

        log.Fatal(err)

    }

    fmt.Printf("tx sent: %s", tx.Hash().Hex()) // tx sent: 0x8d490e535678e9a24360e955d75b27ad307bdfb97a1dca51d0f3035dcee3e870

    result, err := instance.Items(&bind.CallOpts{}, key)

    if err != nil {

        log.Fatal(err)

    }

    fmt.Println(string(result[:])) // "bar"

}

answered Jul 26, 2018 by digger
• 26,660 points

Related Questions In Blockchain

0 votes
1 answer
+1 vote
1 answer

How can nodes interact with a Smart Contract?

If you are using Remix IDE to ...READ MORE

answered Apr 27, 2018 in Blockchain by Perry
• 17,090 points
73 views
0 votes
1 answer

How do I send back ethers to the sender of the tokens in a smart contract?

Whenever a smart contract receives ether via ...READ MORE

answered May 30, 2018 in Blockchain by Perry
• 17,090 points
649 views
0 votes
1 answer

How to prevent the smart contract from being modified and deployed in the blockchain network?

To expand on Matthew's answer, each state ...READ MORE

answered Jul 5, 2018 in Blockchain by aryya
• 7,350 points
85 views
0 votes
1 answer
0 votes
1 answer

Truffle tests not running after truffle init

This was a bug. They've fixed it. ...READ MORE

answered Sep 11, 2018 in Blockchain by Christine
• 15,810 points
250 views
+1 vote
5 answers

Where does the smart contracts stored and executed on blockchain?

Ethereum smart contracts are executed on EVM ...READ MORE

answered May 2, 2018 in Blockchain by Shashank
• 10,360 points
1,761 views
0 votes
1 answer

How to use real world/live data in my smart contract?

You cant access/embed real world data using ...READ MORE

answered Jul 12, 2018 in Blockchain by digger
• 26,660 points
82 views
0 votes
1 answer

How are the ethers sent to smart contract in the IBM example?

They are in magical variable msg. The function ...READ MORE

answered Sep 28, 2018 in Blockchain by digger
• 26,660 points
40 views