要开发一个有复杂业务逻辑的区块链应用,智能合约是必须要掌握的技术,只要掌握了智能合约的开发和使用,基本上也就能够做出一些简单的区块链应用了,智能合约虽然本质上还是处理业务逻辑,但是它的写法跟传统的后端接口业务逻辑还是有很大区别的,刚开始写还是挺不习惯的,哎,万事开头难,慢慢来吧
一.选择语言
WeBASE 支持的智能合约语言是solidity,这个语言本来是为以太坊量身定制的,但是这也是现在业界比较公认的主流智能合约语言吧,基本上国内搞区块链的平台没有不支持这个的,还是值得学习一下的。
solidity 中文文档:Solidity 最新(0.8.0)中文文档 — Solidity中文文档 — 登链社区
二.创建一个简单的智能合约
先进入WeBASE管理系统,进入合约IDE页面,新建一个文件用来保存合约代码
老规矩,先来一个 Hello World
pragma solidity ^0.4.18;
contract demo {
function sayHelloWorld() returns (string) {
return ("Hello World");
}
}
将该代码复制到合约IDE页面,点击右上角的编译按钮
不出意外应该可以编译成功,页面显示成下图
接下来我们想要部署该合约,会提示需要选择一个账号,因为部署合约必须要有合约账号,也可以提前到私匙管理页面创建好,这里创建私匙账号就可以了
创建完账号以后,再次点击部署按钮,正常情况会弹出部署成功消息,进入合约列表页面就能看到我们刚刚部署成功的合约了
点击发送交易按钮,弹框中会自动加载我们刚刚定义的函数方法,点击确定就得到如下图弹框,就说明我们完成了一次智能合约的调用。
区块链上的所有交易信息都是上链的,所以我们的智能合约也是一样,我们可以直接到区块中查看到刚才的交易
【额外说明】
创建账号的时候一定要选择私匙账号,它旁边还有一个公钥账号。这两个区别其实是一个会将账号创建并将账号信息保存在WeBASE中,另一个是用来登记外部创建的账号的,只是方便系统识别,因为这个系统使用的区块链底层平台FISCO BCOS本身也可以创建账号。
三.其它说明
1.单纯查询功能的智能合约
只是输出一个hello world这种文本信息,类似一个查询功能,一般来说该信息是不需要上链的,上面的例子只是为了更好的展示智能合约的完整过程。
代码可以修改成如下
pragma solidity ^0.4.18;
contract demo {
function sayHelloWorld() public view returns (string) {
return ("Hello World");
}
}
在Solidity中view,pure函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样的函数执行不会导致链上信息发生改变,不需要矿工确认,也不会消耗gas,就是单纯的查询而已。
保存该合约,点击编译,再次部署,发起交易时会发现弹出框有了有点变化
如果你记忆力够好,就会发现少了一栏选择用户,这是因为本次非交易,而是单纯的查询,点击确定执行,得到如下结果
这个时候再去区块中查找的话,会发现区块没有增加任何交易区块,也不会有记录信息
2.区块高度
我们每一次部署智能合约或者执行交易都会发现WeBASE中区块链区块高度会增加一个,正常来说区块链应用不会每个交易都增加一个区块,而是会将多个交易打包到一个区块一起提交,不然非常浪费资源,但是我们这里只是学习,更直观一些。
3.更新智能合约代码
如果修改了智能合约代码,一点要点击【编译】,然后再点击【部署】,千万不要只点击了【保存】,就点击【部署】,这样是无法生效的,我在这反正是坑了一会,这时候你会发现合约列表出现了两个同名的合约,最新的就是你刚刚保存的那一个合约,但是旧的那个依然可以正常调用。
真正意义上智能合约的修改和删除功能只能在创建的时候就设定好规则,不然该合约基本无法更改,比如可以设定一个前置判断逻辑,让其在一般情况下成立,我们在需要删除该合约的时候,让其不再成立,导致合约无法执行,间接达成删除目的,更新也是类似。