GO创建区块链可能是相关行业人士都值得关注的知识,在此对gos币挖矿进行详细的介绍,并拓展一些相关的知识分享给大家,希望能够为您带来帮助!
Go全称Golang。
Go语言由Google公司开发,并于2009年开源,相比Java/Python/C等语言,Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为“21世纪的C语言”。
Go语言在云计算、大数据、微服务、高并发领域应用应用非常广泛。BAT大厂正在把Go作为新项目开发的首选语言。
智能合约具有在执行期间“发出”事件的能力。 事件在以太坊中也称为“日志”。 事件的输出存储在日志部分下的事务处理中。 事件已经在以太坊智能合约中被广泛使用,以便在发生相对重要的动作时记录,特别是在代币合约(即ERC-20)中,以指示代币转账已经发生。 这些部分将引导您完成从区块链中读取事件以及订阅事件的过程,以便交易事务被矿工打包入块的时候及时收到通知。
为了订阅事件日志,我们需要做的第一件事就是拨打启用websocket的以太坊客户端。 幸运的是,Infura支持websockets。
下一步是创建筛选查询。 在这个例子中,我们将阅读来自我们在之前课程中创建的示例合约中的所有事件。
我们接收事件的方式是通过Go channel。 让我们从go-ethereum core/types 包创建一个类型为 Log 的channel。
现在我们所要做的就是通过从客户端调用 SubscribeFilterLogs 来订阅,它接收查询选项和输出通道。 这将返回包含unsubscribe和error方法的订阅结构。
最后,我们要做的就是使用select语句设置一个连续循环来读入新的日志事件或订阅错误。
我们会在下个章节介绍如何解析日志。
Commands
Store.sol
event_subscribe.go
智能合约可以可选地释放“事件”,其作为交易收据的一部分存储日志。读取这些事件相当简单。首先我们需要构造一个过滤查询。我们从go-ethereum包中导入 FilterQuery 结构体并用过滤选项初始化它。我们告诉它我们想过滤的区块范围并指定从中读取此日志的合约地址。在示例中,我们将从在 智能合约章节 创建的智能合约中读取特定区块所有日志。
下一步是调用ethclient的 FilterLogs ,它接收我们的查询并将返回所有的匹配事件日志。
返回的所有日志将是ABI编码,因此它们本身不会非常易读。为了解码日志,我们需要导入我们智能合约的ABI。为此,我们导入编译好的智能合约Go包,它将包含名称格式为 ContractABI 的外部属性。之后,我们使用go-ethereum中的 accounts/abi 包的 abi.JSON 函数返回一个我们可以在Go应用程序中使用的解析过的ABI接口。
现在我们可以通过日志进行迭代并将它们解码为我么可以使用的类型。若您回忆起我们的样例合约释放的日志在Solidity中是类型为 bytes32 ,那么Go中的等价物将是 [32]byte 。我们可以使用这些类型创建一个匿名结构体,并将指针作为第一个参数传递给解析后的ABI接口的 Unpack 函数,以解码原始的日志数据。第二个参数是我们尝试解码的事件名称,最后一个参数是编码的日志数据。
此外,日志结构体包含附加信息,例如,区块摘要,区块号和交易摘要。
若您的solidity事件包含 indexed 事件类型,那么它们将成为 主题 而不是日志的数据属性的一部分。在solidity中您最多只能有4个主题,但只有3个可索引的事件类型。第一个主题总是事件的签名。我们的示例合约不包含可索引的事件,但如果它确实包含,这是如何读取事件主题。
正如您所见,首个主题只是被哈希过的事件签名。
这就是阅读和解析日志的全部内容。要学习如何订阅日志,阅读上个章节。
命令
Store.sol
event_read.go
首先,创建ERC-20智能合约的事件日志的interface文件 erc20.sol :
然后在给定abi使用 abigen 创建Go包
现在在我们的Go应用程序中,让我们创建与ERC-20事件日志签名类型相匹配的结构类型:
初始化以太坊客户端
按照ERC-20智能合约地址和所需的块范围创建一个“FilterQuery”。这个例子我们会用 ZRX 代币:
用 FilterLogs 来过滤日志:
下面我们将解析JSON abi,稍后我们将使用解压缩原始日志数据:
为了按某种日志类型进行过滤,我们需要弄清楚每个事件日志函数签名的keccak256哈希值。 事件日志函数签名哈希始终是 topic [0] ,我们很快就会看到。 以下是使用go-ethereum crypto 包计算keccak256哈希的方法:
现在我们将遍历所有日志并设置switch语句以按事件日志类型进行过滤:
现在要解析 Transfer 事件日志,我们将使用 abi.Unpack 将原始日志数据解析为我们的日志类型结构。 解包不会解析 indexed 事件类型,因为它们存储在 topics 下,所以对于那些我们必须单独解析,如下例所示:
Approval 日志也是类似的方法:
最后,把所有的步骤放一起:
我们可以把解析的日志与etherscan的数据对比:
Commands
erc20.sol
event_read_erc20.go
solc version used for these examples
要读取 0x Protocol 事件日志,我们必须首先将solidity智能合约编译为一个Go包。
安装solc版本 0.4.11
为例如 Exchange.sol 的事件日志创建0x Protocol交易所智能合约接口:
Create the 0x protocol exchange smart contract interface for event logs as Exchange.sol :
接着给定abi,使用 abigen 来创建Go exchange 包:
Then use abigen to create the Go exchange package given the abi:
现在在我们的Go应用程序中,让我们创建与0xProtocol事件日志签名类型匹配的结构体类型:
初始化以太坊客户端:
创建一个 FilterQuery ,并为其传递0x Protocol智能合约地址和所需的区块范围:
用 FilterLogs 查询日志:
下面我们将解析JSON abi,我们后续将使用解压缩原始日志数据:
为了按某种日志类型过滤,我们需要知晓每个事件日志函数签名的keccak256摘要。正如我们很快所见到的那样,事件日志函数签名摘要总是 topic[0] :
现在我们迭代所有的日志并设置一个switch语句来按事件日志类型过滤:
现在要解析 LogFill ,我们将使用 abi.Unpack 将原始数据类型解析为我们自定义的日志类型结构体。Unpack不会解析 indexed 事件类型,因为这些它们存储在 topics 下,所以对于那些我们必须单独解析,如下例所示:
对于 LogCancel 类似:
最后是 LogError :
将它们放在一起并运行我们将看到以下输出:
将解析后的日志输出与etherscan上的内容进行比较:
命令
Exchange.sol
event_read_0xprotocol.go
这些示例使用的solc版本
1、服务器编程:以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
2、分布式系统、数据库代理器、中间件:例如Etcd。
3、网络编程:这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
4、开发云平台:目前国外很多云平台在采用Go开发,我们所熟知的七牛云、华为云等等都有使用Go进行开发并且开源的成型的产品。
5、区块链:目前有一种说法,技术从业人员把Go语言称作为区块链行业的开发语言。如果大家学习区块链技术的话,就会发现现在有很多很多的区块链的系统和应用都是采用Go进行开发的,比如ehtereum是目前知名度最大的公链,再比如fabric是目前最知名的联盟链,两者都有go语言的版本,且go-ehtereum还是以太坊官方推荐的版本。
自1.0版发布以来,go语言引起了众多开发者的关注,并得到了广泛的应用。go语言简单、高效、并发的特点吸引了许多传统的语言开发人员,其数量也在不断增加。
使用 Go 语言开发的开源项目非常多。早期的 Go 语言开源项目只是通过 Go 语言与传统项目进行C语言库绑定实现,例如 Qt、Sqlite 等。
后期的很多项目都使用 Go 语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用 Go 语言原生开发项目的出现。
以上就是小编对GO创建区块链和gos币挖矿的总结,更多gos币挖矿方面的知识可以关注我们,在网站首页进行搜索你想知道的!