Go调用智能合约(附最新的SEPOLIA FAUCET整理)

1️⃣ Geth遇到的问题

Geth的安装很容易,下载安装即可(需要勾选 develop tools),我安装的是1.13.10版本,看其他博客和教程大部分都是版本710,有些操作没办法照搬

问题:没办法挖矿【miner.start()后返回nulleth_mining返回ture,但实际上并没有挖矿】==> 没法去部署合约
解决方法:

  1. 设置–-dev.period 1 开发者模式,直接可以得到一个无限以太坊且自动挖矿的账户
  2. 等一段时间,但一般没有用

在这里插入图片描述

官方的示例是在sepolia测试网络上进行的,新账户需要先获取一些以太坊(可以从https://sepoliafaucet.com/)中获取,一天可以获取0.5ETF

在这里插入图片描述

Geth develop tools还是要安装的,因为需要它的abigen工具

2️⃣ Ganache

新手,我还是想运行起来再说,安装了ganache

# 安装
yarn add ganache
# 启动
yarn run ganache --port 8877

Remix选择Dev - Ganache Provider即可连接

3️⃣ remix-desktop 启动失败

remix-desktop本地版本(v1.3.6)也是一直卡在启动页,试了npm install --global --production windows-build-tools方法没有成功

4️⃣ Go调用智能合约

主要测试转账:整体转账思路: 账户A => 9ETF => 合约B => 8ETF => 合约A => 5ETF => 账户B

  1. 简单的合约ContractA
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;

contract ContractA {
    string public globalVariable = "Hello from ContractA";

    function set_globalVariable(string calldata  _str) public  {
        globalVariable = _str;
    }
    // 获取指定地址的合约的余额
    function get_contract_balance(address _to) public view returns(uint256){
        return address(_to).balance;
    } 
	// 往ContractA合约转账
    function contract_get_money() public payable{}
    // 往指定账户地址转账
    function transfer_5ETF_to_account(address payable  _to) public payable{
        _to.transfer(5e18);
    }
}

contract ContractB {

    ContractA public cb;

    // 1. 往ContractB合约转账
    function contract_get_money() public payable{}
    // 2. 获取ContractA的地址
    function get_contractA_addr(address addr) public {
        cb = ContractA(addr);
    }
    // 3. 往ContractA转账8ETF
    function pay_5ETF_to_ContractA() public {
        cb.contract_get_money{value: 8e18}();
    }
}
  1. 编译后获取ContractA.abiContractB.abi
  2. 使用Abigen编译智能合约为 Go 代码
EX: bigen --abi xx.abi --pkg packagename --type structname --out xx.go 
abigen --abi ContractA.abi --pkg contract --type contractA --out contractA.go //  ContractA.abi 在文件夹contract 中
abigen --abi ContractB.abi --pkg contract --type contractB --out contractB.go //  ContractA.abi 在文件夹contract 中
  1. go源码
package main

import (
	contract "etf_go/utils/contract/abi"
	"fmt"
	"log"
	"math/big"

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

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

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

var (
	PrivateKey string = "60e392de15eaac342c81982eef77722efcabc0a8df70c4f113d9df75406102f3"
)

func main() {

	client, err_client := ethclient.Dial("http://localhost:8877")
	if err_client != nil {
		log.Fatal(err_client)
	}

	// 合约地址A
	contractAddr_A := "0xc3c4496703aa619684bdE1c04FE7bD1deFa9f0bA"
	contractAddress_A := common.HexToAddress(contractAddr_A)
	// 合约的地址B
	contractAddr_B := "0x4396817641d7C12Fb64686E264C87765Ce4BDaDC"
	contractAddress_B := common.HexToAddress(contractAddr_B)
	// 账户地址B
	accountAddr_B := "0x5828fb6c1ac9158F3638e1E14348c977F0C733C3"
	accountAddress_B := common.HexToAddress(accountAddr_B)
	// 账户地址A
	privateKey, err_privateKey := crypto.HexToECDSA(PrivateKey)
	if err_privateKey != nil {
		log.Fatal(err_privateKey)
	}
	auth, err_auth := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(1337))
	if err_auth != nil {
		log.Fatal(err_auth)
	}

	contractObj_A, err_ca := contract.NewContractA(contractAddress_A, client)
	if err_ca != nil {
		log.Fatal(err_ca)
	}
	contractObj_B, err_cb := contract.NewContractB(contractAddress_B, client)
	if err_cb != nil {
		log.Fatal(err_cb)
	}

	globalVariable, _ := contractObj_A.GlobalVariable(nil)
	fmt.Println(globalVariable) // Hello from ContractA
	_, err := contractObj_A.SetGlobalVariable(auth, "Hello world!")
	if err != nil {
		return
	}
	newGlobalVariable, _ := contractObj_A.GlobalVariable(nil)
	fmt.Println(newGlobalVariable) // Hello world!

	/*
		整体转账思路: 账户A -> 9ETF -> 合约B -> 8ETF -> 合约A -> 5ETF -> 账户B
	*/

	// 转账金额
	auth.Value = big.NewInt(9000000000000000000)
	// 1. 账户A -> 合约B
	_, err_tx := contractObj_B.ContractGetMoney(auth)
	if err_tx != nil {
		log.Fatal(err_tx)
	}
	// 查看合约B余额
	contractBalance_B, err_contractbalance_b := contractObj_A.GetContractBalance(nil, contractAddress_B)
	if err_contractbalance_b != nil {
		log.Fatal(err_contractbalance_b)
	}
	fmt.Println("1. 账户A -> 合约B contractBalance_B:", contractBalance_B) // 9ETF

	// 2. 合约B -> 合约A
	auth.Value = big.NewInt(0)
	// 设置合约A地址
	_, errsetContractAddress_A := contractObj_B.GetContractAAddr(auth, contractAddress_A)
	if errsetContractAddress_A != nil {
		log.Fatal(errsetContractAddress_A)
	}
	// 转账
	_, errPayToConA := contractObj_B.Pay5ETFToContractA(auth)
	if errPayToConA != nil {
		log.Fatal(errPayToConA)
	}
	// 查看合约A余额
	contractBalance_A, err_contractbalance_a := contractObj_A.GetContractBalance(nil, contractAddress_A)
	if err_contractbalance_a != nil {
		log.Fatal(err_contractbalance_a)
	}
	fmt.Println("2. 合约B -> 合约A contractBalance_A:", contractBalance_A) // 8ETF

	// 3. 合约 -> 账户
	// 记得先要往合约里转钱
	_, err_accountAddress_B := contractObj_A.Transfer5ETFToAccount(auth, accountAddress_B)
	if err_accountAddress_B != nil {
		log.Fatal(err_accountAddress_B)
	}
	// 查看账户余额
	accountAddressBalance_B, err_balance := contractObj_A.GetContractBalance(nil, accountAddress_B)
	if err_balance != nil {
		log.Fatal(err_balance)
	}
	fmt.Println("3. 合约 -> 账户 accountAddressBalance_B:", accountAddressBalance_B) //1000 + 5 = 1005ETF

}

文件结构

+---contract
|   |   contractA_main.go
|   |
|   \---abi
|           ContractA.abi
|           contractA.go
|           ContractB.abi
|           contractB.go

运行结果
请添加图片描述

4️⃣ 最新的SEPOLIA FAUCET整理

截止时间:2024-01-25

名称网址能得多少(天)获取方式它的余额备注
pk910https://sepolia-faucet.pk910.de/0.05 - 2.5POW9k+推荐✔️
Infurahttps://infura.io/faucet0.5登录 + 要求主网络余额446K+at least 0.001 ETH on Ethereum Mainnet
Alchemyhttps://sepoliafaucet.com/0.5登录就行29k+推荐✔️
RockXhttps://access.rockx.com/faucet-sepolia0.1登录 + 要求主网络余额5k+at least 0.006ETH on Ethereum Mainnet
QuickNodehttps://faucet.quicknode.com/drip0.05 - 0.1登录 + 要求主网络余额47k+at least 0.001 ETH on Ethereum Mainnet
Bware Labshttps://bwarelabs.com/faucets/ethereum-sepolia0.025 - 0.1直接领取 0.025
推特推广 0.075
1839.4推荐✔️
Tatumhttps://tatum.io/faucets/sepolia0.1登录 + 要求主网络余额3k+at least 0.001 ETH on Ethereum Mainnet
  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值