大数跨境

第5章 探索智能合约

第5章 探索智能合约 数组智控产业发展科技院
2023-05-18
4
导读:文章来源《DAPP应用开发指南》本章我们从生命周期的角度来探索智能合约,看看智能合约是如何从无到有创建的。5

文章来源《DAPP应用开发指南》

本章我们从生命周期的角度来探索智能合约,看看智能合约是如何从无到有创建的。

5.1 Remix IDE

工欲善其事,必先利其器。

开发智能合约,也得有工具,对初学者来说,Remix是开发智能合约的最佳IDE,它无须安装,可以直接快速上手。

Remix目前支持两种开发语言:Solidity和Vyper。

我们可以通过网站https://remix.ethereum.org/进入Remix,进入时需要选择对应的编译器环境:Solidity。

打开之后的界面如图5-1所示,之后就可以进行开发。

图5-1 Remix运行截图

5.2 MetaMask

MetaMask是在浏览器中与以太坊进行交互的最简单方法,它是Chrome或Firefox浏览器的插件形式的钱包,可以帮助我们连接到以太坊网络而无须在浏览器所在的计算机上运行完整节点。

在我们调用智能合约或者创建智能合约的时候,MetaMask可以为交易进行签名和支付gas费用。

MetaMask可以连接到以太坊主网以及任何一个测试网(Ropsten、Kovan和Rinkeby)或者本地如Geth、Ganache创建的区块链。

5.2.1 安装MetaMask

进入网站https://metamask.io/,界面如图5-2所示。

MetaMask提供了多个浏览器的插件,包括Chrome、FireFox、Opera,现在MetaMask还推出了移动版(iOS和Android)。

进入网站后,单击获取插件即可,安装完成之后,会在浏览器地址栏的右侧出现一个“小狐狸”的图标,单击这个图标就可以进入Metamask界面。

图5-2 MetaMask网站

5.2.2 配置MetaMask账号

安装完成之后需要进行一些设置来创建账号。

方法如下:单击浏览器中的MetaMask图标,如果是第一次使用,会出现如图5-3所示的界面。

可以直接通过输入密码创建账号,或通过助记词(用来推导出账号私钥的一组词语)导入其他钱包的账号。

如果采用第二种方式,则单击最下方“Import with seed phrase”,会进入一个如图5-4所示的导入界面。

如果我们让MetaMask链接Ganache生成的模拟区块链网络,就可以使用第二种方式,因为Ganache会为我们提供一个助记词。

图5-3 MetaMask创建账号

图5-4 MetaMask导入账号

5.2.3 为账号充值以太币

要发起以太坊上的交易,需要一个有余额的账号,否则就没办法发起交易。

这里注意一下,即使是测试网络交易也同样需要消耗gas,因为如果测试网络和主网不一致就失去了测试的意义。

如果是新创建的账号,账号是没有余额的,如图5-5所示。

图5-5 MetaMask主页面

主网的ETH是需要真金白金购买的,在进行开发测试的时候,可以选择一个测试网络,单击最上方的网络列表,例如在列表中选择Ropsten,以太坊的测试网络都会提供“水管”存入以太币到钱包账号,在图5-5的界面中,直接单击“存入”,弹出的界面如图5-6所示。

图5-6 获取测试以太币

单击图5-6下方的“获取Ether”,此时浏览器会打开页面:https://faucet.metamask.io/,在页面中单击“request 1 ether from faucet”请求获取1个以太币,如图5-7所示。

等交易确认后,我们可以在钱包里看到1个以太币。

图5-7 获取测试以太币

如果导入的是ganache中的账号,并且连接的是ganache网络,那么ganache会自动为账号提供100个以太币。

5.3 合约编写

准备好环境后,开始正式进入代码编写阶段,以第4章出现的计数器合约为例进行部署,代码如下。

在Remix IDE,新建一个文件,输入上面这段代码,如图5-8所示。

图5-8 Remix IDE

简单解读这个合约,这个智能合约的作用是在区块链上存储一个计数器变量,任何人都可以通过调用count()函数让计数器加1,调用get()函数获取计数器值,这个数字将会被永久留存在区块链的历史上。

用其他语言编写程序时,通常会有一个程序入口方法(如main方法),而智能合约没有入口方法,每一个函数都可以被单独调用,并且每一个函数也都只能在合约内部实现,没有实现全局函数。

5.4 合约编译

Solidity是一门编译型语言,代码编写之后,需要对代码进行编译,在Remix左侧工具栏,选择由上至下的第二个,单击编译合约,如图5-9所示。


图5-9 Remix编译

也可以勾选自动编译,这样它就会在代码更新后,自动进行编译,如果合约代码编译出错,那么在编译信息栏会显示错误详情。

5.5 合约部署及运行

编译之后,如果代码没有错误,就可以部署到以太坊网络上,推荐的正确操作流程是:

先在本地的模拟网络进行部署,测试及验证代码逻辑的正确性,确保一切没有问题之后,在以太坊测试网或主网上线。

5.5.1 部署JavaScript VM

在功能区切换到第三个标签页,在环境(Environment)一栏选择JavaScript VM,单击“Deploy”进行部署,如图5-10所示。

图5-10 Remix部署

此时会提交一个创建合约的交易,交易被矿工挖出后,会打包在一个区块中,可以在代码区的下方——调试信息区域看到部署的交易详情,如图5-11所示。

图5-11 Remix部署交易详情

现在,我们的第一个智能合约已经创建完成,合约创建完成之后,在功能区的下方会出现智能合约部署后的地址以及合约所有可以调用的函数,如图5-12所示。

图5-12 Remix合约运行图(1)

单击上方的count和get两个按钮,就可以调用对应的合约函数。

Remix里用橙色按钮来表示这个按钮的动作会修改区块链的状态,蓝色按钮则表示调用仅仅是读取区块链的状态

每次单击count时,计数器变量加1,单击get可以获得当前计数器的值。

下面来验证一下:

先运行一次count()函数,这时会提交一个交易(修改区块链的状态),单击get则会直接获得值,如图5-13所示。

图5-13 Remix合约运行图(2)

5.5.2 部署到以太坊网络

前面是部署到模拟环境,现在我们选择在以太坊测试网Ropsten进行部署(如果要发布一个真正有价值的、需要给其他用户使用的合约,则可以选择主网),先在MetaMask里选择网络,如图5-14所示。

然后继续切换到Remix,环境选择“Injected Web3”,它的意思是使用MetaMask插件在网页中注入的Web3,即选择Metamask为Remix提供的环境,选择之后,Remix会自动加载出MetaMask的账号,如图5-15所示。

图5-14 MetaMask选择网络

图5-15 Remix加载MetaMask账号

最后单击“Deploy”,弹出交易确认界面,如图5-16所示,用于确认交易内容及gas消耗,同时在单击确认时完成交易的签名。

图5-16 交易确认授权

所有通过MetaMask发起的交易,都会弹出这样一个交易确认窗口,提交交易后,在调试信息区域会出现一个链接:

https://ropsten.etherscan.io/tx/0x97b009b73e1b89ffc81613776f156522f1526f9d9497a311d8b566a379fa70a5。

通过这个链接可以查看交易的状态,如图5-17所示。

图5-17 交易状态信息

合约部署之后,和在JavaScript VM环境下一样,在功能区的下方会出现智能合约部署后的地址,以及合约中所有可以调用的函数。

5.6 合约内容

再次分析下合约代码,通常一个合约.sol文件之后会包含以下两个部分:

(1)声明编译合约使用的编译器版本;

(2)用contract定义一个合约(或用library定义一个库)。

5.6.1 编译器版本声明

代码中第一行:

关键字pragma的含义是:

用来告诉编译器如何编译这段代码,^表示版本能高于0.5.0,但是必须低于0.6.0,即只有第三位的版本号可以变。

类似的还可以使用如:

Solidity中编译器的版本的声明,表达式遵循npm(Node.js软件包管理)版本语义,可以参考https://docs.npmjs.com/misc/semver。

5.6.2 定义合约

这句定义了一个合约,合约的名字为Counter(和其他语言定义一个类很相似),一个合约通常又是由状态变量(合约数据)和合约函数组成。

5.6.3 状态变量

这行代码声明了一个变量,变量名为counter,类型为uint(一个256位的无符号整数),它就像数据库里面的一个存储单元。

在以太坊中,所有的变量构成了整个区块链网络的状态,所以也称为状态变量。

Solidity是一个静态类型语言,每个变量需要在声明时确定语言。

5.6.4 合约函数

这里定义了3个函数:

第一个是构造函数,用来完成合约的初始化,在合约创建时执行;

第二个count()是普通的函数,它对counter变量加1,任何修改状态变量都需要通过一个交易提交到链上,矿工打包之后交易才算完成;

第三个get()函数用来读取变量的值,这是视图函数,不需要提交交易。

通过本章的学习,我们对智能合约有了一个初步的了解,知道如何编译部署合约以及一个合约由哪几个部分组成。

接下来的第6章将进一步介绍如何开发合约。

       

【声明】内容源于网络
0
0
数组智控产业发展科技院
以AI技术为底层能力,聚焦智慧园区、城市公共安全、数智警务、健康医疗、能源电力、科研实验及平安校园等领域,提供从感知到决策的全流程软硬件一体化的国产装备智能体产品解决方案。
内容 986
粉丝 0
数组智控产业发展科技院 以AI技术为底层能力,聚焦智慧园区、城市公共安全、数智警务、健康医疗、能源电力、科研实验及平安校园等领域,提供从感知到决策的全流程软硬件一体化的国产装备智能体产品解决方案。
总阅读2.9k
粉丝0
内容986