主页 > 苹果如何下载imtoken钱包 > 学就学,教你Go语言调用智能合约

学就学,教你Go语言调用智能合约

苹果如何下载imtoken钱包 2023-01-30 06:09:51

智能合约调用是实现一个DApp的关键。 一个完整的DApp包括前端、后端、智能合约和区块链系统。 智能合约调用是连接区块链和前后端的关键。

我们先来了解一下智能合约调用的基本原理。 智能合约运行在以太坊节点的 EVM 中。 因此,为了调用合约,您必须访问某个节点。

以后端程序为例。 如果后端服务要连接到节点,有两种可能。 一是双方在同一台主机上。 此时后端连接节点可以使用本地IPC(Inter-Process Communication,进程间通信)机制,或者使用RPC(Remote Procedure Call,远程过程调用)机制; 还有一种情况,双方不在同一台主机上,此时只能使用RPC机制进行通信。

说到RPC,读者应该对Geth的启动参数有一点印象。 Geth启动时可以选择开启RPC服务,对应的默认服务端口为8545。。

以太坊智能合约应用_以太坊智能合约的工作流程_以太坊智能合约安全性

接下来我们看一下运行智能合约的过程。

以太坊智能合约应用_以太坊智能合约安全性_以太坊智能合约的工作流程

智能合约的运行过程是后端服务连接到一个节点,将智能合约的调用(交易)发送给该节点。 节点验证交易合法性后,向全网广播,由矿工打包到区块中代表这笔交易。 确认交易完成。

就像数据库一样,每个区块链平台都会提供主流开发语言的SDK(Software Development Kit)。 由于Geth本身是用Go语言编写的,如果想用Go语言连接节点和发送交易,直接在项目中导入go-ethereum(Geth源码)包即可,剩下的就是流程和问题了应用程序接口。

综上所述,智能合约调用的两个关键点是节点和SDK。

由于IPC要求后端和节点必须在同一台主机上,所以开发者经常使用RPC模式。 除了RPC,以太坊还为开发者提供了json-rpc接口,本文不做赘述。

下面介绍如何借助go-ethereum源码库,使用Go语言实现智能合约调用。 有固定步骤。 先说一下整体步骤,以下面的合约为例。

以太坊智能合约的工作流程_以太坊智能合约安全性_以太坊智能合约应用

以太坊智能合约安全性_以太坊智能合约应用_以太坊智能合约的工作流程

Step 01:编译合约,获取合约ABI(Application Binary Interface以太坊智能合约的工作流程,应用程序二进制接口)。 点击【ABI】按钮复制合约ABI信息,粘贴到calldemo.abi文件中(可以使用Go语言IDE创建此文件,文件名可自定义,后缀最好是abi ).

以太坊智能合约的工作流程_以太坊智能合约应用_以太坊智能合约安全性

最好将 calldemo.abi 保存在单独的目录中。 输入“ls”命令只能看到calldemo.abi文件。 参考效果如下:

以太坊智能合约应用_以太坊智能合约安全性_以太坊智能合约的工作流程

Step 02:获取合约地址。 请注意,合约必须部署到 Geth 节点。 因此,Environment 被选为 Web3 Provider。

在【Environment】选项框中选择“Web3 Provider”,然后点击【Deploy】按钮。

以太坊智能合约安全性_以太坊智能合约的工作流程_以太坊智能合约应用

以太坊智能合约应用_以太坊智能合约安全性_以太坊智能合约的工作流程

部署后得到的合约地址为:0xa09209c28AEf59a4653b905792a9a910E78E7407。

步骤03:使用abigen工具(Geth工具包中的可执行程序)将智能合约编译成Go代码。 abigen工具的作用是将abi文件转成Go代码,命令如下:

以太坊智能合约应用_以太坊智能合约的工作流程_以太坊智能合约安全性

各参数含义如下。 (1)abi:指定传入的abi文件。 (2)type:指定输出文件中的基本结构类型。 (3)pkg:指定输出文件包名。 (4)out:指定输出文件名。 执行后会在代码目录下看到funcdemo.go文件。 读者可打开此文件欣赏,注意不要修改。

步骤04:创建main.go并填写以下代码。 需要注意的是,在代码中需要将部署的合约地址传入HexToAddress函数以太坊智能合约的工作流程,该地址在01步获取。

以太坊智能合约应用_以太坊智能合约的工作流程_以太坊智能合约安全性

以太坊智能合约应用_以太坊智能合约安全性_以太坊智能合约的工作流程

Step 04:设置go mod,让项目自动识别。

前面提到,如果要使用Go语言调用智能合约,需要下载go-ethereum项目,可以使用如下命令:

以太坊智能合约应用_以太坊智能合约的工作流程_以太坊智能合约安全性

这个命令会自动下载go-ethereum到“$GOPATH/src/github.com/ethereum/go-ethereum”,这个还不错。 不过从Go语言1.11版本开始,增加了模块管理项目模式。 只要设置好go mod,就不用关心下载依赖项目了。

接下来设置模块生效和GOPROXY,命令如下:

以太坊智能合约应用_以太坊智能合约安全性_以太坊智能合约的工作流程

以太坊智能合约安全性_以太坊智能合约应用_以太坊智能合约的工作流程

在project工程中,进行初始化,调用demo可以自定义名称。

以太坊智能合约的工作流程_以太坊智能合约应用_以太坊智能合约安全性

步骤05:运行代码。 执行代码,你会看到如下效果,最后输出2020。

以太坊智能合约的工作流程_以太坊智能合约应用_以太坊智能合约安全性

在上面的输出信息中可以看到Go语言会自动下载依赖文件,这就是go mod的神奇之处。 看到2020,相信读者也知道跑分是正确的。