go语言操作以太坊智能合约

这篇具有很好参考价值的文章主要介绍了go语言操作以太坊智能合约。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

操作中要注意版本问题 geth版本、golang版本等
在remix环境中写好合约后,进行编译得到abi文件

简单举例
Hello.sol合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Hello {
    string Msg;

    function setMsg(string memory _msg) public{
        Msg=_msg;
    }

    function getMsg() view public returns(string memory){
        return Msg;
    }
}

编译后abi文件(Hello.abi)内容

[
	{
		"inputs": [],
		"name": "getMsg",
		"outputs": [
			{
				"internalType": "string",
				"name": "",
				"type": "string"
			}
		],
		"stateMutability": "view",
		"type": "function"
	},
	{
		"inputs": [
			{
				"internalType": "string",
				"name": "_msg",
				"type": "string"
			}
		],
		"name": "setMsg",
		"outputs": [],
		"stateMutability": "nonpayable",
		"type": "function"
	}
]

然后需要一个abigen工具可以将abi、bin等编译后的智能合约文件内容生成go代码
abigen可以在geth官网下载geth的时候下载Geth&Tools版本 里面带有abigen工具
go语言操作以太坊智能合约

采用以下命令将Hello.abi生成hello.go文件
其中
-out hello.go:指定输出为hello.go文件
-pkg main:指定该go文件属于哪个包
-type hello:指定合约的名称为hello

abigen -abi Hello.abi -pkg main -type hello -out hello.go

如果合约已经部署成功,采用上面的abigen生成的合约绑定就足够调用合约了,但是要部署合约还需要一些编译字节码形式的附加信息

可以通过remix合约直接得到合约编码后的字节码,也可以通过solc来编译
得到Hello.bin文件

然后 abigen 可以再次运行,这次传递 Hello.bin:

abigen --abi Hello.abi --pkg main --type Hello --out hello.go --bin Hello.bin
部署合约过程

1 连接到以太坊(创建客户端)

//1 创建客户端
	client, err := ethclient.Dial("http://localhost:8545")
	if err != nil {
		log.Panic("failed to Dail", err)
	}

2 创建一个用户部署合约的身份

//2 身份准备
//自己的账户文件的内容
var keyinfo = `{"address":"470455a4b2492d75f19ec7b29d25e19aee0c48b1","crypto":{"cipher":"aes-128-ctr","ciphertext":"08ef3a09df1d731bf71d8ce52a0fed4d4c9187f7a5ef845833bac9854700cd70","cipherparams":{"iv":"e8b8b6ed222f8906b31e391e6ef8b7d7"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"e0970e0f38759ee32152429f692df30c0b4efd1d8adef6a9cf2a58e4f67fdcc7"},"mac":"0bea42bc7c1284307f518f4939f2de3af2278ac83e329541bf9e258e107c2feb"},"id":"83cb1145-c55b-439f-a1f0-5416a3805beb","version":3}`
keyin := strings.NewReader(keyinfo)
chainID, err := client.ChainID(context.Background())
if err != nil {
	log.Panic(err)
}
auth, err := bind.NewTransactorWithChainID(keyin, "123456", chainID)
if err != nil {
	log.Panic(err)
}

3 部署合约
这里我不知道我用abigen生成的go合约代码中没有DeployHello方法

//3 部署合约
	//3 部署合约
	// 合约地址,部署交易,合约对象
	address, tx, HelloInstance, err := DeployHello(auth, client)
	if err != nil {
		log.Panic(err)
	}
	fmt.Println("address:", address.Hex())
	fmt.Println("tx:", tx.Hash())
	fmt.Println("contractInstance", HelloInstance)

部署后得到的结果

address: 0xEC1Bd1468F090cf41ddbf9463d7c27689a4002De
tx: 0x3c3a4d51efa0ea1d736a0ce6b415282dff22e41a2a9f3aa0147e2e8365cbcab3
contractInstance &{{0xc00007ec80} {0xc00007ec80} {0xc00007ec80}}

可以拿着这个交易hash在geth控制台查看交易数据
go语言操作以太坊智能合约

调用合约过程

1 连接到以太坊(创建客户端)
2 加载合约对象
3 创建一个用户部署合约的身份
4 调用合约

func main() {
	//1 创建客户端
	client, err := ethclient.Dial("http://localhost:8545")
	if err != nil {
		log.Panic("failed to Dail", err)
	}

	//2 身份准备
	var keyinfo = `{"address":"470455a4b2492d75f19ec7b29d25e19aee0c48b1","crypto":{"cipher":"aes-128-ctr","ciphertext":"08ef3a09df1d731bf71d8ce52a0fed4d4c9187f7a5ef845833bac9854700cd70","cipherparams":{"iv":"e8b8b6ed222f8906b31e391e6ef8b7d7"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"e0970e0f38759ee32152429f692df30c0b4efd1d8adef6a9cf2a58e4f67fdcc7"},"mac":"0bea42bc7c1284307f518f4939f2de3af2278ac83e329541bf9e258e107c2feb"},"id":"83cb1145-c55b-439f-a1f0-5416a3805beb","version":3}`
	keyin := strings.NewReader(keyinfo)
	chainID, err := client.ChainID(context.Background())
	if err != nil {
		log.Panic(err)
	}
	auth, err := bind.NewTransactorWithChainID(keyin, "123456", chainID)
	if err != nil {
		log.Panic(err)
	}
	//3 创建合约对象
	// 合约地址,部署交易,合约对象
	HelloInstance, err := NewHello(common.HexToAddress("0xEC1Bd1468F090cf41ddbf9463d7c27689a4002De"), client)
	if err != nil {
		log.Panic("failed to New ", err)
	}
	tx, err := HelloInstance.SetMsg(auth, "test")
	if err != nil {
		log.Panic("failed to set ", err)
	}
	fmt.Println("setmsg tx:", tx.Hash())
	time.Sleep(time.Second * 20)
	msg, err := HelloInstance.GetMsg(nil)
	if err != nil {
		log.Panic("failed to get ", err)
	}
	fmt.Println("getmsg:", msg)
}

结果展示:
go语言操作以太坊智能合约文章来源地址https://www.toymoban.com/news/detail-486164.html

到了这里,关于go语言操作以太坊智能合约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 以太坊智能合约开发:Solidity 语言中的数据类型

    本文我们介绍Solidity语言的数据类型,重点是值类型,包括布尔类型、整型、地址类型、字节类型、字符串类型和枚举类型。并且通过两个智能合约例子,用于演示这些数据类型的声明与使用方法。 访问 Github 仓库 获取更多资料。 Solidity中关于数据类型的定义如下: Solidity是

    2024年02月02日
    浏览(67)
  • 以太坊智能合约开发:Solidity语言中的构造函数

    Solidity语言中关于构造函数的定义: 构造函数是使用 constructor 声明的一个可选函数; 构造函数只在合约部署时调用一次,并用于初始化合约的状态变量; 如果没有显式定义的构造函数,则由编译器创建默认构造函数。 构造函数声明语法如下: 其中: ** constructor :

    2024年02月01日
    浏览(51)
  • 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一)

    前面一篇关于 智能合约 翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用 程序语言 去编写 智能合约 了。 而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂 智能合约 代码,或找出其中的漏洞,那么,学习 Solidity 这门高级的智能合约语言是有

    2023年04月16日
    浏览(96)
  • 【智能合约】以太坊合约执行分析

    目录 1. 基本概念 1.2 合约字节码 1.3 合约构造函数 1.4 与合约交互 1.5 Call Data 1.6 程序计数器(Program Counter) 1.7 执行环境(Context) 1.8 OpCode(操作码/EVM指令/助记符) 1.9 Gas消耗 1.10 合约执行过程 2. 过程详解 2.1 关于部署代码 2.2 runtime代码 2.3 最终字节码 2.4 为EVM设计的指令集

    2024年02月02日
    浏览(52)
  • 【ETH】以太坊合约智能合约逆向方案

    技术角度了解区块链 在反编译之前,你需要先知道如果获取编译后的字节码。 这里以 USDT 举例

    2024年02月09日
    浏览(34)
  • 以太坊智能合约开发(五):Solidity成绩录入智能合约实验

    每个学生分别部署合约Student.sol ,保证只有自己可以修改姓名。老师部署合约StudentScore.sol,用于录入学生成绩,查询学生信息。查询学生信息时,需要调用学生部署的合约Student.sol。 student.sol合约,用于学生对自己信息进行管理。 学生的基本信息作为状态变量: 声明构造函

    2024年02月07日
    浏览(48)
  • 1-完全理解以太坊智能合约

    区块链技术的核心概念是分布式账本,它是许多参与者共享的特定类型的数据库。 这个特殊的数据库只是一个交易列表,记录着网络中发生的每笔交易。每个人都可以拥有自己的交易列表备份,再加上强有力的货币激励措施消除各方之间信任成本。 使用区块链,可以把信任

    2024年02月04日
    浏览(42)
  • 以太坊 – 部署智能合约到Ganache

    目录 1. Ganache本地区块链 1.1 主界面 1.2 设置 2. 开发智能合约 2.1 初始化项目 2.2 添加package.json文件 2.3 添加智能合约源文件 2.4 编译项目 3. 部署智能合约到Ganache 3.1 更新配置文件 3.2 创建迁移脚本  3.3 执行迁移命令 首先启动Ganache,创建本地的以太坊区块链网络。 本地

    2024年02月16日
    浏览(47)
  • 【区块链技术开发语言】在ubuntu18 系统环境下命令操作配置以太坊go-ethereum环境

    项目简介: 以太坊是一个基于区块链技术的分布式平台,用于构建去中心化应用程序(DApps)。go-ethereum 是以太坊官方开发团队维护的 Go 语言实现的以太坊客户端,也被称为 Geth。它提供了一个完整的以太坊节点,用于参与以太坊网络,执行智能合约,进行交易等。 前提条件

    2024年02月21日
    浏览(42)
  • 以太坊–智能合约开发介绍及环境搭建

    目录 1. 智能合约的概念 2. 智能合约的优点  3. 智能合约开发 3.1 支持智能合约的区块链 3.2 以太坊智能合约开发工具 3.3 以太坊智能合约开发语言 4. 智能合约开发环境搭建 4.1 准备工作 4.2 Node 与 NPM 4.3 Truffle 框架 4.4 Ganache 4.5 Metamask 4.6 VS code 与 Solidity插件 智能合约 (

    2024年02月05日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包