蚂蚁区块链BaaS平台应用开发指南(五):JS SDK的接入
2020-03-06 20:49
811 查看
基于JavaScript SDK的接入
在上一节中,我们通过JavaSDK接入了我们的目标链并调用合约成功。在本节中,我们将通过JS SDK实现同样的调用。JS SDK可以集成在Web应用中,运行在浏览器端;也可以集成在Node.js应用中,运行在服务端或客户端。在本文中,我们以Node.js应用为例来说明如何通过JS SDK接入蚂蚁区块链。
准备工作
开发环境配置
- 下载并安装Node.js(推荐使用 v10.11.0 及以上版本)。
- 安装 JS SDK 到项目目录:
- 下载JS SDK,并复制到项目目录下:
- 在目录路径下执行
npm i alipay-mychain-0.2.27.tgz --save
证书和密钥
和JavaSDK接入时需要的内容相似,我们需要准备如下文件:
- 用户机构的×××书
client.crt
和对应的密钥文件client.key
:链通过该证书验证用户身份。申请合约链证书时获取的证书文件,具体参考这里或这里。 - 合约链的认证CA证书文件
ca.crt
:用户通过该文件验证合约链的身份。通过区块链卡片
->右上角···
->下载根证书
获取。
- 账户私钥文件
user.pem
:账户提交交易时需要通过该私钥做签名,创建账户时获取(由user.key
生成)。
前面两项中的文件均可直接获取,对于第三项
user.pem文件,需要我们通过下面的命令手动把
user.key文件转换成
user.pem文件(方便JS代码读取密钥文件):
openssl ec -in user.key -passin pass:${key_password} -passout pass:${key_password} -aes256 -out user.pem
这里要注意保护密码的配置,
-passout参数配置的密码需要在后续的sdk中使用到。
需要提前安装配置好openssl工具。
最终,我们项目目录下,新建一个文件夹在放所有的需要的证书文件::
~/Documents/Work/JSSDKDemos/Certs/PRD> tree . ├── ca.crt ├── client.crt ├── client.key ├── user.key └── user.pem
获取合约链的接入IP与端口号
与JavaSDK相同,通过
区块链卡片>
详情>
节点处获取:
开始第一个JS程序
获取合约接口说明ABI
JS SDK对合约的调用依赖编译合约时生成的应用程序二进制接口说明(Application Binary Interface,ABI)。ABI文件中描述了合约暴露的方法名,输入参数类型和返回参数类型等。JS SDK会根据ABI来提供实例化的调用方法以及自动反序列号返回值。我们可以在Cloud IDE中编译合约来获取ABI:
也可以通过
solc-js工具在本地编译合约并获取ABI文件,参见这里。
例如,在蚂蚁区块链BaaS平台应用开发指南(三)中我们部署的合约,其合约内容与合约接口说明ABI如下:
合约内容:
pragma solidity ^0.4.0; contract SimpleStorage { uint storedData; function set(uint256 x) public { storedData = x; } function get() public view returns (uint256) { return storedData; } }
ABI说明:
[ { "constant":false, "inputs":[ { "name":"x", "type":"uint256" } ], "name":"set", "outputs":[ ], "payable":false, "stateMutability":"nonpayable", "type":"function" }, { "constant":true, "inputs":[ ], "name":"get", "outputs":[ { "name":"", "type":"uint256" } ], "payable":false, "stateMutability":"view", "type":"function" } ]
使用JS SDK调用合约
- 新建一个main.js文件。
- 文件中填入以下内容:
const Chain = require("@alipay/mychain/index.node") // 在node环境使用 TLS 协议 const fs = require("fs") const accountKey = fs.readFileSync("./Certs/PRD/user.pem", { encoding: "utf8" }) const accountPassword = '******' // 需要替换为自定义的user.pem密码 const keyInfo = Chain.utils.getKeyInfo(accountKey, accountPassword) const passphrase = '******' // 需要替换为自定义的client.key密码 //配置选项 let opt = { host: '47.101.66.49', // 目标区块链网络节点的 IP port: 18130, // 端口号 timeout: 30000, // 连接超时时间配置 cert: fs.readFileSync("./Certs/PRD/client.crt", { encoding: "utf8" }), ca: fs.readFileSync("./Certs/PRD/ca.crt", { encoding: "utf8" }), key: fs.readFileSync("./Certs/PRD/client.key", { encoding: "utf8" }), userPublicKey: keyInfo.publicKey, userPrivateKey: keyInfo.privateKey, userRecoverPublicKey: keyInfo.publicKey, // 账户恢复公钥,本例中用不到,随便填入一个 userRecoverPrivateKey: keyInfo.privateKey,// 恢复恢复私钥,本例中用不到,随便填入一个 passphrase: passphrase // clinet.key的密码 } // 初始化一个连接实例 const chain = Chain(opt) // 提供合约abi const abi = JSON.parse('[{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]') // 实例化一个合约instance let myContract = chain.ctr.contract("donglei-contract-test-002", abi); //调用合约的set方法,把storedData变量设为20。 myContract.set(20, {from:'donglei-PRD-001'}, // From参数,合约调用交易的发起者,用户id和提供的user.pem需要匹配。 (err, output, data) => { console.log(data); // 交易回执会存储在data字段中。 }); //调用合约的get方法,获取storedData的值。 myContract.get( {from:'donglei-PRD-001'}, // From参数,合约调用交易的发起者,用户id和提供的user.pem需要匹配。 (err, output, data) => { console.log(output.toString()); // 合约方法的返回值会存储在output字段中。 });
程序运行结果如下:
小结
在本节中,我们通过JS SDK接入蚂蚁区块链并实现了合约的调用,与JavaSDK最大的不同在于JS SDK通过ABI说明来实例化合约的调用接口和返回值解析,不需要手动构造方法签名及反序列化返回值。可以看到,一个完整的调用流程如下:
- 初始化一个chain实例(配置好用户×××书、账户私钥和连接参数);
- 初始化一个合约实例(需要提供合约的ABI说明);
- 调用一个合约方法(需要提供调用者的用户id,通过data字段获取交易回执);
- 获取合约返回值(合约返回值会存储在output中,JS SDK会自动反序列化返回值);
Web环境接入注意事项
需要注意到在Node.js环境下,程序和链的数据交互采用是TLS协议。如果要集成JS SDK到到一个Web应用中,浏览器会使用HTTPS协议与链进行数据交互,此时需要链的管理员配置好不同的接入接口。具体开发者可以通过工单系统与开发支持团队联系。
另外,Web环境和Node.js环境下引入SDK的方式有所不同
Web:const Chain = require("@alipay/mychain/index.node")
Node.js:const Chain = require("@alipay/mychain")
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 蚂蚁区块链BaaS平台应用开发指南(四):JavaSDK的接入
- 企业区块链应用服务开发区块链BaaS平台搭建
- 区块链应用平台开发区块链BaaS服务平台搭建
- 企业区块链服务平台开发区块链BaaS应用平台开发
- 区块链+应用服务平台开发区块链BaaS应用系统开发
- 区块链BaaS应用平台开发区块链BaaS服务开发
- 区块链应用平台开发企业级区块链BaaS平台开发
- 区块链应用BaaS平台开发传统企业区块链落地开发
- 区块链落地应用平台开发区块链BaaS服务搭建
- Android应用开发:社会化平台登录接入
- 索爱针对Android平台推出WebSDK, 主要是为其Android手机开发应用。
- Unity3d与iOS交互开发——接入平台SDK必备技能
- Unity3D开发 - Unity3d与iOS交互开发(接入平台SDK)
- 新浪微博开发平台接入流程(1)---注册应用
- Serverless 应用开发指南:基于 Serverless 与 Lambda 的微信公共平台
- 2017安卓开发接入支付宝支付功能详解,真正做到完全翻译支付宝sdk开发应用
- 微信JS-SDK开发 入门指南
- 第三方平台正式支持接入微信公众平台JS-SDK
- 使用cmcc.in官方提供的sdk开发第三方接入应用
- ArcGIS Runtime SDK for Android 10.2.5新开发平台安装配置指南