本文将继续介绍我在阿里云下基于蚂蚁区块链开发的产品溯源Demo客户端部分。蚂蚁链提供了两个平台的客户端SDK:Java与Node.js,我使用的是JS SDK。

开发前准备

安装SDK

  • 从node.js官网下载并安装 Node.js(推荐使用 v10.11.0 及以上版本)。
  • 到链管理页面下载蚂蚁链SDK,下载的压缩包中同时包含JAVA与JS SDK。
  • 将JS SDK alipay-mychain-0.2.27.tgz,并安装在项目目录
npm i alipay-mychain-0.2.27.tgz --save

准备SSL证书文件

客户端与区块链节点之间的通讯使用SSL双向加密,以保证不被中途拦截与篡改。客户端访问需要三个证书:

  • client.key 管理员线下自行生成或在创建节点时由baas自动生成(由于服务器不保存客户端私钥,此文件只允许下载一次)
  • client.crt 节点创建成功后,可在bass平台中的链管理界面下载
  • ca.crt 节点创建成功后,可在bass平台中的链管理界面下载
    这三个证书文件要放在客户端项目目录,以备用。

创建账户

蚂蚁链通过“账户”来管理客户端的访问权限,在启动开发前,需要在蚂蚁链BaaS平台的“成员管理”中,添加相应的账户。

添加账户需要提交账户公钥,账户公私角可由线下生成进行提交,也可以由线上生成(由于服务器不保存账户私钥,此账户的密钥文件只允许下载一次)

账户创建好后,要保存将账户私钥key文件,并将使用openssl将其转成pem格式:

openssl ec -in user.key -passin pass:${key_password} -passout pass:${key_password} -aes256 -out user.pem

获取链节点 IP 和端口号

要与合约链交互,您需要获取链节点的 IP 地址和端口号。在 BaaS 平台,通过查看目标合约链详情,在区块浏览器中查看节点详情,可获取链节点的 IP 地址和端口号。

创建与初始化SDK实例

  1. 引入JS SDK
const Chain = require("./build/index.node")
  1. 配置环境参数
const fs = require("fs")
const currentUserName = 'john' //当前账户名
const userPemFolder = 'john';  //当前账户pem文件所在目录
const accountPassword = "Abcd@1234" //pem文件密码
const passphrase = "Abcd@1234"  // SSL证书文件密码let accountKey = fs.readFileSync("./certs/" + userPemFolder + "/user.pem",{encoding: "utf8"})
let keyInfo = Chain.utils.getKeyInfo(accountKey, accountPassword)let opt = {host: '127.0.0.1',  //目标区块链网络节点的 IPport: 18130,        //端口号timeout: 30000,     //连接超时时间配置cert: fs.readFileSync('./certs/client.crt', {encoding: 'utf8'}),    //读取RSA密钥ca: fs.readFileSync('./certs/ca.crt', {encoding: 'utf8'}),  //读取CA证书key: fs.readFileSync("./certs/client.key", {encoding: "utf8"}), //读取RSA证书userPublicKey: keyInfo.publicKey,userPrivateKey: keyInfo.privateKey,userRecoverPublicKey: keyInfo.publicKey,userRecoverPrivateKey: keyInfo.privateKey,passphrase: passphrase
}
  1. 初始化一个连接实例
let chain = Chain(opt)

部署智能合约

下载并安装 solc-js合约编译工具

由于蚂蚁区块链对 Solidity 语言的支持与原生的 Solidity 语言不同,因此不能使用外部社区的 solc-js 编译工具。只能使用BaaS 平台提供的 solc-js:alipay-solc-0.1.10.tgz 可兼容 Solidity 语言 0.4.24 版本之前的语法(不包含 0.4.24)。

  1. 下载 solc-js
    点击此处,获取合约编译工具 solc-js 安装包:alipay-solc-0.1.10.tgz
  2. 全局安装 solc-js
    全局安装 solc-js。在下载的 alipay-solc-0.1.10.tgz 所在目录执行以下命令:
npm i -g alipay-solc-0.1.10.tgz

安装完成后,可以在命令行中使用solc-js 来编译合约,命令参数与原生程序基本一致。
3. 如果需要在代码中动态编译合约,则需要按下面步骤进行安装:
a. 在项目目录下npm init,将 alipay-solc-0.1.10.tgz 文件放到 项目目录
b. 运行以下命令行,在项目目录中安装 solc-js:

npm i alipay-solc-0.1.12.tgz --save

 c. 在代码中引用solc-js:

let solc = require('@alipay/solc')

读取并编译合约,并创建合约实例

const contractName = 'contractTKManager'
let contract = fs.readFileSync('./TKManager.sol', {encoding: 'ascii'})
// 第二个参数设定为"1",会开启编译优化 optimiser
let output = solc.compile(contract, 1)
let abi = JSON.parse(output.contracts[':TKManager'].interface)
let bytecode = output.contracts[':TKManager'].bytecode
let myContract = chain.ctr.contract(contractName, abi)

部署合约

        myContract.new(bytecode, {from: currentUserName,}, (err, contract, data) => {console.log(data)let original_block_number = data.block_number //这个是合约上链所在的区块号,需记录下来,更新合约时会用到console.log('original_block_number:', original_block_number)})

调用智能合约

蚂蚁链是通过合约名来访问智能合约的,不需要记住合约地址,这样也方便了合约的更新。因此合约一旦部署后,只需要提供合约名以及abi对象,就可以开始调用智能合约了。

//初始化一个连接实例
let chain = Chain(opt)
let solc = require('@alipay/solc')let contract = fs.readFileSync('./TKManager.sol', {encoding: 'ascii'})
// 第二个参数设定为"1",会开启编译优化 optimiser
let output = solc.compile(contract, 1)
let abi = JSON.parse(output.contracts[':TKManager'].interface)
let bytecode = output.contracts[':TKManager'].bytecode
let myContract = chain.ctr.contract(contractName, abi)myContract.AddProduct(productName, modelName, description, {from: currentUserName}, (err, output, data) => {//判断合约调用是否出错if(typeof(err) != 'undefined') {console.log('err is:', err)} else {//调用成功,合约方法返回值可以通过 output参数获取到console.log('output is:', output.toString())}         process.exit(0)
})

更新智能合约

蚂蚁链的合约升级更新稍有点复杂,主要的部署是:

  1. 先将合约在本地执行模拟部署(new),模拟部署的block_number参数应设置为合约第一次发布时所在的区块号减1,也就是发布合约时获得的参数 original_block_number - 1
  2. 本地部署完成后,会返回“runtime”字节码(bytecode)
  3. 将获得的字节码更新到链上(update)
//合约第一次上链的区块号
let original_block_number = 570177
myContract.new(bytecode, {from: currentUserName,local: true,  //本地执行合约部署,目的为了模拟合约部署获取`runtime`字节码block_number: original_block_number - 1, //防止合约id冲突}, (err, contract, data) => {myContract.update(
//这里注意要做替换
data.receipt.output.replace('0x' + chain.EVM, ''),
{}, (err, contract, data) => {console.log("solidity contract has been updated")  process.exit(0)})})
})

总结

至此,从创建区块链网络、节点与账户,到开发智能合约,到在客户端中实现合约部署、升级以及调用,蚂蚁区块链的主要开发流程就已经介绍完了。对于蚂蚁链我的感受是,因为它与阿里云深度结合,不管是从部署、运维到合约开发、调试都是非常方便,可以节省大量的时间与成本让用户更多地关注在业务实现上。感觉不太方便的地方是支持的solidity版本太旧,智能合约的更新有点复杂不太好理解,希望能看到它持续进步。

完整Demo代码请参考:https://github.com/ft-john/antblockchain_demo

阿里云BaaS下蚂蚁区块链开发实践(二)相关推荐

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

    蚂蚁链与阿里云   蚂蚁区块链是蚂蚁金服自主开发联盟区块链底层引擎,在阿里的强力宣传下,一直保持很高的曝光度.特别是今年的双十一,给4亿件天猫海淘商品在区块链上获得了"身份证",实 ...

  2. 蚂蚁区块链投票案例(二)---投票合约设计开发

    文章目录 摘要 背景 案例场景 用例分析 系统管理员注册 添加小区.添加房屋 编辑房屋 发起投票 统计投票 业主注册 业主实名认证 客房关系认证 投票 合约设计 设计原则 合约设计 合约开发 命名规则 ...

  3. 区块链开发(二)部署和运行第一个以太坊智能合约

    区块链开发(二)部署并运行第一个以太坊智能合约 李赫2016年8月22日 本文首发8BTC 网络上不少部署智能合约的文章,但是都有一个共同的特点,就是采用命令行的方式来部署,先是建立SOLC的编译环境 ...

  4. 谁能走得更远?百度、阿里、腾讯的区块链技术与布局对垒

    技术更迭随时会让一个巨人倒下--手机领域曾经的霸主诺基亚.摩托罗拉没跟上智能手机系统步伐,从巅峰转瞬跌入谷底.BAT都明白其中利害,早已枕戈待战. 互联网帝国之争 群雄逐鹿的区块链竞争格局,大致可分为 ...

  5. 蚂蚁区块链官方Demo解析(java版)及相关接口调用

    前言 该文档内容为蚂蚁区块链上的相关技术以及未解决的问题,以BaaS提供的Demo为基础,进行相关API的调用与测试. 蚂蚁区块链文档:https://tech.antfin.com/docs/2/7 ...

  6. 追风去 不如造风来——致敬蚂蚁区块链创新大赛中的参与者们

    作者:蚂蚁区块链创新大赛负责人 罗琼华(念想) 来源:蚂蚁区块链 我们在西湖论剑 在白堤走秀 什么异想天开 什么奇思怪论 那些不羁的理想 那些年轻的伟光 你让造梦的孩子走到舞台中央 让千万创业者追求心 ...

  7. 追风去,不如造风来——致敬蚂蚁区块链创新大赛中的参与者们

    我们在西湖论剑 在白堤走秀 什么异想天开 什么奇思怪论 那些不羁的理想 那些年轻的伟光 你让造梦的孩子走到舞台中央 让千万创业者追求心中的光 -摘自阿里巴巴20周年<致敬 杭州> 作者: ...

  8. 蚂蚁区块链投票案例(一)---蚂蚁链简介

    文章目录 摘要 背景 蚂蚁链简介 联盟链(合约体验链) 开放联盟链 开发者测试链 总结 遗留问题 测试环境和生产环境的问题? 摘要 计划用三篇文章,一个月左右的时间来实现一个蚂蚁开放联盟链上的区块链投 ...

  9. 复杂美公司Chain33区块链开发

    产品和服务 1.开源的Chain33区块链底层技术 Chain33区块链底层代码完全开源,https://github.com/33cn/chain33 Chain33是复杂美科技有限公司独立自主研发 ...

最新文章

  1. chrome调试手机webview中页面
  2. php中$sum,如何在PHP中显示SUM列
  3. 实验9:Problem D: 从点到面
  4. 安装 Android studio 运行 爆出 Unable to access Android SDK add-on list -...
  5. java项目中的classpath
  6. Codeforces Round #636 (Div. 3) E. Weights Distributing 思维 + bfs
  7. JVM—GC垃圾回收器总结
  8. oracle删除还原点,【赵强老师】删除表和Oracle的回收站
  9. SSH医院门诊就约系统答辩PPT免费下载
  10. 算法面试避坑指南,助你轻松应对Java面试
  11. excel能创建html吗,如何通过Excel电子表格使用循环创建单独的HTML发布页面
  12. php 正则提取连续字母,PHP匹配连续的数字或字母的正则表达式
  13. 中图分类法---- U 交通运输
  14. 时间序列预测——ARIMA模型
  15. CSDN博客图片去水印
  16. 发光二极管压降, 也就是最小导通电压
  17. 国内有什么好的前端学习网站推荐?
  18. 一个编得好的拼音输入法C51的
  19. 10种常见的回归算法总结和介绍
  20. 少儿编程与STEAM教育-你一定想知道的

热门文章

  1. 今日总结:错误码配置,关于TXT文件下载问题
  2. 华兴资本确定IPO发行价 募集资金将达3.96亿美元
  3. 华为手机微信如何与电脑连接到服务器,有华为手机,还用微信QQ传文件到电脑?Huawei share秒传了解一下...
  4. Python3卸载不掉怎么办?
  5. windows彻底卸载python的方法
  6. IPMI与BMC简介
  7. Cocos2dx 菜单项控件-Menu
  8. java p2p 技术可行性分析_Atitit JAVA p2p设计与总结  JXTA 2
  9. 下载yutube视频的方法 超方便
  10. OneNote添加Markdown插件的方法 #OneNote#工具篇