简介:前几篇文章我们一直在讨论Solidity语言的相关语法,从本文开始,我们将介绍智能合约开发。今天我们将介绍一个完整范例。
此章节将介绍一个完整案例来帮助开发者快速了解合约的开发规范及流程。
注意:
在进行案例编写前,请先前往JUICE开放服务平台,完成用户注册,JUICE区块链账户创建;并下载、安装、配置好JUICE客户端。https://open.juzix.net/
场景描述
在案例实践前请确保已拥有可用的JUICE区块链平台环境!!!
现假设一个场景,编写一个顾客管理合约。主要实现以下功能:
- 提供增加顾客信息功能,手机号作为唯一KEY;
- 提供根据手机号删除顾客信息的功能;
- 提供输出所有顾客信息的功能;
接口定义
说明:此接口定义了顾客管理合约的基本操作,接口的定义可以开放给三方进行调用而不暴露源码;
文件目录:${workspace}/contracts/interfaces 用于存放抽象合约目录
pragma solidity ^0.4.2;
contract IConsumerManager {
function add(string _mobile, string _name, string _account, string _remark) public returns(uint);
function deleteByMobile(string _mobile) public returns(uint);
function listAll() constant public returns (string _json);
}
- add(string _mobile, string _name, string _account, string _remark) 新增一个顾客信息
- deleteByMobile(string_mobile) 根据手机号删除顾客信息
- listAll() 输出所有顾客信息,此方法不影响变量状态,因此使用constant修饰;
数据结构定义
说明:当接口中的输入输出数据项比较多,或者存储在链上的数据项比较多时,开发者可以定义一个结构化数据,来简化数据项的声明。并且在这个结构化数据,还可以封装对数据的序列化操作,主要包括通过将json格式转为结构化数据 或 反序列化为json格式。
可以把结构化数据,看成面向对象编程中的对象。
文件目录:${workspace}/contracts/librarys 用于存放数据结构的定义
pragma solidity ^0.4.2;
import "../utillib/LibInt.sol";
import "../utillib/LibString.sol";
import "../utillib/LibStack.sol";
import "../utillib/LibJson.sol";
library LibConsumer {
using LibInt for *;
using LibString for *;
using LibJson for *;
using LibConsumer for *;
struct Consumer {
string mobile;
string name;
string account;
string remark;
}
/**
*@desc fromJson for Consumer
* Generated by juzhen SolidityStructTool automatically.
* Not to edit this code manually.
*/
function fromJson(Consumer storage _self, string _json) internal returns(bool succ) {
_self.reset();
if (!_json.isJson())
return false;
_self.mobile = _json.jsonRead("mobile");
_self.name = _json.jsonRead("name");
_self.account = _json.jsonRead("account");
_self.remark = _json.jsonRead("remark");
return true;
}
/**
*@desc toJson for Consumer
* Generated by juzhen SolidityStructTool automatically.
* Not to edit this code manually.
*/
function toJson(Consumer storage _self) internal constant returns (string _json) {
LibStack.push("{");
LibStack.appendKeyValue("mobile", _self.mobile);
LibStack.appendKeyValue("name", _self.name);
LibStack.appendKeyValue("account", _self.account);
LibStack.appendKeyValue("remark", _self.remark);
LibStack.append("}");
_json &