1️⃣ Geth遇到的问题
Geth的安装很容易,下载安装即可(需要勾选 develop tools),我安装的是1.13.10
版本,看其他博客和教程大部分都是版本7
和10
,有些操作没办法照搬
问题:没办法挖矿【
miner.start()
后返回null
,eth_mining
返回ture
,但实际上并没有挖矿】==> 没法去部署合约
解决方法:
- 设置
–-dev.period 1
开发者模式,直接可以得到一个无限以太坊且自动挖矿的账户- 等一段时间,但一般没有用
官方的示例是在
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
- 简单的合约
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}();
}
}
- 编译后获取
ContractA.abi
和ContractB.abi
- 使用
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 中
- 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
运行结果
文章来源:https://www.toymoban.com/news/detail-830084.html
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模板网!