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

2024-02-11 12:30

本文主要是介绍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转账8ETFfunction 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 mainimport (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)}// 合约地址AcontractAddr_A := "0xc3c4496703aa619684bdE1c04FE7bD1deFa9f0bA"contractAddress_A := common.HexToAddress(contractAddr_A)// 合约的地址BcontractAddr_B := "0x4396817641d7C12Fb64686E264C87765Ce4BDaDC"contractAddress_B := common.HexToAddress(contractAddr_B)// 账户地址BaccountAddr_B := "0x5828fb6c1ac9158F3638e1E14348c977F0C733C3"accountAddress_B := common.HexToAddress(accountAddr_B)// 账户地址AprivateKey, 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 -> 合约Aauth.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

这篇关于Go调用智能合约(附最新的SEPOLIA FAUCET整理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699775

相关文章

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow