如何监听 Hyperledger Fabric 中的事件(提交事件)?
How to listen to the event(commit event) in Hyperledger Fabric?
我们搭建了一个fabric server,把一些交易放到里面。我们有一些应用程序将与结构服务器合作。这是一个情况。
- 应用程序使用
fabric-sdk-java
或 fabric-sdk-node
发送交易
- 面料执行
chaincode
- 结构将结果通知应用程序/应用程序监听交易事件(提交交易、生成区块链、追加区块链、更新世界状态等)
- 申请将交易结果通知海关
如您所知,执行 chaincode
需要一些时间。特别是 blockchain
会在几十秒后提交。所以我想要 peer
回调一个 url
或者只是让应用程序知道执行的结果。有可能吗?
您甚至可以注册到 hub 并列出 block/transaction 正在提交的通知。如果您正在寻找示例,请考虑查看 fabcar from fabric-samples. In particular you might want to take a look on invoke.js。
var options = {
wallet_path: path.join(__dirname, './creds'),
user_id: 'PeerAdmin',
channel_id: 'mychannel',
chaincode_id: 'fabcar',
peer_url: 'grpc://localhost:7051',
event_url: 'grpc://localhost:7053',
orderer_url: 'grpc://localhost:7050'
};
let eh = client.newEventHub();
eh.setPeerAddr(options.event_url);
eh.connect();
let txPromise = new Promise((resolve, reject) => {
let handle = setTimeout(() => {
eh.disconnect();
reject();
}, 30000);
eh.registerTxEvent(transactionID, (tx, code) => {
clearTimeout(handle);
eh.unregisterTxEvent(transactionID);
eh.disconnect();
if (code !== 'VALID') {
console.error(
'The transaction was invalid, code = ' + code);
reject();
} else {
console.log(
'The transaction has been committed on peer ' +
eh._ep._endpoint.addr);
resolve();
}
});
});
eventPromises.push(txPromise);
API 也存在于 Java 和 Golang SDK 中。
Hyperledger Composer 改变了我们使用 Hyperledger Fabric 区块链的方式。虽然我不能在这里给你所有的介绍,但我提供了一段代码,告诉你如何 (credits to):
- 定义事件
- 从您的交易中发出一个事件
- 从您的应用程序中监听事件
1) 定义一个事件:这里我有一个事件,由医生、病人和一条消息组成。
event MedicalEvent {
--> Doctor thedoctor
--> Patient thePatient
o String theMessage
}
transaction sampleTransaction {
--> Doctor thedoctor
--> Patient thePatient
}
2) 从交易中发出事件:这里我们将有链码的逻辑。
/**
*@ALL NECCESSARY DECORATIONS GO HERE
/
sampleTransaction(obj) {
var factory = getFactory();
var patient = obj.thepatient;
var doctor = obj.thedoctor;
var message = 'Take your medications PROPERLY';
return getParticipantRegistry('org.acme.WHATEVER.Patient')
.then(function(patientRegistry) {
var basicEvent = factory.newEvent('org.acme.WHATEVER', 'addMeLiveEvent');
basicEvent.theDoctor=doctor;
basicEvent.thePatient=patient;
basicEvent.theMessage = message;
emit(basicEvent);
})
}
3) 监听事件:这里我有我的 Nodejs 监听事件。
const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection;
this.bizNetworkConnection = new BusinessNetworkConnection();
this.cardName ='admin@YOUR-NETWORK';
this.businessNetworkIdentifier = 'YOUR-NETWORK';
this.bizNetworkConnection.connect(this.cardName)
.then((result) => {
//You can do ANYTHING
})
.catch((error) => {
throw error;
});
this.bizNetworkConnection.on('event',(evt)=>{
console.log('Amount Transfered: '+evt.theMessage);
});
我们搭建了一个fabric server,把一些交易放到里面。我们有一些应用程序将与结构服务器合作。这是一个情况。
- 应用程序使用
fabric-sdk-java
或fabric-sdk-node
发送交易
- 面料执行
chaincode
- 结构将结果通知应用程序/应用程序监听交易事件(提交交易、生成区块链、追加区块链、更新世界状态等)
- 申请将交易结果通知海关
如您所知,执行 chaincode
需要一些时间。特别是 blockchain
会在几十秒后提交。所以我想要 peer
回调一个 url
或者只是让应用程序知道执行的结果。有可能吗?
您甚至可以注册到 hub 并列出 block/transaction 正在提交的通知。如果您正在寻找示例,请考虑查看 fabcar from fabric-samples. In particular you might want to take a look on invoke.js。
var options = {
wallet_path: path.join(__dirname, './creds'),
user_id: 'PeerAdmin',
channel_id: 'mychannel',
chaincode_id: 'fabcar',
peer_url: 'grpc://localhost:7051',
event_url: 'grpc://localhost:7053',
orderer_url: 'grpc://localhost:7050'
};
let eh = client.newEventHub();
eh.setPeerAddr(options.event_url);
eh.connect();
let txPromise = new Promise((resolve, reject) => {
let handle = setTimeout(() => {
eh.disconnect();
reject();
}, 30000);
eh.registerTxEvent(transactionID, (tx, code) => {
clearTimeout(handle);
eh.unregisterTxEvent(transactionID);
eh.disconnect();
if (code !== 'VALID') {
console.error(
'The transaction was invalid, code = ' + code);
reject();
} else {
console.log(
'The transaction has been committed on peer ' +
eh._ep._endpoint.addr);
resolve();
}
});
});
eventPromises.push(txPromise);
API 也存在于 Java 和 Golang SDK 中。
Hyperledger Composer 改变了我们使用 Hyperledger Fabric 区块链的方式。虽然我不能在这里给你所有的介绍,但我提供了一段代码,告诉你如何 (credits to):
- 定义事件
- 从您的交易中发出一个事件
- 从您的应用程序中监听事件
1) 定义一个事件:这里我有一个事件,由医生、病人和一条消息组成。
event MedicalEvent {
--> Doctor thedoctor
--> Patient thePatient
o String theMessage
}
transaction sampleTransaction {
--> Doctor thedoctor
--> Patient thePatient
}
2) 从交易中发出事件:这里我们将有链码的逻辑。
/**
*@ALL NECCESSARY DECORATIONS GO HERE
/
sampleTransaction(obj) {
var factory = getFactory();
var patient = obj.thepatient;
var doctor = obj.thedoctor;
var message = 'Take your medications PROPERLY';
return getParticipantRegistry('org.acme.WHATEVER.Patient')
.then(function(patientRegistry) {
var basicEvent = factory.newEvent('org.acme.WHATEVER', 'addMeLiveEvent');
basicEvent.theDoctor=doctor;
basicEvent.thePatient=patient;
basicEvent.theMessage = message;
emit(basicEvent);
})
}
3) 监听事件:这里我有我的 Nodejs 监听事件。
const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection;
this.bizNetworkConnection = new BusinessNetworkConnection();
this.cardName ='admin@YOUR-NETWORK';
this.businessNetworkIdentifier = 'YOUR-NETWORK';
this.bizNetworkConnection.connect(this.cardName)
.then((result) => {
//You can do ANYTHING
})
.catch((error) => {
throw error;
});
this.bizNetworkConnection.on('event',(evt)=>{
console.log('Amount Transfered: '+evt.theMessage);
});