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

这篇具有很好参考价值的文章主要介绍了Go调用智能合约(附最新的SEPOLIA FAUCET整理)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1️⃣ Geth遇到的问题

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

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

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

go 自动合约,智能合约,golang,智能合约,区块链

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

go 自动合约,智能合约,golang,智能合约,区块链

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

运行结果
go 自动合约,智能合约,golang,智能合约,区块链

4️⃣ 最新的SEPOLIA FAUCET整理

截止时间:2024-01-25文章来源地址https://www.toymoban.com/news/detail-830084.html

名称 网址 能得多少(天) 获取方式 它的余额 备注
pk910 https://sepolia-faucet.pk910.de/ 0.05 - 2.5 POW 9k+ 推荐✔️
Infura https://infura.io/faucet 0.5 登录 + 要求主网络余额 446K+ at least 0.001 ETH on Ethereum Mainnet
Alchemy https://sepoliafaucet.com/ 0.5 登录就行 29k+ 推荐✔️
RockX https://access.rockx.com/faucet-sepolia 0.1 登录 + 要求主网络余额 5k+ at least 0.006ETH on Ethereum Mainnet
QuickNode https://faucet.quicknode.com/drip 0.05 - 0.1 登录 + 要求主网络余额 47k+ at least 0.001 ETH on Ethereum Mainnet
Bware Labs https://bwarelabs.com/faucets/ethereum-sepolia 0.025 - 0.1 直接领取 0.025
推特推广 0.075
1839.4 推荐✔️
Tatum https://tatum.io/faucets/sepolia 0.1 登录 + 要求主网络余额 3k+ at least 0.001 ETH on Ethereum Mainnet

到了这里,关于Go调用智能合约(附最新的SEPOLIA FAUCET整理)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hyperledger Fabric 智能合约开发及 fabric-sdk-go/fabric-gateway 使用示例

    在上个实验 Hyperledger Fabric 多组织多排序节点部署在多个主机上 中,我们已经实现了多组织多排序节点部署在多个主机上,但到目前为止,我们所有的实验都只是研究了联盟链的网络配置方法(尽管这确实是重难点),而没有考虑具体的应用开发。本文将在前面实验的基础上

    2024年01月20日
    浏览(55)
  • 【区块链 | 智能合约】Ethereum源代码(2)- go-ethereum 客户端入口代码和Node分析

    上篇提到用 make geth 来编译geth客户端。我们来看看make file做了什么: 执行了 ci.go 里面做了两件事情 1,ln -s命令在build/_workspace/ 目录上生成了go-etherum的一个文件镜像,不占用磁盘空间,与源文件同步更新 2

    2024年02月03日
    浏览(41)
  • 智能合约:从 Python 调用智能合约

    以太坊带来了智能合约的进步,其是可公开验证的代码。如果我们改变合约状态,我们将花费一些gas。现在,让我们创建一个Python程序,它可以在以太坊上调用智能合约。因为我们不想实验中支付费用,所以我们将运行Ganache,这是一个本地以太坊实例。 首先,我们去Remix.e

    2024年01月19日
    浏览(64)
  • 智能合约中如何调用其他智能合约

    智能合约是区块链技术中的一项关键功能,它可以让开发者编写代码来自动执行一系列的操作,从而实现各种复杂的业务逻辑。在许多应用场景中,一个智能合约可能需要调用另一个智能合约来完成某些任务。本文将介绍智能合约如何调用其他智能合约,并提供一些实例来帮

    2024年02月11日
    浏览(42)
  • Java智能合约工具包|Java调用智能合约|Java调用ERC20、ERC721、ERC1155合约

    Magician-ContractsTools是一个用于调用智能合约的工具包,你可以非常容易地在Java程序中调用智能合约进行查询和写入操作。 有三个内置的标准合约模板,分别是ERC20、ERC721和ERC1155,如果你需要调用这三个合约中的标准函数,可以帮助你非常快速地完成工作。除了内置的合同模板

    2024年02月11日
    浏览(52)
  • 复杂gRPC之go调用go

    我们使用了一个较为复杂的proto文件,这个文件的功能主要是用来定位的,详细内容可以看代码中的注解 相比之前的文件来说,这个方法中定义了四种类型的方法。 ● 简单的RPC接口   ○ 客户端使用存根发送请求到服务器并等待响应返回,就像平常的函数调用一样。 ● 一个

    2024年02月05日
    浏览(43)
  • 如何在智能合约中调用另一个合约的函数

    智能合约是在区块链中被执行的一段程序,因为它们在区块链上执行,所以不依赖于任何的中心化服务器。目前最主流的智能合约编程语言是 Solidity。 在以太坊区块链中,智能合约可以和其他已经部署的智能合约进行交互。除了以太坊,其他 EVM 兼容的区块链(使用以太坊虚

    2024年01月22日
    浏览(53)
  • golang调用智能合约,获取合约函数的返回值

    如果不是只读取数据的合约函数,需要异步的执行,因此并不能直接获取到合约函数的返回值,需要等到交易执行完毕,得到确认后才能获取到合约函数的返回值。而且合约函数返回值一般是通过事件日志获取到的。 这里给出一个例子来展示我是如何获取合约函数返回值的。

    2024年03月11日
    浏览(51)
  • 区块链web3智能合约Solidity学习资源整理

    Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。 Solidity中文官方文档: https://solidity-cn.readthedocs.io/zh/develop/ https://learnblockchain.cn/docs/solidity/index.html 在线rem

    2024年03月19日
    浏览(69)
  • 智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

    Safful发现了一个有趣的错误,有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。 这篇文章对 ERC777 进行了全面的解释,涵盖了所有必要的细节。深入研究 ERC777 代币的具体细节的资源

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包