Giten、Cent、Veil等等.
以太坊是一个开源的,能让大家自由开发智能合约的区块链公共平台,就像互联网中安卓,Windows系统一样,它能提供一套专门的脚步语言,让大家可以随意地在上面开发.
以太坊是什么丨以太坊开发入门指南
很多同学已经跃跃欲试投入到区块链开发队伍当中来,可是又感觉无从下手,本文将基于以太坊平台,以通俗的方式介绍以太坊开发中涉及的各晦涩的概念,轻松带大家入门.
以太坊是什么
以太坊(Ethereum)是一个建立在区块链技术之上, 去中心化应用平台.它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用.
对这句话不理解的同学,姑且可以理解为以太坊是区块链里的Android,它是一个开发平台,让我们就可以像基于Android Framework一样基于区块链技术写应用.
在没有以太坊之前,写区块链应用是这样的:拷贝一份比特币代码,然后去改底层代码如加密算法,共识机制,网络协议等等(很多山寨币就是这样,改改就出来一个新币).
以太坊平台对底层区块链技术进行了封装,让区块链应用开发者可以直接基于以太坊平台进行开发,开发者只要专注于应用本身的开发,从而大大降低了难度.
目前围绕以太坊已经形成了一个较为完善的开发生态圈:有社区的支持,有很多开发框架、工具可以选择.
智能合约
什么是智能合约
以太坊上的程序称之为智能合约, 它是代码和数据(状态)的集合.
智能合约可以理解为在区块链上可以自动执行的(由事件驱动的)、以代码形式编写的合同(特殊的交易).
在比特币脚本中,我们讲到过比特币的交易是可以编程的,但是比特币脚本有很多的限制,能够编写的程序也有限,而以太坊则更加完备(在计算机科学术语中,称它为是"图灵完备的"),让我们就像使用任何高级语言一样来编写几乎可以做任何事情的程序(智能合约).
智能合约非常适合对信任、安全和持久性要求较高的应用场景,比如:数字货币、数字资产、投票、保险、金融应用、预测市场、产权所有权管理、物联网、点对点交易等等.
编程语言:Solidity
智能合约的默认的编程语言是Solidity,文件扩展名以.sol结尾.
Solidity是和JavaScript相似的语言,用它来开发合约并编译成以太坊虚拟机字节代码.
还有长像Python的智能合约开发语言:Serpent,不过建议大家还是使用Solidity.
Browser-Solidity是一个浏览器的Solidity IDE, 大家可以点进去看看,以后我们更多文章介绍Solidity这个语言.
运行环境:EVM
EVM(Ethereum Virtual Machine)以太坊虚拟机是以太坊中智能合约的运行环境.
Solidity之于EVM,就像之于跟JVM的关系一样,这样大家就容易理解了.
以太坊虚拟机是一个隔离的环境,在EVM内部运行的代码不能跟外部有联系.
而EVM运行在以太坊节点上,当我们把合约部署到以太坊网络上之后,合约就可以在以太坊网络中运行了.
合约的编译
以太坊虚拟机上运行的是合约的字节码形式,需要我们在部署之前先对合约进行编译,可以选择Browser-Solidity Web IDE或solc编译器.
合约的部署
Geth控制台和Chrome浏览器开发者工具里的面的控制台是类似,不过是跑在终端里.
如何部署
智能合约的部署是指把合约字节码发布到区块链上,并使用一个特定的地址来标示这个合约,这个地址称为合约账户.
以太坊中有两类账户:
- 外部账户
该类账户被私钥控制(由人控制),没有关联任何代码.
- 合约账户
该类账户被它们的合约代码控制且有代码与之关联.
和比特币使用UTXO的设计不一样,以太坊使用更为简单的账户概念.
两类账户对于EVM来说是一样的.
外部账户与合约账户的区别和关系是这样的:一个外部账户可以通过创建和用自己的私钥来对交易进行签名,来发送消息给另一个外部账户或合约账户.
在两个外部账户之间传送消息是价值转移的过程.但从外部账户到合约账户的消息会激活合约账户的代码,允许它执行各种动作(比如转移代币,写入内部存储,挖出一个新代币,执行一些运算,创建一个新的合约等等).
只有当外部账户发出指令时,合同账户才会执行相应的操作.
合约部署就是将编译好的合约字节码通过外部账号发送交易的形式部署到以太坊区块链上(由实际矿工出块之后,才真正部署成功).
运行
合约部署之后,当需要调用这个智能合约的方法时只需要向这个合约账户发送消息(交易)即可,通过消息触发后智能合约的代码就会在EVM中执行了.
Gas
和云计算相似,占用区块链的资源(不管是简单的转账交易,还是合约的部署和执行)同样需要付出相应的费用(天下没有免费的午餐对不对!).
以太坊上用Gas机制来计费,Gas也可以认为是一个工作量单位,智能合约越复杂(计算步骤的数量和类型,占用的内存等),用来完成运行就需要越多Gas.
任何特定的合约所需的运行合约的Gas数量是固定的,由合约的复杂度决定.
而Gas价格由运行合约的人在提交运行合约请求的时候规定,以确定他愿意为这次交易愿意付出的费用:Gas价格(用以太币计价) * Gas数量.
Gas的目的是限制执行交易所需的工作量,同时为执行支付费用.当EVM执行交易时,Gas将按照特定规则被逐渐消耗,无论执行到什么位置,一旦Gas被耗尽,将会触发异常.当前调用帧所做的所有状态修改都将被回滚, 如果执行结束还有Gas剩余,这些Gas将被返还给发送账户.
如果没有这个限制,就会有人写出无法停止(如:死循环)的合约来阻塞网络.
所以呢实际上(把前面的内容串起来),我们需要一个有以太币余额的外部账户,来发起一个交易(普通交易或部署、运行一个合约),运行时,矿工收取相应的工作量费用.
以太坊网络
有些着急的同学要问了,没有以太币,要怎么进行智能合约的开发?可以选择以下方式:
选择以太坊官网测试网络Testnet
测试网络中,我们可以很容易获得免费的以太币,缺点是需要发很长时间初始化节点.
使用私有链
创建自己的以太币私有测试网络,通常也称为私有链,我们可以用它来作为一个测试环境来开发、调试和测试智能合约.
通过上面提到的Geth很容易就可以创建一个属于自己的测试网络,以太币想挖多少挖多少,也免去了同步正式网络的整个区块链数据.
使用开发者网络(模式)
相比私有链,开发者网络(模式)下,会自动分配一个有大量余额的开发者账户给我们使用.
使用模拟环境
另一个创建测试网络的方法是使用testrpc,testrpc是在本地使用内存模拟的一个以太坊环境,对于开发调试来说,更方便快捷.而且testrpc可以在启动时帮我们创建10个存有资金的测试账户.
进行合约开发时,可以在testrpc中测试通过后,再部署到Geth节点中去.
更新:testrpc 现在已经并入到Truffle 开发框架中,现在名字是Ganache CLI.
Dapp:去中心化的应用程序
以太坊社区把基于智能合约的应用称为去中心化的应用程序(DecentralizedApp).如果我们把区块链理解为一个不可篡改的数据库,智能合约理解为和数据库打交道的程序,那就很容易理解Dapp了,一个Dapp不单单有智能合约,比如还需要有一个友好的用户界面和其他的东西.
Truffle
Truffle是Dapp开发框架,他可以帮我们处理掉大量无关紧要的小事情,让我们可以迅速开始写代码-编译-部署-测试-打包DApp这个流程.
总结
注:本文中为了方便大家理解,对一些概念做了类比,有些严格来不是准确,不过我也认为对于初学者,也没有必要把每一个概念掌握的很细致和准确,学习是一个逐步深入的过程,很多时候我们会发现,过一段后,我们会对同一个东西有不一样的理解.
①.、服务器编程:以前你如果使用C或者C◆◆做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等.
自1.0版发布以来,go语言引起了众多开发者的关注,并得到了广泛的应用.go语言简单、高效、并发的特点吸引了许多传统的语言开发人员,其数量也在不断增加.
使用 Go 语言开发的开源项目非常多.早期的 Go 语言开源项目只是通过 Go 语言与传统项目进行C语言库绑定实现,例如 Qt、Sqlite 等.
后期的很多项目都使用 Go 语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用 Go 语言原生开发项目的出现.
在这个章节中我们会介绍如何用Go来编译,部署,写入和读取智能合约.
与智能合约交互,我们要先生成相应智能合约的应用二进制接口ABI(application binary interface),并把ABI编译成我们可以在Go应用中调用的格式.
第一步是安装 Solidity编译器 ( solc ).
Solc 在Ubuntu上有snapcraft包.
Solc在macOS上有Homebrew的包.
其他的平台或者从源码编译的教程请查阅官方solidity文档 install guide .
我们还得安装一个叫 abigen 的工具,来从solidity智能合约生成ABI.
假设您已经在计算机上设置了Go,只需运行以下命令即可安装 abigen 工具.
我们将创建一个简单的智能合约来测试. 学习更复杂的智能合约,或者智能合约的开发的内容则超出了本书的范围. 我强烈建议您查看 truffle framework 来学习开发和测试智能合约.
这里只是一个简单的合约,就是一个键/值存储,只有一个外部方法来设置任何人的键/值对. 我们还在设置值后添加了要发出的事件.
虽然这个智能合约很简单,但它将适用于这个例子.
现在我们可以从一个solidity文件生成ABI.
它会将其写入名为"Store_sol_Store.abi"的文件中
现在让我们用 abigen 将ABI转换为我们可以导入的Go文件. 这个新文件将包含我们可以用来与Go应用程序中的智能合约进行交互的所有可用方法.
为了从Go部署智能合约,我们还需要将solidity智能合约编译为EVM字节码. EVM字节码将在事务的数据字段中发送. 在Go文件上生成部署方法需要bin文件.
现在我们编译Go合约文件,其中包括deploy方法,因为我们包含了bin文件.
在此时此刻呢的课程中,我们将学习如何部署智能合约,然后与之交互.
Commands
Store.sol
solc version used for these examples
如果你还没看之前的章节,请先学习 编译智能合约的章节 因为这节内容,需要先了解如何将智能合约编译为Go文件.
假设你已经导入从 abigen 生成的新创建的Go包文件,并设置ethclient,加载您的私钥,下一步是创建一个有配置密匙的交易发送器(tansactor). 首先从go-ethereum导入 accounts/abi/bind 包,然后调用传入私钥的 NewKeyedTransactor . 然后设置通常的属性,如nonce,燃气价格,燃气上线限制和ETH值.
如果你还记得上个章节的内容, 我们创建了一个非常简单的"Store"合约,用于设置和存储键/值对. 生成的Go合约文件提供了部署方法. 部署方法名称始终以单词 Deploy 开头,后跟合约名称,在本例中为 Store .
deploy函数接受有密匙的事务处理器,ethclient,以及智能合约构造函数可能接受的任何输入参数.我们测试的智能合约接受一个版本号的字符串参数. 此函数将返回新部署的合约地址,事务对象,我们可以交互的合约实例,还有错误(如果有).
就这么简单:)你可以用事务哈希来在Etherscan上查询合约的部署状态:
contract_deploy.go
这写章节需要了解如何将智能合约的ABI编译成Go的合约文件.如果你还没看, 前先读 上一个章节 .
contract_load.go
在上个章节我们学习了如何在Go应用程序中初始化合约实例. 现在我们将使用新合约实例提供的方法来阅读智能合约. 如果你还记得我们在部署过程中设置的合约中有一个名为 version 的全局变量. 因为它是公开的,这意味着它们将成为我们自动创建的getter函数. 常量和view函数也接受 bind.CallOpts 作为第一个参数.了解可用的具体选项要看相应类的 文档 一般情况下我们可以用 nil .
contract_read.go
写入智能合约需要我们用私钥来对交易事务进行签名.
我们还需要先查到nonce和燃气价格.
此时此刻呢,我们创建一个新的keyed transactor,它接收私钥.
然后我们需要设置keyed transactor的标准交易选项.
现在我们加载一个智能合约的实例.如果你还记得 上个章节 我们创建一个名为 Store 的合约,并使用 abigen 工具生成一个Go文件. 要初始化它,我们只需调用合约包的 New 方法,并提供智能合约地址和ethclient,它返回我们可以使用的合约实例.
现在我就可以看到交易已经成功被发送到了以太坊网络了:
要验证键/值是否已设置,我们可以读取智能合约中的值.
搞定!
contract_write.go
有时您需要读取已部署的智能合约的字节码. 由于所有智能合约字节码都存在于区块链中,所以呢我们可以轻松获取它.
contract_bytecode.go
然后将interface智能合约编译为JSON ABI,并使用 abigen 从ABI创建Go包.
我们可以做一些简单的数学运算将余额转换为可读的十进制格式.
同样的信息也可以在etherscan上查询:
下一步是创建筛选查询. 在这个例子中,我们将阅读来自我们在之前课程中创建的示例合约中的所有事件.
我们接收事件的方式是通过Go channel. 让我们从go-ethereum core/types 包创建一个类型为 Log 的channel.
最后,我们要做的就是使用select语句设置一个连续循环来读入新的日志事件或订阅错误.
我们会在下个章节介绍如何解析日志.
event_subscribe.go
智能合约可以可选地释放"事件",其作为交易收据的一部分存储日志.读取这些事件相当简单.首先我们需要构造一个过滤查询.我们从go-ethereum包中导入 FilterQuery 结构体并用过滤选项初始化它.我们告诉它我们想过滤的区块范围并指定从中读取此日志的合约地址.在示例中,我们将从在 智能合约章节 创建的智能合约中读取特定区块所有日志.
下一步是调用ethclient的 FilterLogs ,它接收我们的查询并将返回所有的匹配事件日志.
返回的所有日志将是ABI编码,所以呢它们本身不会非常易读.为了解码日志,我们需要导入我们智能合约的ABI.为此,我们导入编译好的智能合约Go包,它将包含名称格式为 ContractABI 的外部属性.之后,我们使用go-ethereum中的 accounts/abi 包的 abi.JSON 函数返回一个我们可以在Go应用程序中使用的解析过的ABI接口.
此外,日志结构体包含附加信息,例如,区块摘要,区块号和交易摘要.
正如您所见,首个主题只是被哈希过的事件签名.
这就是阅读和解析日志的全部内容.要学习如何订阅日志,阅读上个章节.
命令
event_read.go
然后在给定abi使用 abigen 创建Go包
用 FilterLogs 来过滤日志:
此时此刻呢我们将解析JSON abi,稍后我们将使用解压缩原始日志数据:
现在我们将遍历所有日志并设置switch语句以按事件日志类型进行过滤:
现在要解析 Transfer 事件日志,我们将使用 abi.Unpack 将原始日志数据解析为我们的日志类型结构. 解包不会解析 indexed 事件类型,因为它们存储在 topics 下,所以对于那些我们必须单独解析,如下例所示:
Approval 日志也是类似的方法:
最后,把所有的步骤放一起:
我们可以把解析的日志与etherscan的数据对比:
要读取 0x Protocol 事件日志,我们必须首先将solidity智能合约编译为一个Go包.
为例如 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,我们后续将使用解压缩原始日志数据:
现在我们迭代所有的日志并设置一个switch语句来按事件日志类型过滤:
现在要解析 LogFill ,我们将使用 abi.Unpack 将原始数据类型解析为我们自定义的日志类型结构体.Unpack不会解析 indexed 事件类型,因为这些它们存储在 topics 下,所以对于那些我们必须单独解析,如下例所示:
对于 LogCancel 类似:
最后是 LogError :
将它们放在一起并运行我们将看到以下输出:
将解析后的日志输出与etherscan上的内容进行比较:
Exchange.sol
event_read_0xprotocol.go
这些示例使用的solc版本
智能合约调用是实现一个 DApp 的关键,一个完整的 DApp 包括前端、后端、智能合约及区块 链系统,智能合约的调用是连接区块链与前后端的关键.
我们先来了解一下智能合约调用的基础原理.智能合约运行在以太坊节点的 EVM 中.所以呢要 想调用合约必须要访问某个节点.
以后端程序为例,后端服务若想连接节点有两种可能,一种是双 方在同一主机,此时后端连接节点可以采用 本地 IPC(Inter-Process Communication,进 程间通信)机制,也可以采用 RPC(Remote Procedure Call,远程过程调用)机制;另 一种情况是双方不在同一台主机,此时只能采用 RPC 机制进行通信.
接着,我们来了解一下智能合约运行的过程.
智能合约的运行过程是后端服务连接某节点,将 智能合约的调用(交易)发送给节点,节点在验证了交易的合法性后进行全网广播,被矿工打包到 区块中代表此交易得到确认,至此交易才算完成.
就像数据库一样,每个区块链平台都会提供主流 开发语言的 SDK(Software Development Kit,软件开发工具包),由于 Geth 本身就是用 Go 语言 编写的,所以呢若想使用 Go 语言连接节点、发交易,直接在工程内导入 go-ethereum(Geth 源码) 包就可以了,剩下的问题就是流程和 API 的事情了.
最后提醒一下大家,智能合约被调用的两个关键点是节点和 SDK.
此时此刻呢介绍如何使用 Go 语言,借助 go-ethereum 源码库来实现智能合约的调用.这是有固定 步骤的,我们先来说一下总体步骤,以下面的合约为例.
步骤 01:编译合约,获取合约 ABI(Application Binary Interface,应用二进制接口). 单击【ABI】按钮拷贝合约 ABI 信息,将其粘贴到文件 calldemo.abi 中(可使用 Go 语言IDE 创建该文件,文件名可自定义,后缀最好使用 abi).
最好能将 calldemo.abi 单独保存在一个目录下,输入"ls"命令只能看到 calldemo.abi 文件,参 考效果如下:
此时此刻呢设置 module 生效和 GOPROXY,命令如下:
在项目工程内,执行初始化,calldemo 可以自定义名称.
以上就是土嘎嘎小编为大家整理的go语言以太坊的应用相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!