在 HYPERLEDGER Fabric 的链码中调用合约形成另一个合约
Call contract form another contract in chaincode in HYPERLEDGER Fabric
我正在尝试从一个通道内的另一个合同调用合同并部署在一个 Chaincode('cc') 上。 HLF 1.4 版本
class Contract1 extends Contract {
constructor() {
super('Contract1');
}
async testContract2(ctx) {
const res = await ctx.stub.invokeChaincode('cc', ['test']);
return JSON.stringify(res);
}
}
class Contract2 extends Contract {
constructor() {
super('Contract2');
}
async test(ctx) {
// some logic
}
}
出现错误:
[Query]: evaluate: Query ID "[object Object]" of peer "peer0.org1.example.com:7051" failed:
message=transaction returned with failure: Error: INVOKE_CHAINCODE failed:
transaction ID: 82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7:
execute failed: error sending: txid: 82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7(some-channel) exists,
stack=Error: transaction returned with failure: Error: INVOKE_CHAINCODE failed: transaction ID:
82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7:
execute failed: error sending: txid: 82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7(some-channel) exists
(/hyperledger-fabric/javascript/node_modules/grpc/src/client_interceptors.js:845:24),status=500,
url=grpcs://localhost:7051, name=peer0.org1.example.com:7051,
grpc.max_receive_message_length=-1, grpc.max_send_message_length=-1,
grpc.keepalive_time_ms=120000, grpc.http2.min_time_between_pings_ms=120000,
grpc.keepalive_timeout_ms=20000, grpc.http2.max_pings_without_data=0,
grpc.keepalive_permit_without_calls=1, name=peer0.org1.example.com:7051,
grpc.ssl_target_name_override=peer0.org1.example.com,
grpc.default_authority=peer0.org1.example.com, isProposalResponse=true
Failed to evaluate transaction: Error: transaction returned with failure: Error:
INVOKE_CHAINCODE failed: transaction ID:
82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7: execute failed: error sending:
txid: 82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7(some-channel) exists
其他一切都按预期工作(从客户端调用方法、保存状态等)。我做错了什么?是否无法在同一链代码中从一个合约调用另一个合约的方法???
TL;DR
class Contract1 extends Contract {
constructor() {
super('Contract1');
}
async testContract2(ctx) {
let contract2 = new Contract2();
const res = await contract2.test(ctx)
.....
}
}
class Contract2 extends Contract {
constructor() {
super('Contract2');
}
async test(ctx) {
// some logic
}
}
ctx.stub.invokeChaincode
旨在实际调用另一个链代码。部分混淆是 Contract
和 chaincode
并不完全相同。
在您的例子中,您已经在单个链代码中实现了两个 Contracts
。 Contract
是更高层次的抽象,一个或多个 Contracts
可以封装在同一个 chaincode
.
中
所以你实际上想要 Contract
在同一个链代码中调用 Contract
,而不是跨两个不同的链代码。
我正在尝试从一个通道内的另一个合同调用合同并部署在一个 Chaincode('cc') 上。 HLF 1.4 版本
class Contract1 extends Contract {
constructor() {
super('Contract1');
}
async testContract2(ctx) {
const res = await ctx.stub.invokeChaincode('cc', ['test']);
return JSON.stringify(res);
}
}
class Contract2 extends Contract {
constructor() {
super('Contract2');
}
async test(ctx) {
// some logic
}
}
出现错误:
[Query]: evaluate: Query ID "[object Object]" of peer "peer0.org1.example.com:7051" failed:
message=transaction returned with failure: Error: INVOKE_CHAINCODE failed:
transaction ID: 82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7:
execute failed: error sending: txid: 82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7(some-channel) exists,
stack=Error: transaction returned with failure: Error: INVOKE_CHAINCODE failed: transaction ID:
82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7:
execute failed: error sending: txid: 82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7(some-channel) exists
(/hyperledger-fabric/javascript/node_modules/grpc/src/client_interceptors.js:845:24),status=500,
url=grpcs://localhost:7051, name=peer0.org1.example.com:7051,
grpc.max_receive_message_length=-1, grpc.max_send_message_length=-1,
grpc.keepalive_time_ms=120000, grpc.http2.min_time_between_pings_ms=120000,
grpc.keepalive_timeout_ms=20000, grpc.http2.max_pings_without_data=0,
grpc.keepalive_permit_without_calls=1, name=peer0.org1.example.com:7051,
grpc.ssl_target_name_override=peer0.org1.example.com,
grpc.default_authority=peer0.org1.example.com, isProposalResponse=true
Failed to evaluate transaction: Error: transaction returned with failure: Error:
INVOKE_CHAINCODE failed: transaction ID:
82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7: execute failed: error sending:
txid: 82c10988ad2c7cef468cae937d2e0d0bfe649f7f9c5406498733d7ef20d387f7(some-channel) exists
其他一切都按预期工作(从客户端调用方法、保存状态等)。我做错了什么?是否无法在同一链代码中从一个合约调用另一个合约的方法???
TL;DR
class Contract1 extends Contract {
constructor() {
super('Contract1');
}
async testContract2(ctx) {
let contract2 = new Contract2();
const res = await contract2.test(ctx)
.....
}
}
class Contract2 extends Contract {
constructor() {
super('Contract2');
}
async test(ctx) {
// some logic
}
}
ctx.stub.invokeChaincode
旨在实际调用另一个链代码。部分混淆是 Contract
和 chaincode
并不完全相同。
在您的例子中,您已经在单个链代码中实现了两个 Contracts
。 Contract
是更高层次的抽象,一个或多个 Contracts
可以封装在同一个 chaincode
.
所以你实际上想要 Contract
在同一个链代码中调用 Contract
,而不是跨两个不同的链代码。