.update 和 .updateAll 未按需运行
.update and .updateAll not functioning as needed
我正在 Composer 上构建一个应用程序,它与 Playground 上的示例 Bond 网络非常相似。我的部分申请要求在到期日删除过时的合同。因此,代码必须获取所有合同,找到日期小于当前日期的合同,并将它们的 valid
字段更改为 false
。下面是我 运行:
的一些代码
function SOD(sod) { // eslint-disable-line no-unused-vars
return getAssetRegistry('org.acme.otc.LiveContract')
.then(function (contractRegistry){
return contractRegistry.getAll();
})
.then(function (l){
allContracts=l;
//console.log('Curr List: ',allContracts);
var q = new Date();
var m = q.getMonth();
var d = q.getDay();
var y = q.getFullYear();
var date = new Date(y,m,d);
var arr=[];
allContracts.forEach(function(contract) {
//console.log('Contract Date: ',contract.contract.expiry);
if (contract.contract.expiry<date) {
//console.log('Checks Out');
//console.log('Destroying: ',contract);
arr.push(contract);
//console.log('Return: ',x);
}
})
return arr
}).then( function(arr){
var factory = getFactory();
new_arr=[];
fLen = arr.length;
for (i = 0; i < fLen; i++) {
var old_contract=arr[i];
console.log('ISIN: ',old_contract.ISINcode);
var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
console.log('Entry: ',old_contract);
new_contract.contract=old_contract.contract;
new_contract.valid=false;
new_arr.push(new_contract);
} x=invalidate(new_arr);
});
现在,生成 new_arr
的代码运行良好。我可以在 Playground 中检查并得到以下日志 new_arr
:
New Array
但是,当我在 new_arr
上调用 invalidate on 或在 SOD
中复制该代码时,不会发生对注册表的预期影响。我在 valid
字段下没有得到 false
。当我尝试在调试器中读入 x 时,我得到了 limp-wristed Promise 响应:
Ugh
这是我的 .cto 和 .acl 文件:
//otc.cto
namespace org.acme.otc
participant Trader identified by traderId {
o String traderId
o String name
o Boolean marginThresh // margin meeting maintenance minimum
}
participant Administrator identified by adminId {
o String adminId
o Boolean tradingOpen
}
enum Product {
o OPTION
o FUTURE
o FORWARD
}
concept Order {
o String traderID
o Product productType
o String asset // commodity? underlying? - may later need typing
o Boolean buy
o Double notionalAmount
o DateTime expiry // only needs to specify date
}
concept Contract {
o String buyerID // buyer/seller vs maker/taker?
o String sellerID
o Product productType
o String asset // commodity? underlying? - may later need typing
o Double notionalAmount
o Double value
o DateTime expiry
}
asset OpenOrder identified by ISINcode {
o String ISINcode
o Order order
o Boolean valid
}
asset LiveContract identified by ISINcode {
o String ISINcode
o Contract contract
o Boolean valid
}
transaction PlaceOrder {
o String ISINCode
o Order order
}
transaction SOD {
o String adminId
}
transaction Test {}
//permissions.acl
rule Issuer {
description: "Allow full access to the issuer of a bond"
participant(i): "org.acme.otc.Trader"
operation: ALL
resource(a): "org.acme.otc.OpenOrder"
condition: (a.bond.issuer.memberId === i.memberId)
action: ALLOW
}
rule Default {
description: "Allow read access"
participant: "org.acme.otc.*"
operation: ALL
resource: "org.acme.otc.*"
action: ALLOW
}
rule SystemACL {
description: "System ACL to permit all access"
participant: "org.hyperledger.composer.system.Participant"
operation: ALL
resource: "org.hyperledger.composer.system.**"
action: ALLOW
}
rule NetworkAdminUser {
description: "Grant business network administrators full access to user resources"
participant: "org.hyperledger.composer.system.NetworkAdmin"
operation: ALL
resource: "**"
action: ALLOW
}
rule NetworkAdminSystem {
description: "Grant business network administrators full access to system resources"
participant: "org.hyperledger.composer.system.NetworkAdmin"
operation: ALL
resource: "org.hyperledger.composer.system.**"
action: ALLOW
}
我在 JavaScript 方面经验不足,所以错误可能很小。感谢您的帮助。
更新:
我正在处理 Paul 的回复。我的新代码如下
/**
* Start of Day Update
* @param {org.acme.otc.SOD} sod - the sod transaction
* @transaction
*/
function SOD(sod) { // eslint-disable-line no-unused-vars
//arr=pare();
var aR=null;
return getAssetRegistry('org.acme.otc.LiveContract')
.then(function (contractRegistry){
ar=contractRegistry;
return ar.getAll();
})
.then(function (l){
allContracts=[];
allContracts=l;
console.log('Curr List: ',allContracts);
var q = new Date();
var m = q.getMonth();
var d = q.getDay();
var y = q.getFullYear();
var date = new Date(y,m,d);
console.log('Current Date: ',date);
arr=[];
allContracts.forEach(function(contract) {
//console.log('Contract Date: ',contract.contract.expiry);
if (contract.contract.expiry<date) {
//console.log('Checks Out');
//console.log('Destroying: ',contract);
arr.push(contract);
//console.log('Return: ',x);
}
})
return arr
}).then( function(arr){
var factory = getFactory();
new_arr=[];
fLen = arr.length;
for (i = 0; i < fLen; i++) {
var old_contract=arr[i];
console.log('ISIN: ',old_contract.ISINcode);
var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
console.log('Entry: ',old_contract);
new_contract.contract=old_contract.contract;
new_contract.valid=false;
new_arr.push(new_contract);
}
console.log(new_arr);
});
console.log("getting to update the records");
return aR.updateAll(new_arr);
}
然而它不起作用。代码似乎永远不会达到最终的 console.log
。之前的日志没有问题,里面的新合约是正确的。现在有什么想法吗?
没有看到 updateAll
代码位,也不知道 invalidate(new_arr)
有什么功能 - 所以我会 post 类似的东西,但你明白了要点 - 它在 Playground 中有效。 update
和 updateAll
都适合我。
我在下面粘贴了工作代码 - 只是从您的命名空间等中给了它一个事务/TP 装饰器。
更新:
(我原来的 post 我会离开这里 - 因为它有效) - 我还更新了你的第二个新代码块的工作版本 - 但有更正,例如。你没有正确引用对象(比如 ar
而不是 aR
所以它永远不会更新注册表等)并且 - 你需要遵循 JS 承诺链,使用你的方式完成了 - 所以我在下面的 'ANSWER 2' 中为您添加了该代码。)。另外,可能最好声明 new_arr
具有全局函数范围,我已经在我的代码中做到了。
/**
* New script file
*/
/**
* A transaction processor function description
* @param { org.acme.otc.SOD } sod A human description of the parameter
* @transaction
*/
function SOD(sod) { // eslint-disable-line no-unused-vars
var aR = null;
return getAssetRegistry('org.acme.otc.LiveContract')
.then(function (contractRegistry){
// return contractRegistry.getAll();
aR = contractRegistry;
return aR.getAll();
})
.then(function (l) {
allContracts=[];
allContracts=l;
console.log('allContracts List is: ' + allContracts );
var q = new Date();
var m = q.getMonth();
var d = q.getDay();
var y = q.getFullYear();
var datevar = new Date(y,m,d);
arr=[];
allContracts.forEach(function(contract) {
console.log('Contract Date: ' + contract.contract.expiry);
if (contract.contract.expiry < datevar ) {
console.log('Checks Out - this contract needs fixing');
console.log('Destroying: ' + contract);
arr.push(contract);
//console.log('Return: ',x);
}
})
return arr
})
.then( function(arr) {
var factory = getFactory();
new_arr=[];
fLen = arr.length;
for (i = 0; i < fLen; i++) {
var old_contract=arr[i];
console.log('ISIN: ' + old_contract.ISINcode);
var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
console.log('Entry: ' + old_contract);
new_contract.contract=old_contract.contract;
new_contract.valid=false;
new_arr.push(new_contract);
} // x=invalidate(new_arr);
});
console.log("getting to update the records");
return aR.updateAll(new_arr);
//.then(function () {
// return getAssetRegistry('org.acme.otc.LiveContract')
//.then(function (contractRegistry){
// return contractRegistry.updateAll(new_arr);
// });
//});
}
答案 2:使用您的第二个代码块更新了代码
/**
* Start of Day Update
* @param {org.acme.otc.SOD} sod - the sod transaction
* @transaction
*/
function SOD(sod) { // eslint-disable-line no-unused-vars
//arr=pare();
var aR=null;
new_arr=[];
return getAssetRegistry('org.acme.otc.LiveContract')
.then(function (contractRegistry){
aR=contractRegistry;
return aR.getAll();
})
.then(function (l){
allContracts=[];
allContracts=l;
console.log('Curr List: ',allContracts);
var q = new Date();
var m = q.getMonth();
var d = q.getDay();
var y = q.getFullYear();
var date = new Date(y,m,d);
console.log('Current Date: ',date);
arr=[];
allContracts.forEach(function(contract) {
//console.log('Contract Date: ',contract.contract.expiry);
if (contract.contract.expiry < date) {
//console.log('Checks Out');
//console.log('Destroying: ',contract);
arr.push(contract);
//console.log('Return: ',x);
}
})
return arr
}).then( function(arr){
var factory = getFactory();
//new_arr=[];
fLen = arr.length;
for (i = 0; i < fLen; i++) {
var old_contract=arr[i];
console.log('ISIN: ',old_contract.ISINcode);
var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
console.log('Entry: ',old_contract);
new_contract.contract=old_contract.contract;
new_contract.valid=false;
new_arr.push(new_contract);
}
console.log("New Array is now " + new_arr);
})
.then(function () {
console.log("getting to update the records");
return aR.updateAll(new_arr);
});
}
我正在 Composer 上构建一个应用程序,它与 Playground 上的示例 Bond 网络非常相似。我的部分申请要求在到期日删除过时的合同。因此,代码必须获取所有合同,找到日期小于当前日期的合同,并将它们的 valid
字段更改为 false
。下面是我 运行:
function SOD(sod) { // eslint-disable-line no-unused-vars
return getAssetRegistry('org.acme.otc.LiveContract')
.then(function (contractRegistry){
return contractRegistry.getAll();
})
.then(function (l){
allContracts=l;
//console.log('Curr List: ',allContracts);
var q = new Date();
var m = q.getMonth();
var d = q.getDay();
var y = q.getFullYear();
var date = new Date(y,m,d);
var arr=[];
allContracts.forEach(function(contract) {
//console.log('Contract Date: ',contract.contract.expiry);
if (contract.contract.expiry<date) {
//console.log('Checks Out');
//console.log('Destroying: ',contract);
arr.push(contract);
//console.log('Return: ',x);
}
})
return arr
}).then( function(arr){
var factory = getFactory();
new_arr=[];
fLen = arr.length;
for (i = 0; i < fLen; i++) {
var old_contract=arr[i];
console.log('ISIN: ',old_contract.ISINcode);
var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
console.log('Entry: ',old_contract);
new_contract.contract=old_contract.contract;
new_contract.valid=false;
new_arr.push(new_contract);
} x=invalidate(new_arr);
});
现在,生成 new_arr
的代码运行良好。我可以在 Playground 中检查并得到以下日志 new_arr
:
New Array
但是,当我在 new_arr
上调用 invalidate on 或在 SOD
中复制该代码时,不会发生对注册表的预期影响。我在 valid
字段下没有得到 false
。当我尝试在调试器中读入 x 时,我得到了 limp-wristed Promise 响应:
Ugh
这是我的 .cto 和 .acl 文件:
//otc.cto
namespace org.acme.otc
participant Trader identified by traderId {
o String traderId
o String name
o Boolean marginThresh // margin meeting maintenance minimum
}
participant Administrator identified by adminId {
o String adminId
o Boolean tradingOpen
}
enum Product {
o OPTION
o FUTURE
o FORWARD
}
concept Order {
o String traderID
o Product productType
o String asset // commodity? underlying? - may later need typing
o Boolean buy
o Double notionalAmount
o DateTime expiry // only needs to specify date
}
concept Contract {
o String buyerID // buyer/seller vs maker/taker?
o String sellerID
o Product productType
o String asset // commodity? underlying? - may later need typing
o Double notionalAmount
o Double value
o DateTime expiry
}
asset OpenOrder identified by ISINcode {
o String ISINcode
o Order order
o Boolean valid
}
asset LiveContract identified by ISINcode {
o String ISINcode
o Contract contract
o Boolean valid
}
transaction PlaceOrder {
o String ISINCode
o Order order
}
transaction SOD {
o String adminId
}
transaction Test {}
//permissions.acl
rule Issuer {
description: "Allow full access to the issuer of a bond"
participant(i): "org.acme.otc.Trader"
operation: ALL
resource(a): "org.acme.otc.OpenOrder"
condition: (a.bond.issuer.memberId === i.memberId)
action: ALLOW
}
rule Default {
description: "Allow read access"
participant: "org.acme.otc.*"
operation: ALL
resource: "org.acme.otc.*"
action: ALLOW
}
rule SystemACL {
description: "System ACL to permit all access"
participant: "org.hyperledger.composer.system.Participant"
operation: ALL
resource: "org.hyperledger.composer.system.**"
action: ALLOW
}
rule NetworkAdminUser {
description: "Grant business network administrators full access to user resources"
participant: "org.hyperledger.composer.system.NetworkAdmin"
operation: ALL
resource: "**"
action: ALLOW
}
rule NetworkAdminSystem {
description: "Grant business network administrators full access to system resources"
participant: "org.hyperledger.composer.system.NetworkAdmin"
operation: ALL
resource: "org.hyperledger.composer.system.**"
action: ALLOW
}
我在 JavaScript 方面经验不足,所以错误可能很小。感谢您的帮助。
更新: 我正在处理 Paul 的回复。我的新代码如下
/**
* Start of Day Update
* @param {org.acme.otc.SOD} sod - the sod transaction
* @transaction
*/
function SOD(sod) { // eslint-disable-line no-unused-vars
//arr=pare();
var aR=null;
return getAssetRegistry('org.acme.otc.LiveContract')
.then(function (contractRegistry){
ar=contractRegistry;
return ar.getAll();
})
.then(function (l){
allContracts=[];
allContracts=l;
console.log('Curr List: ',allContracts);
var q = new Date();
var m = q.getMonth();
var d = q.getDay();
var y = q.getFullYear();
var date = new Date(y,m,d);
console.log('Current Date: ',date);
arr=[];
allContracts.forEach(function(contract) {
//console.log('Contract Date: ',contract.contract.expiry);
if (contract.contract.expiry<date) {
//console.log('Checks Out');
//console.log('Destroying: ',contract);
arr.push(contract);
//console.log('Return: ',x);
}
})
return arr
}).then( function(arr){
var factory = getFactory();
new_arr=[];
fLen = arr.length;
for (i = 0; i < fLen; i++) {
var old_contract=arr[i];
console.log('ISIN: ',old_contract.ISINcode);
var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
console.log('Entry: ',old_contract);
new_contract.contract=old_contract.contract;
new_contract.valid=false;
new_arr.push(new_contract);
}
console.log(new_arr);
});
console.log("getting to update the records");
return aR.updateAll(new_arr);
}
然而它不起作用。代码似乎永远不会达到最终的 console.log
。之前的日志没有问题,里面的新合约是正确的。现在有什么想法吗?
没有看到 updateAll
代码位,也不知道 invalidate(new_arr)
有什么功能 - 所以我会 post 类似的东西,但你明白了要点 - 它在 Playground 中有效。 update
和 updateAll
都适合我。
我在下面粘贴了工作代码 - 只是从您的命名空间等中给了它一个事务/TP 装饰器。
更新:
(我原来的 post 我会离开这里 - 因为它有效) - 我还更新了你的第二个新代码块的工作版本 - 但有更正,例如。你没有正确引用对象(比如 ar
而不是 aR
所以它永远不会更新注册表等)并且 - 你需要遵循 JS 承诺链,使用你的方式完成了 - 所以我在下面的 'ANSWER 2' 中为您添加了该代码。)。另外,可能最好声明 new_arr
具有全局函数范围,我已经在我的代码中做到了。
/**
* New script file
*/
/**
* A transaction processor function description
* @param { org.acme.otc.SOD } sod A human description of the parameter
* @transaction
*/
function SOD(sod) { // eslint-disable-line no-unused-vars
var aR = null;
return getAssetRegistry('org.acme.otc.LiveContract')
.then(function (contractRegistry){
// return contractRegistry.getAll();
aR = contractRegistry;
return aR.getAll();
})
.then(function (l) {
allContracts=[];
allContracts=l;
console.log('allContracts List is: ' + allContracts );
var q = new Date();
var m = q.getMonth();
var d = q.getDay();
var y = q.getFullYear();
var datevar = new Date(y,m,d);
arr=[];
allContracts.forEach(function(contract) {
console.log('Contract Date: ' + contract.contract.expiry);
if (contract.contract.expiry < datevar ) {
console.log('Checks Out - this contract needs fixing');
console.log('Destroying: ' + contract);
arr.push(contract);
//console.log('Return: ',x);
}
})
return arr
})
.then( function(arr) {
var factory = getFactory();
new_arr=[];
fLen = arr.length;
for (i = 0; i < fLen; i++) {
var old_contract=arr[i];
console.log('ISIN: ' + old_contract.ISINcode);
var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
console.log('Entry: ' + old_contract);
new_contract.contract=old_contract.contract;
new_contract.valid=false;
new_arr.push(new_contract);
} // x=invalidate(new_arr);
});
console.log("getting to update the records");
return aR.updateAll(new_arr);
//.then(function () {
// return getAssetRegistry('org.acme.otc.LiveContract')
//.then(function (contractRegistry){
// return contractRegistry.updateAll(new_arr);
// });
//});
}
答案 2:使用您的第二个代码块更新了代码
/**
* Start of Day Update
* @param {org.acme.otc.SOD} sod - the sod transaction
* @transaction
*/
function SOD(sod) { // eslint-disable-line no-unused-vars
//arr=pare();
var aR=null;
new_arr=[];
return getAssetRegistry('org.acme.otc.LiveContract')
.then(function (contractRegistry){
aR=contractRegistry;
return aR.getAll();
})
.then(function (l){
allContracts=[];
allContracts=l;
console.log('Curr List: ',allContracts);
var q = new Date();
var m = q.getMonth();
var d = q.getDay();
var y = q.getFullYear();
var date = new Date(y,m,d);
console.log('Current Date: ',date);
arr=[];
allContracts.forEach(function(contract) {
//console.log('Contract Date: ',contract.contract.expiry);
if (contract.contract.expiry < date) {
//console.log('Checks Out');
//console.log('Destroying: ',contract);
arr.push(contract);
//console.log('Return: ',x);
}
})
return arr
}).then( function(arr){
var factory = getFactory();
//new_arr=[];
fLen = arr.length;
for (i = 0; i < fLen; i++) {
var old_contract=arr[i];
console.log('ISIN: ',old_contract.ISINcode);
var new_contract = factory.newResource('org.acme.otc', 'LiveContract', old_contract.ISINcode);
console.log('Entry: ',old_contract);
new_contract.contract=old_contract.contract;
new_contract.valid=false;
new_arr.push(new_contract);
}
console.log("New Array is now " + new_arr);
})
.then(function () {
console.log("getting to update the records");
return aR.updateAll(new_arr);
});
}