如何在Hyperledger架构的同一应用程序中实现多个智能合约?哪个配置文件包含实现此目的的设置?
答案 0 :(得分:2)
以相同的FabCar示例为例,并假设以下条件:
1)您想要一个具有多个智能合约的链码,并且
2)该链码的每个智能合约都将保存在单独的文件中。
要实现上述解决方案,请在与Hyperledger / fabric-samples中所示的chaincode structure和application structure相同的情况下执行以下操作。
请注意,您也可以有多个链码,但是在这里我不会重点讨论。要了解有关多个链码的更多信息,请转到here。
下面是javascript链码语言的代码段。
文件1:lib / fabcarcontract.js
class FabCarContract extends Contract {
constructor() {
// Unique smart contract name when multiple contracts per chaincode
super('FabCarContract');
}
// ... (add smart contract functions here)
}
module.exports = FabCarContract;
文件2:lib / newcontract1.js
class NewContract1 extends Contract {
constructor() {
// Unique smart contract name when multiple contracts per chaincode
super('NewContract1');
}
// ... (add smart contract functions here)
}
module.exports = NewContract1;
文件3:lib / newcontract2.js
class NewContract2 extends Contract {
constructor() {
//Unique smart contract name when multiple contracts per chaincode
super('NewContract2');
}
// ... (add smart contract functions here)
}
module.exports = NewContract2;
现在,我们必须在index.js文件中引用这些合同,该文件位于智能合约目录的根级别。
索引文件:index.js
'use strict';
const FabCarContract = require('./lib/fabcarcontract');
const NewContract1 = require('./lib/newcontract1');
const NewContract2 = require('./lib/newcontract2');
module.exports.FabCarContract = FabCarContract;
module.exports.NewContract1 = NewContract1;
module.exports.NewContract2 = NewContract2;
module.exports.contracts = [ FabCarContract, NewContract1, NewContract2 ];
请注意,package.json文件中的我们的名称字段创建我们的链码名称,并且,如果仅定义了一个智能合约,则链码名称是默认的智能合约名称。 由于我们有多个,所以我们必须通过引用fabcar来引用链式代码中的每个智能合约。 NewContract1,只有这样,我们才能使用NewContract1文件中定义的功能。
让我们看一下我们现在如何引用合同的示例。
在我们的应用程序文件夹->中,如果我们具有访问智能合约的适当凭据/钱包结构,则可以检查invoke.js文件以查看如何在链码中实际调用不同的智能合约。
invoke.js
const network = await gateway.getNetwork('mychannel');
// first we get the chaincode i.e. fabcar,
// then reference which smart contract within that chaincode we want.
// here we do NewContract1 but it could have easily been NewContract2 or FabCarContract
// because we have defined all three of those in our chaincode folder
const contract = network.getContract('fabcar', 'NewContract1');
// now we have access to all functions within NewContract1 file.
await contract.submitTransaction(.....);
现在,如果我们想访问NewContract2
中定义的功能,我们只需更改上面的代码即可获得名为NewContract2
的智能合约的合约,依此类推。
答案 1 :(得分:1)
让我澄清一下塞尔吉奥的回答:
首先,您需要注意,要在同一个区块链中运行多个智能合约,您必须在同行PER智能合约之间创建自定义渠道。
这并不完全正确,因为您不需要安装链码(smartcontract) PER 频道。它完全取决于您的特定应用程序,设计,信任模型和业务案例要求。一个通道可以根据需要实例化多个链码。实现这一目标的过程非常简单,您只需要将所有必需的链代码安装到对等体中,并在要使用它们的通道上实例化每个链代码。例如,您可以安装两个链接代码,旨在在单个通道的范围内进行交互,例如" MyChannel"以下方式:
安装第一个链码
peer chaincode install -o localhost:7050 -n myCC1 -v 1.0 -p github.com/chaincode/mychaincode1
安装第二个链码
peer chaincode install -o localhost:7050 -n myCC2 -v 1.0 -p github.com/chaincode/mychaincode2
实例化
peer chaincode instantiate -o localhost:7050 -n myCC1 -v 1.0 -C MyChannel -c '{"Args":[]}'
peer chaincode instantiate -o localhost:7050 -n myCC2 -v 1.0 -C MyChannel -c '{"Args":[]}'
因此,您将在通道myCC1
的范围内安装并实例化两个链码myCC2
和MyChannel
。
请关注官方tutorial并考虑与Rocket.Chat建立联系以获得专家社区的更多帮助。
答案 2 :(得分:1)
我将使用Hyperledger Fabric 1.4版中的Fabcar示例回答您的问题。我的答案是基于Javascript实现的。
如果您看到文件夹结构,则会看到存在一个Chaincode文件夹,其中包含fabcar.js(chaincode / fabcar / javascript / lib / fabcar.js)链码。
智能合约在链码中定义。可以在同一链码中定义多个智能合约。部署了链码后,其中的所有智能合约都可用于应用程序。
在此特定的链码中,只有一个智能合约即FabCar,您可能会观察到该文件仅导出一个合约。
如果要添加更多智能合约,只需在同一链代码中创建另一个Class,即可扩展Contract类别,然后将其导出。下面显示了一个示例。
class FabCar extends Contract {
...
...
...
}
class NewContract1 extends Contract {
...
...
...
}
class NewContract2 extends Contract {
...
...
...
}
module.exports.FabCar = FabCar;
module.exports.NewContract1 = NewContract1;
module.exports.NewContract2 = NewContract2;
您需要对index.js(chaincode / fabcar / javascript / index.js)进行一些更改。
'use strict';
const FabCar = require('./lib/fabcar').FabCar;
const NewContract1 = require('./lib/careonlineChaincode').NewContract1;
const NewContract2 = require('./lib/careonlineChaincode').NewContract2;
module.exports.FabCar = FabCar;
module.exports.NewContract1 = NewContract1;
module.exports.NewContract1 = NewContract2;
module.exports.contracts = [ FabCar, NewContract1, NewContract2 ];
现在,对于客户端应用程序,您可以参考Fabar客户端实现。 (fabric-sample / fabcar / javascript / invoke.js)。下面我展示了一个示例,说明如何轻松调用这些不同的合同。
const contract = network.getContract('fabcar', 'FabCar');
//getContact(chaincode name, contract name)
const newContract1 = network.getContract('fabcar', 'NewContract1');
const newContract2 = network.getContract('fabcar', 'NewContract2');
现在您可以单独调用这些合同并使用它们的交易了。
示例:
await contract.submitTransaction('someTrancsaction', 'someData');
await newContract1.submitTransaction('someTrancsactionFromThisContract', 'someDataFromHere');
await newContract2.submitTransaction('differentTransacation', 'randomdata');
希望您理解了整个示例。如果您需要更多说明,请发表评论。我没有涉及如何安装和实例化chaincode。为此,您可以通过@Artem引用答案。但是他的方法是在同一频道上安装2个链码。我不确定,这也可能有用。但这是一种只有一个Chaincode的简单方法。
答案 3 :(得分:-1)
首先,您需要注意,要在同一区块链中运行多个智能合约,您必须在对等方之间创建自定义渠道。在该频道中,可以安装所需数量的智能合约
只需按照相同的程序编译,实例化并在一个渠道上运行市场合约,您只需要为每个要使用的智能合约重复此过程