700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 阿里云BaaS下蚂蚁区块链开发实践(一)

阿里云BaaS下蚂蚁区块链开发实践(一)

时间:2023-01-06 18:30:52

相关推荐

阿里云BaaS下蚂蚁区块链开发实践(一)

蚂蚁链与阿里云

蚂蚁区块链是蚂蚁金服自主开发联盟区块链底层引擎,在阿里的强力宣传下,一直保持很高的曝光度。特别是今年的双十一,给4亿件天猫海淘商品在区块链上获得了“身份证”,实现从海外采购到国内配送的全链路溯源。蚂蚁链经过阿里内部这么多极端应用场景的锤炼,相信可以胜任大多数的企业应用场景。

蚂蚁链目前暂时还未开源,无从了解过多的技术细节。不过经过公开的文档中可以看到底层采用的是以太坊那套技术框架,虚拟机采用的是EVM,智能合约开发使用Solidity,提供Java与JS SDK。

蚂蚁链也是阿里云BaaS服务支持的三大区块链引擎之一,使用阿里云BaaS,可以极大简化区块链网络的部署运维成本。当然,蚂蚁链目前没有开源,也不提供独立部署,只能通过阿里云BaaS或是蚂蚁金服下的区块链BaaS平台来进行管理。

除了运维的支撑,阿里云BaaS也为蚂蚁链提供一个在线合约开发工具 – “Cloud IDE”。有点类似于以太坊的Remix IDE,为智能合约开发提供简单、高效的集成环境,并提供以下核心功能:

合约编辑与编译,展示编译结果字节码和接口说明(ABI)。合约的部署和调用;提供默认体验链环境和测试账户,用来部署和调用合约。解析合约方法的返回值、事件日志等,辅助调试合约;保存合约工程到 BaaS 合约工程管理。

在前段时间,我有机会体验了阿里云BaaS服务,尝试照着文档开发了一个蚂蚁链的Demo应用。现把主要的开发步骤与心得记录下来,与大家共享。

创建蚂蚁链网络

通过BaaS可以很方便创建联盟,建立区块链网络,详细操作可以参考阿里云官方文档或我的上一篇博客。

蚂蚁链智能合约

蚂蚁链虽使用solidity作为智能合约的开发语言,但使用时与以太坊最新原生的solidity语法有不少差别:

蚂蚁链只支持到solidity 0.4.23及以下版本,不支援solidity最新的语法特性;由于蚂蚁区块链对 Solidity 语言的支持与原生的 Solidity 语言不同,因此不能使用外部社区的 solc-js 编译工具。只能使用BaaS 平台提供的 专用solc-js蚂蚁区块链合约平台基本支持 Solidity 所有的数据类型,但是对于一些用户编写的合约的输入参数类型并没有完全的支持,比如参数输入中二维数组的输入。蚂蚁区块链合约平台提供了 identity 类型来标注每一个用户的身份,不支持原生 Solidity 中的 address 类型,identity 的长度为 32 字节。蚂蚁区块链也提供了一些合约中的原生函数,具体可参考阿里云文档

Demo 功能介绍

我实现的Demo主要目标是建立一套简单的产品溯源系统,模拟对产品从商家生产、物流运输到最终商场销售进行全流程查询与追踪。

Demo中主要包含以下角色与功能:

生产商:manufacturer 创建产品创建批次创建批次创建订单查询订单状态产品批次溯源 运输商:transporter 运送订单签收订单(中途站)记录订单途经位置 零售商:retailer 签收订单更新库存查询库存售出产品查询售出记录产品批次溯源 管理员:admin 创建用户,设置用户角色查询用户及其角色

合约实现

由于蚂蚁链合约开发语言与原生solidtiy有一定的差异,使用原生的solcjs编译会出各种问题,并且错误提示也不完整。因此强烈建议使用阿里云Cloud IDE开发合约。使用方法是在“联盟管理”中可以看到“合约工程管理”,然后新建或编辑现有合约工程即可。

创建所需的枚举与结构体

//用户角色enum UserRole {manufacturer,transporter,retailer,admin}//订单状态enum OrderState {created,transporting,finished}//用户结构体struct User {identity account;string name;UserRole role;string companyName;string companyAddress;}//产品结构体struct Product {string name;string modelNumber;string manufacturerName;string description;}//批次结构体struct Batch {string batchNumber;string modelNumber;uint32 quantity;uint256 timestamp;}//订单结构体struct Order {string orderNumber;string manufacturerName;string retailerName;OrderState state;string batchNumber;string modelNumber;uint32 quantity;uint256 timestamp;}//订单状态struct OrderStatus {string orderNumber;OrderState status;uint256 timestamp;string userAccount;string companyName;string companyAddress;}//库存结构体struct Inventory {string batchNumber;string modelNumber;string orderNumber;uint64 quantity;uint256 timestamp;}//销售记录struct SaleRecord {string batchNumber;string modelNumber;uint64 quantity;uint256 timestamp;string userAccount;}//订单状态struct MyOrderStatus {mapping(uint => OrderStatus) statusList;uint statusSize;}//销售历史清单struct MySoldList {mapping(uint => SaleRecord) saleRecordList;uint soldSize;}

定义管理员,将发布合约的用户定义为管理员,管理员可以设置分配其他用户权限

identity admin; constructor() public{admin = msg.sender;}// modifiermodifier onlyAdmin() {require(msg.sender == admin,"Permission denied");_;}

添加管理员相关方法

//添加或设置用户基本信息function setUser(identity _account, string _name, uint256 _role, string _companyName, string _companyAddress) public onlyAdmin returns(bool) {userList[_account] = User(_account, _name, UserRole(_role), _companyName, _companyAddress);return true;}//获取用户基本信息function getUser(identity _account) public onlyAdmin returns(identity, string, UserRole, string, string) {var user = userList[_account];return (user.account, user.name, user.role, panyName, panyAddress);}

为其他用户添加业务方法

//添加产品function AddProduct(string _name, string _modelNumber, string _description) public returns(bool) {var user = userList[msg.sender];productList[_modelNumber] = Product(_name, _modelNumber, panyName, _description);return true;}//其他省略 ...

一点感受

蚂蚁链不支持最新的solidity语法,开发起来会有些不方便。使用Cloud IDE开发可以快速编译、检查代码问题,并且能直接发布到测试网络上进行测试,确实能提高效率。

另一个需注意的地方是,蚂蚁链不支持address类型,取而代之是identity类型,从msg.sender中取出也就是当前用户的identity数据。

蚂蚁链的用户体系需要先在BaaS中创建,每个用户有一个用户名。合约中无法使用用户名,只能使用identiyt。而identity就是这个用户名的hash结果,可以通过SDK中辅助工具类中getHash方法,将用户名转成identity. 如

Chain.utils.getHash('Tester001') //通过账户 name,计算得到账户的 identity

完整Demo代码请参考:/ft-john/antblockchain_demo

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。