HyperledgerFabric是一个联盟链,Fabric区块链也支持智能合约,称为链码(Chaincode)。Fabric链代码是一个标准的(在docker容器中运行)操作系统进程,它通过gRPC协议与Fabric节点通信。因此,理论上,任何语言都可以用来开发Fabric链码。目前,官方提供了Go、Java和Node.js三种开发语言的Fabric链码开发包。本文将介绍如何使用node.js开发Fabric链码。在汇智网,以互动的方式学习更多以太坊、比特币、EOS、tendermint等区块链开发教程。Fabric官方提供了两种开发node.js链码的方式:fabric-shim和fabric-contract-api。使用fabric-shim开发Fabric链码fabric-shim是底层链码开发包,封装了与节点通信的grpc协议。安装方法如下:~/fabric-shim-chaincode-demo$npminstallfabric-shimfabric-shim需要chaincode开发者定义一个类,实现两个预定义的方法。Init(stub):节点会在链码初始化时调用该方法。Invoke(stub):节点将应用程序对链码的调用转换为对该方法的调用。参数stub由节点传入,它提供了访问链上账本的方法,以便读取或更新账本状态。例如,以下代码实现了一个最小的node.js链代码,每次调用链代码时都会更新acc0的状态(例如:您可以使用此状态来表示帐户余额):constshim=require('fabric-shim');classEzChaincode{asyncInit(stub){returnshim.success(Buffer.from('initdone!'));//返回成功对象}asyncInvoke(stub){letkey='acc0';让oldValue=awaitstub.getState(key);//读取账本中acc0的状态letnewValue=oldValue+100;awaitstub.putState(key,Buffer.from(newValue));//更新acc0的状态returnshim.success(Buffer.from('updatedone!'));//返回成功对象}};定义链码后,您可以使用shim.start()方法启动链码实例。例如:constshim=require('fabric-shim');classEzChainCode{...}shim.start(newEzChaincode());这是一个完整的Fabric链码!将以上代码保存为demo.js,直接用node.js启动:~/fabric-shim-chaincode-demo$nodedemo.js使用fabric-contract-api开发Fabric链码fabric-shim是一个比较底层的Fabricgrpc协议封装,直接将chaincode接口暴露给开发者。虽然简单明了,但是如果要实现一个比较复杂的chaincode,开发者需要在Invoke实现中进行方法路由。fabric-contract-api是更高层次的封装。开发者直接继承开发包提供的Contract类,不用担心合约方法的路由问题。fabric-contract-api开发方法如下:~/fabric-contract-api-demo$npminstallfabric-contract-api使用fabric-contract-api的chaincode示例代码如下,除构造函数外的每个方法都是自动调用chaincode的方法,可以被外部应用程序调用:}asyncupdate(ctx,newValue){awaitctx.stub.putState('acc0',Buffer.from(newValue));returnBuffer.from('更新完成!');}asyncremove(ctx){//.....}};module.exports.contracts=['EzContract'];与fabric-shim不同,fabric-contract-api只需要链码导出contracts数组,所以不能直接使用node.js启动链码,需要使用fabric-chaincode-node程序。例如:~/fabric-contract-api-demo$fabric-chaincode-nodedemo.js汇智网原创,转载请注明出处。如果您想尽快学习课程,请访问Fabric区块链开发详解。本课程针对初学者。内容包括HyperledgerFabric身份证书和MSP服务、权限策略、通道配置和启动、链码通信接口等核心概念。Fabric网络设计、nodejs链码和应用开发的操作实践,是Nodejs工程师学习Fabric区块链开发的最佳选择。
