在确定了开发的智能合约,我们必须为合约开发搭建合适的API,实现应用调用API,实现区块链服务的成功调用。我曾经尝试使用Composer 进行开发搭建。Composer 目前支持的fabric版本在1.2,而组织demo支持运行的1.0版本。简单的说 , hyperledger composer 是一个集成工具,他能更快的开发区块链应用。它能定义资产,参与者,事务方法(智能合约),权限控制等 来编写自己的业务; 然后打包业务 再部署到fabric区块链网络上。
我认为composer最大的好处就是:对fabric node sdk的封装+对chaincode的封装+权限的灵活扩展。但其最大的缺点在于无法提供复杂的应用开发机制,现在还处于发展阶段,所以我们根据业务选择了fabric原生开发包进行开发。
'use strict'; //使用严格的模式
/*
* Enroll the admin user //注册管理员
*/
//引入fabric客户端包
var Fabric_Client = require('fabric-client');
//引入fabric CA服务端包
var Fabric_CA_Client = require('fabric-ca-client');
//引入文件包
var path = require('path');
//引入工具包
var util = require('util');
//引入系统包
var os = require('os');
//新建一个fabric客户端实例
var fabric_client = new Fabric_Client();
//设置一个空的CA服务
var fabric_ca_client = null;
//管理员为空
var admin_user = null;
//用户为空
var member_user = null;
//设置完整的证书和密匙文件存储路径
var store_path = path.join(__dirname, 'hfc-key-store');
//打印出文件存储路径
console.log(' Store path:'+store_path);
//创建一个新的默认的键值存储数据库,通过设置好的完整路径。
// create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting使用default.json 'key-value-store' setting规定的js文件完成设置
Fabric_Client.newDefaultKeyValueStore({ path: store_path
}).then((state_store) => { //异步执行,创建新数据库后,获得数据库路径执行下面方法
// assign the store to the fabric client
//设置客户端存储路径,使其具有可插拔特性(持久保存)。
fabric_client.setStateStore(state_store);
//获得一个加密模块的变量,一个加密模块打包了数字签名的算法和使用非对称密钥对的加密功能,使用对称密钥加密的消息,安全的hashing处理和MAC。
var crypto_suite = Fabric_Client.newCryptoSuite();
// use the same location for the state store (where the users' certificate are kept)
//在同样的路径下,获得加密文件存储路径
// and the crypto store (where the users' keys are kept)
var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path});
//设置加密模块生成的加密文件的路径
crypto_suite.setCryptoKeyStore(crypto_store);
//在客户端设置一个加密模块的实例
fabric_client.setCryptoSuite(crypto_suite);
var tlsOptions = { //设置tls选项,可信任根和不进行验证
trustedRoots: [],
verify: false
};
// be sure to change the http to https when the CA is running TLS enabled 当CA运行TLS时,请确保将HTTP更改为HTTPS。
//将设置好的IP端口、加密模块和存储路径,传输安全设置、设置域名,生成一个CA服务实例
fabric_ca_client = new Fabric_CA_Client('http://localhost:7054', tlsOptions , 'ca.example.com', crypto_suite);
// first check to see if the admin is already enrolled
//首先检查管理员是否已经注册
return fabric_client.getUserContext('admin', true);
}).then((user_from_store) => { //如果存在路径且已经注册,则输出成功注册
if (user_from_store && user_from_store.isEnrolled()) {
console.log('Successfully loaded admin from persistence');
admin_user = user_from_store;
return null;
} else { //使用CA服务去注册用户,输入ID和密码
// need to enroll it with CA server
return fabric_ca_client.enroll({
enrollmentID: 'admin',
enrollmentSecret: 'adminpw'
}).then((enrollment) => { //获得注册信息。打印出注册成功
console.log('Successfully enrolled admin user "admin"');
return fabric_client.createUser( //生成用户,通过注册信息生成加密材料(私钥和签名证书)
{username: 'admin',
mspid: 'Org1MSP',
cryptoContent: { privateKeyPEM: enrollment.key.toBytes(), signedCertPEM: enrollment.certificate }
});
}).then((user) => { //获得用户,将该用户设置为管理员账户
admin_user = user;
return fabric_client.setUserContext(admin_user); //设置为当前客户端示例
}).catch((err) => { //出错则打印错误
console.error('Failed to enroll and persist admin. Error: ' + err.stack ? err.stack : err);
throw new Error('Failed to enroll admin');
});
}
}).then(() => { //打印出注册的账户名
console.log('Assigned the admin user to the fabric client ::' + admin_user.toString());
}).catch((err) => { //打印出错误
console.error('Failed to enroll admin: ' + err);
});
流程:
设置文件路径,设置加密模块,将二者联系在一起,生成加密模块实例,然后与IP、域名、TLS设置结合在一起,生成CA服务实例,检查是否注册管理员,注册则将其绑定为管理员打印输出,否则通过输入ID和密码注册到CA服务,然后通过信息生成加密材料,通过加密材料生成用户,将用户设置为管理员,打印日志即可。
希望大家关注我的微信公众号,有疑问可以后台留言。