14fabric node sdk1.4.8统计目前区块中的交易数

Posted 每天看一遍,防止恋爱&&堕落

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14fabric node sdk1.4.8统计目前区块中的交易数相关的知识,希望对你有一定的参考价值。

文章目录

声明使用的版本

  • fabric版本如下:1.4.8
  • node-sdk版本:1.4.8
  • node版本:v8.11.1
  • ubuntu版本:16.04

本文要实现的功能

统计目前区块链中所有的交易信息

开始实现功能

了解block的结构体

之前说过,block对交易信息进行了封装,有的时候一个block包含有N个交易信息,这都是根据你在生成创世区块中设置的,相关设置如下

 "Profiles": 
    "TwoOrgsOrdererGenesis": 
      "Orderer": 
        "OrdererType": "solo",
        "Addresses": [
          "orderer.zeng.com:7050"
        ],
        "BatchTimeout": "2s",
        "BatchSize": 
          "MaxMessageCount": 10,
          "AbsoluteMaxBytes": "99 MB",
          "PreferredMaxBytes": "512 KB"
        ,
...

先来频繁的进行交易

如果速度慢的话,每个区块就只有一个交易,那么不方便我们做测试,所以打算用最快的方式在几秒钟进行交易,则最快的方式是使用cli(可以多个节点同时提交)

export set CORE_PEER_LOCALMSPID=Org1MSP
export set CORE_PEER_ADDRESS=peer0.org1.zeng.com:7051
export set CORE_PEER_MSPCONFIGPATH=./crypto-config/peerOrganizations/org1.zeng.com/users/Admin@org1.zeng.com/msp

peer chaincode invoke -o orderer.zeng.com:7050 --tls true --cafile ./crypto-config/ordererOrganizations/zeng.com/tlsca/tlsca.zeng.com-cert.pem -C mychannel -n mycc -c '"Args":["invoke","a","b","40"]'

开始用sdk实现对应的功能

得到交易总数的思路

通过sdk官网提供的一行代码,给了我们思路

lock.data.data的长度,就代表了当前block的交易个数

写代码的思路

那么我们代码的思路如下

  • 1、想办法得到最新区块的编号
  • 2、从0开始到最大区块编号,调用按照编号获取区块的函数
  • 3、累加统计每一个区块中交易的总数

按照思路实现代码

// 得到所有的交易信息
async function queryTransactionCount(orgAdminName, peerName, channelName) 
	try 

		// let config = getConfig();
        const ccpPath = path.resolve(__dirname, "connect-sdk.json");
        const ccp = JSON.parse(fs.readFileSync(ccpPath, 'utf8'));
		const walletPath = path.join(process.cwd(), 'wallet');
		const wallet = new FileSystemWallet(walletPath);
		console.log(`Wallet path: $walletPath`);
		// Check to see if we've already enrolled the user.
		const userExists = await wallet.exists(orgAdminName);
		if (!userExists) 
			console.log(`An identity for the user $orgAdminName does not exist in the wallet`);
			console.log('Run the registerUser.js application before retrying');
			return;
		
        // Create a new gateway for connecting to our peer node.
        const gateway = new Gateway();
        await gateway.connect(ccp,  wallet, identity: orgAdminName, discovery:  enabled: true, asLocalhost: false  );
        // Get the network (channel) our contract is deployed to.
		const client = gateway.getClient();
		const target = client.getPeer(peerName);
		const channel = client.getChannel(channelName);
		const res = await channel.queryInfo(target, orgAdminName) // 返回当前块的信息
		// console.log(res.height.low) // 得到当前最大块的编号
		let totalTransCount = 0
		for(let index = 0; index < res.height.low; index++) 
			let block = await channel.queryBlock(index, target)
			// console.log(block.data.data.length)
			totalTransCount += block.data.data.length
		
		logger.debug("totalTransCount:", totalTransCount, " blockNum:", res.height.low)
     catch (error) 
        console.error(`Failed to evaluate transaction: $error`);
        process.exit(1);
    

调用测试

测试代码如下

async function test3() 
	const orgAdminName = "admin1"
	const channelName = "mychannel"
	const peerName = "peer0.org1.zeng.com"
	const txId = "a36aaafac39eda715985ad25d547b61282822fac9e51a08e4fe5a44bd797b5b8"
	await queryTransactionCount(orgAdminName, peerName, channelName)


test3();

调用后的输出内容

fabric-node2@fabric-node2:~/go/src/github.com/hyperledger/fabric-samples-1.4.8/first-network/test-crytogen/msp$ node chainCode.js 
Wallet path: /home/fabric-node2/go/src/github.com/hyperledger/fabric-samples-1.4.8/first-network/test-crytogen/msp/wallet
[2021-04-27T10:02:06.028] [DEBUG] test - totalTransCount: 17  res.height.low: 10

假如当前区块有好几千万,如何做统计?

只能用数据库来保存,这是一个迭代的过程

整个部分所使用的头文件

'use strict';

const  FileSystemWallet, Gateway, X509WalletMixin  = require('fabric-network');
const Client = require('fabric-client');
const BlockDecoder = require('fabric-client/lib/BlockDecoder.js');
const ProtoLoader = require('fabric-client/lib/ProtoLoader');
const ledgerProto = ProtoLoader.load("fabric-client/lib" + '/protos/common/ledger.proto');
const utils = require('fabric-client/lib/utils.js');
const fs = require('fs');
const path = require('path');
const util = require('util');
const userOpt = require('./userOpt');

const incHashString, getConfig, loadWallet = require('./utils');
var log4js = require('log4js');
var getLogger = function(moduleName) 
	var logger = log4js.getLogger(moduleName);
	// logger.setLevel('DEBUG');
	logger.level = 'DEBUG';
	return logger;
;
const logger = getLogger('test');

写在sdk的结束部分

这篇已经算是node sdk调用的最后一篇了,如果你顺利看到了这里,差不多sdk的功能你都已经能做出来了

接下来将要实现的一部分将为:

  • 1、将sdk的功能封装到web中,期间需要涉及到node的web服务(正在纠结用koa还是express)
  • 2、做一个建议的web管理系统,让用户进行使用(之前有用过vue,因为我个人原因又丢了一段时间)
  • 3、补齐证书的生成部分(一直想要整理,但目前又太乱了)

参考网站

以上是关于14fabric node sdk1.4.8统计目前区块中的交易数的主要内容,如果未能解决你的问题,请参考以下文章

5fabric node sdk1.4.8链码操作相关

4fabric node sdk1.4.8链码操作相关

2fabric node sdk1.4.8加入通道

6fabric node sdk1.4.8用户管理相关

7fabric node sdk1.4.8新增删除组织

8fabric node sdk1.4.8新增删除组织