Создание нового участника и добавление массива ресурсов по ссылке на него - PullRequest
0 голосов
/ 12 июня 2018

У меня проблема при попытке добавить новый актив в массив активов , которые являются частью участника как ссылка .

Здесь у меня естьУчастник SharedAccount контролируется его участниками, которые подключены через свою долю в учетной записи.Я хочу написать транзакцию для создания новой учетной записи SharedAccount одним человеком.Когда человек отправляет транзакцию, он должен создать ресурс общего ресурса, если этот человек, и добавить его в массив акций SharedAccount.

Вот как мой код выглядит как

.cto:

...
participant SharedAccount identified by sharedAccountId {
  o String sharedAccountId
  --> Share[] shares
  o Double balance
  o Double originalBalance
}

asset Share identified by shareId {
  o String shareId
  --> Person shareHolder
  o Double amount
}

transaction CreateSharedAccount {
  --> Person creator
  o String accountName
  o Integer amount
}
...

.js:

...
/**
 * @param {org.mistral.bulliongrower.CreateSharedAccount} createSharedAccount
 * @transaction
 */
async function CreateSharedAccount(createSharedAccount) {

  const factory = getFactory();
  const NS = 'org.mistral.bulliongrower';

  // create share

  const share = factory.newResource(NS, 'Share', createSharedAccount.creator.personId + 'SHARE');
  share.amount = createSharedAccount.amount;
  share.shareHolder = createSharedAccount.creator;
  share.shareHolder.balance -= createSharedAccount.amount;

  const sharesRegistry = await getAssetRegistry(NS + '.Share');
  await sharesRegistry.add(share);

  const personRegistry = await getParticipantRegistry(NS + '.Person');
  await personRegistry.update(share.shareHolder);

  // create sharedAccount

  const sharedAcc = factory.newResource(NS, 'SharedAccount', createSharedAccount.accountName);
  sharedAcc.shares.push(share);
  sharedAcc.balance = createSharedAccount.amount;
  sharedAcc.originalBalance = createSharedAccount.amount;

  const sharedAccRegistry = await getAssetRegistry(NS + '.SharedAccount');
  await sharedAccRegistry.add(sharedAcc);

}
...

Я не уверен, должен ли я использовать factory.newRelationship и как при добавлении общего ресурса в SharedAccount.При попытке выполнить транзакцию я получаю ошибку на детской площадке:

TypeError: Невозможно прочитать свойство 'push' из неопределенного

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

попробуйте сделать это:

/**
* @param {org.mistral.bulliongrower.CreateSharedAccount} createSharedAccount
* @transaction
*/
async function CreateSharedAccount(createSharedAccount) {

const factory = getFactory();
const NS = 'org.mistral.bulliongrower';

// create share

const share = factory.newResource(NS, 'Share', createSharedAccount.creator.personId + 'SHARE');
//const share = factory.newRelationship(NS, 'Share', createSharedAccount.creator.personId + 'SHARE');
share.amount = createSharedAccount.amount;
//share.shareHolder = factory.newRelationship(NS, 'Share', createSharedAccount.creator.personId);
share.shareHolder = createSharedAccount.creator;
share.shareHolder.balance -= createSharedAccount.amount;


const sharesRegistry = await getAssetRegistry(NS + '.Share');
await sharesRegistry.add(share);

const personRegistry = await getParticipantRegistry(NS + '.Person');
await personRegistry.update(share.shareHolder);

// create sharedacc

const sharedAcc = factory.newResource(NS, 'SharedAccount', createSharedAccount.accountName);
//sharedAcc.shares = factory.newRelationship(NS, 'Share', createSharedAccount.creator.personId);
//sharedAcc.shares[0] = factory.newRelationship(NS, 'Share', share.shareId);

// define an array  
let  sharesArray = [];
sharesArray.push(share);

sharedAcc.shares = sharesArray;
sharedAcc.balance = createSharedAccount.amount;
sharedAcc.originalBalance = createSharedAccount.amount;

// use getParticipantRegistry not getAssetRegistry
const sharedAccRegistry = await getParticipantRegistry(NS + '.SharedAccount');
await sharedAccRegistry.add(sharedAcc);

}
0 голосов
/ 12 июня 2018

ваш код транзакции должен быть примерно таким, как показано ниже - некоторые из ваших ссылок были неправильными (слишком много времени, чтобы указать на все изменения, поэтому вы можете ссылаться ниже).

Я добавил тестовую строку (для «Персона») просто для того, чтобы показать, что вы будете делать (чтобы иметь причину обновить этот конкретный реестр участников).

Мне кажется, что SharedAccount является активом, а не участником.И вы будете использовать соответствующий API JS для обновления реестра такого типа.

balance не является полем для Person (оно для SharedAccount), но ваш код пытается обратиться к нему.

Я оставил комментарии для «альтернативных способов» для объявлений и тому подобного - просто в порядке информации.

/**
 * @param {org.mistral.bulliongrower.CreateSharedAccount} createSharedAccount
 * @transaction
 */
async function CreateSharedAccount(createSharedAccount) {

  const factory = getFactory();
  const NS = 'org.example.trading';

  // create share

  const share = factory.newResource(NS, 'Share', createSharedAccount.creator.personId + 'SHARE');
  share.amount = createSharedAccount.amount;
  console.log("amount is " + share.amount);
  share.shareHolder = createSharedAccount.creator;
 // share.shareHolder.balance -= createSharedAccount.amount;  // won't work - balance is a field on SharedAccount not Person - moved it below


  const sharesRegistry = await getAssetRegistry(NS + '.Share');
  await sharesRegistry.add(share);

  share.shareHolder.newstr = "123"; // setting 'SOME' field (I added 'newstr' in my model, see below - so as to have a reason to update / give an example
  const personRegistry = await getParticipantRegistry(NS + '.Person');
  await personRegistry.update(share.shareHolder);

  // create sharedAccount

  const sharedAcc = factory.newResource(NS, 'SharedAccount', createSharedAccount.accountName);

  //let idsArray = new Array(); // alternative, or use implicit below.
  let idsArray = [] ;
  let shareAssetRelationship = factory.newRelationship(NS, 'Share', share.getIdentifier());
  idsArray.push(shareAssetRelationship); // only one element anyway

  sharedAcc.shares = idsArray;
  sharedAcc.balance = createSharedAccount.amount; // this is a new resource - so balance is eq to trxn amount ?
  sharedAcc.originalBalance = createSharedAccount.amount; // original balance is nothing or 'balance' ?....anyway....

  const sharedAccRegistry = await getAssetRegistry(NS + '.SharedAccount');
  await sharedAccRegistry.add(sharedAcc);

}

Я использовал следующую модель:

participant Person identified by personId {
  o String personId
  o String newstr
}

asset SharedAccount identified by sharedAccountId {
  o String sharedAccountId
  --> Share[] shares
  o Double balance
  o Double originalBalance
}

asset Share identified by shareId {
  o String shareId
  --> Person shareHolder
  o Double amount
}

transaction CreateSharedAccount {
  --> Person creator
  o String accountName
  o Integer amount
}
...