更新现有资产 - Hyperledger Composer
Updating Existing Assets - Hyperledger Composer
我正在尝试在 composer 中创建一个简单的 hyperledger 链码,它接受一个贷款号,如果它存在,则更新关联的资产,否则创建一个新资产。
我的模型文件如下所示:
asset Loan identified by loanNum{
o String loanNum
o Double balance
}
transaction createTransaction {
o String loanNum
o Double transAmount
}
我的脚本如下所示:
function createTransaction(tx) {
var NS = 'org.acme.ra';
var factory = getFactory();
var loanToUpdate
//returns all assets
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry){
return assetRegistry.exists(tx.loanNum);
})
.then(function(exists){
if (exists) {
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry2){
loanToUpdate = assetRegistry2.get(tx.loanNum)
loanToUpdate.balance = tx.transAmount;
return assetRegistry2
})
.then(function(updateAssetRegistry){
return updateAssetRegistry.update(loanToUpdate)//broken right here
})
}
else {
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry2){
var newLoan =factory.newResource(NS,'Loan',tx.loanNum);
newLoan.balance = tx.transAmount;
return assetRegistry2.add(newLoan);
})
}
})
}
脚本摘要:
- 两个值被提供给脚本,一个贷款号和一个交易
数量。
- 脚本然后 returns 资产注册表和 returns
如果贷款编号已经存在,则为适当的 bool。
- 如果为 False(资产注册表中不存在贷款),将使用交易中的贷款编号和余额创建新资产。
- 如果为 True,则返回资产注册表,然后我使用 .get 函数并将结果设置为等于在脚本开始时创建的 loanToUpdate 变量。然后,我使用资产注册表上的 .update(loanToUpdate) 函数来更新现有资产。
当 bool 为 False 时,脚本可以正常工作并创建新资产,但是当 bool 为 True 且交易包含已存在的贷款编号时,我收到错误 "Error: Expected a Resource or Concept."
编辑
现在我在这方面有了更多的经验,我认为使用内置关系可以更容易地完成它,但是 post 我在下面更新的功能代码。
更新代码修复:
function createTransaction(tx) {
var NS = 'org.acme.ra';
var factory = getFactory();
var loanToUpdate
//returns all assets
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry){
return assetRegistry.exists(tx.loanNum);
})
.then(function(exists){
if (exists) {
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry2){
return assetRegistry2.get(tx.loanNum);
})
.then(function(updateloan){
loanToUpdate = updateloan
loanToUpdate.balance = tx.transAmount;
return getAssetRegistry(NS + '.Loan')
})
.then(function(assetRegistry3){
return assetRegistry3.update(loanToUpdate);
})
}
else {
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry2){
var newLoan = factory.newResource(NS,'Loan',tx.loanNum);
newLoan.balance = tx.transAmount;
return assetRegistry2.add(newLoan);
})
}
})
}
获得资产登记returns一个承诺,所以行
loanToUpdate = assetRegistry2.get(tx.loanNum)
需要成为承诺链的一部分,因此您需要一个 .then
块来处理返回值,然后才能更新它。
我正在尝试在 composer 中创建一个简单的 hyperledger 链码,它接受一个贷款号,如果它存在,则更新关联的资产,否则创建一个新资产。
我的模型文件如下所示:
asset Loan identified by loanNum{
o String loanNum
o Double balance
}
transaction createTransaction {
o String loanNum
o Double transAmount
}
我的脚本如下所示:
function createTransaction(tx) {
var NS = 'org.acme.ra';
var factory = getFactory();
var loanToUpdate
//returns all assets
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry){
return assetRegistry.exists(tx.loanNum);
})
.then(function(exists){
if (exists) {
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry2){
loanToUpdate = assetRegistry2.get(tx.loanNum)
loanToUpdate.balance = tx.transAmount;
return assetRegistry2
})
.then(function(updateAssetRegistry){
return updateAssetRegistry.update(loanToUpdate)//broken right here
})
}
else {
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry2){
var newLoan =factory.newResource(NS,'Loan',tx.loanNum);
newLoan.balance = tx.transAmount;
return assetRegistry2.add(newLoan);
})
}
})
}
脚本摘要:
- 两个值被提供给脚本,一个贷款号和一个交易 数量。
- 脚本然后 returns 资产注册表和 returns 如果贷款编号已经存在,则为适当的 bool。
- 如果为 False(资产注册表中不存在贷款),将使用交易中的贷款编号和余额创建新资产。
- 如果为 True,则返回资产注册表,然后我使用 .get 函数并将结果设置为等于在脚本开始时创建的 loanToUpdate 变量。然后,我使用资产注册表上的 .update(loanToUpdate) 函数来更新现有资产。
当 bool 为 False 时,脚本可以正常工作并创建新资产,但是当 bool 为 True 且交易包含已存在的贷款编号时,我收到错误 "Error: Expected a Resource or Concept."
编辑
现在我在这方面有了更多的经验,我认为使用内置关系可以更容易地完成它,但是 post 我在下面更新的功能代码。
更新代码修复:
function createTransaction(tx) {
var NS = 'org.acme.ra';
var factory = getFactory();
var loanToUpdate
//returns all assets
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry){
return assetRegistry.exists(tx.loanNum);
})
.then(function(exists){
if (exists) {
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry2){
return assetRegistry2.get(tx.loanNum);
})
.then(function(updateloan){
loanToUpdate = updateloan
loanToUpdate.balance = tx.transAmount;
return getAssetRegistry(NS + '.Loan')
})
.then(function(assetRegistry3){
return assetRegistry3.update(loanToUpdate);
})
}
else {
return getAssetRegistry(NS + '.Loan')
.then(function(assetRegistry2){
var newLoan = factory.newResource(NS,'Loan',tx.loanNum);
newLoan.balance = tx.transAmount;
return assetRegistry2.add(newLoan);
})
}
})
}
获得资产登记returns一个承诺,所以行
loanToUpdate = assetRegistry2.get(tx.loanNum)
需要成为承诺链的一部分,因此您需要一个 .then
块来处理返回值,然后才能更新它。