mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-17 15:35:09 +00:00
Standardized createAsset parameters, removed getAllAssets function, and changed transferAssetsBasedOnColor to match go-chaincode
Signed-off-by: r2roC <arturo@IBM.com>
This commit is contained in:
parent
9a9a3d2683
commit
c2b6fcfd3f
1 changed files with 16 additions and 34 deletions
|
|
@ -5,9 +5,9 @@
|
||||||
// ====CHAINCODE EXECUTION SAMPLES (CLI) ==================
|
// ====CHAINCODE EXECUTION SAMPLES (CLI) ==================
|
||||||
|
|
||||||
// ==== Invoke assets ====
|
// ==== Invoke assets ====
|
||||||
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["createAsset","asset1","blue","tom","35","100"]}'
|
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["createAsset","asset1","blue","35","tom","100"]}'
|
||||||
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["createAsset","asset2","red","tom","50","150"]}'
|
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["createAsset","asset2","red","50","tom","150"]}'
|
||||||
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["createAsset","asset3","blue","tom","70","200"]}'
|
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["createAsset","asset3","blue","70","tom","200"]}'
|
||||||
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["transferAsset","asset2","jerry"]}'
|
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["transferAsset","asset2","jerry"]}'
|
||||||
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["transferAssetsBasedOnColor","blue","jerry"]}'
|
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["transferAssetsBasedOnColor","blue","jerry"]}'
|
||||||
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["deleteAsset","asset1"]}'
|
// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["deleteAsset","asset1"]}'
|
||||||
|
|
@ -72,7 +72,7 @@ const { Contract } = require('fabric-contract-api');
|
||||||
class Chaincode extends Contract{
|
class Chaincode extends Contract{
|
||||||
|
|
||||||
// CreateAsset - create a new asset, store into chaincode state
|
// CreateAsset - create a new asset, store into chaincode state
|
||||||
async createAsset(ctx, assetID, color, owner, size, appraisedValue) {
|
async createAsset(ctx, assetID, color, size, owner, appraisedValue) {
|
||||||
const exists = await this.assetExists(ctx, assetID)
|
const exists = await this.assetExists(ctx, assetID)
|
||||||
if (exists) {
|
if (exists) {
|
||||||
throw new Error(`The asset ${assetID} already exists`)
|
throw new Error(`The asset ${assetID} already exists`)
|
||||||
|
|
@ -81,7 +81,7 @@ class Chaincode extends Contract{
|
||||||
// ==== Create asset object and marshal to JSON ====
|
// ==== Create asset object and marshal to JSON ====
|
||||||
let asset = {};
|
let asset = {};
|
||||||
asset.docType = 'asset';
|
asset.docType = 'asset';
|
||||||
asset.ID = assetID;
|
asset.assetID = assetID;
|
||||||
asset.color = color;
|
asset.color = color;
|
||||||
asset.size = size;
|
asset.size = size;
|
||||||
asset.owner = owner;
|
asset.owner = owner;
|
||||||
|
|
@ -90,7 +90,7 @@ class Chaincode extends Contract{
|
||||||
// === Save asset to state ===
|
// === Save asset to state ===
|
||||||
await ctx.stub.putState(assetID, Buffer.from(JSON.stringify(asset)));
|
await ctx.stub.putState(assetID, Buffer.from(JSON.stringify(asset)));
|
||||||
let indexName = 'color~name'
|
let indexName = 'color~name'
|
||||||
let colorNameIndexKey = await ctx.stub.createCompositeKey(indexName, [asset.color, asset.ID]);
|
let colorNameIndexKey = await ctx.stub.createCompositeKey(indexName, [asset.color, asset.assetID]);
|
||||||
|
|
||||||
// Save index entry to state. Only the key name is needed, no need to store a duplicate copy of the marble.
|
// Save index entry to state. Only the key name is needed, no need to store a duplicate copy of the marble.
|
||||||
// Note - passing a 'nil' value will effectively delete the key from state, therefore we pass null character as value
|
// Note - passing a 'nil' value will effectively delete the key from state, therefore we pass null character as value
|
||||||
|
|
@ -137,7 +137,7 @@ class Chaincode extends Contract{
|
||||||
|
|
||||||
// delete the index
|
// delete the index
|
||||||
let indexName = 'color~name';
|
let indexName = 'color~name';
|
||||||
let colorNameIndexKey = ctx.stub.createCompositeKey(indexName, [assetJSON.color, assetJSON.ID]);
|
let colorNameIndexKey = ctx.stub.createCompositeKey(indexName, [assetJSON.color, assetJSON.assetID]);
|
||||||
if (!colorNameIndexKey) {
|
if (!colorNameIndexKey) {
|
||||||
throw new Error(' Failed to create the createCompositeKey');
|
throw new Error(' Failed to create the createCompositeKey');
|
||||||
}
|
}
|
||||||
|
|
@ -189,7 +189,7 @@ class Chaincode extends Contract{
|
||||||
// committing peers if the result set has changed between endorsement time and commit time.
|
// committing peers if the result set has changed between endorsement time and commit time.
|
||||||
// Therefore, range queries are a safe option for performing update transactions based on query results.
|
// Therefore, range queries are a safe option for performing update transactions based on query results.
|
||||||
// Example: GetStateByPartialCompositeKey/RangeQuery
|
// Example: GetStateByPartialCompositeKey/RangeQuery
|
||||||
async transferAssetsBasedOnColor(ctx, color, newOwner) {
|
async transferAssetByColor(ctx, color, newOwner) {
|
||||||
// Query the color~name index by color
|
// Query the color~name index by color
|
||||||
// This will execute a key range query on all keys starting with 'color'
|
// This will execute a key range query on all keys starting with 'color'
|
||||||
let coloredAssetResultsIterator = await ctx.stub.getStateByPartialCompositeKey('color~name', [color]);
|
let coloredAssetResultsIterator = await ctx.stub.getStateByPartialCompositeKey('color~name', [color]);
|
||||||
|
|
@ -309,24 +309,6 @@ class Chaincode extends Contract{
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// getAllAssets returns all assets found in the world state.
|
|
||||||
async getAllAssets(ctx) {
|
|
||||||
const allResults = [];
|
|
||||||
// range query with empty string for startKey and endKey does an open-ended query of all assets in the chaincode namespace.
|
|
||||||
for await (const { key, value } of ctx.stub.getStateByRange("", "")) {
|
|
||||||
const strValue = Buffer.from(value).toString('utf8');
|
|
||||||
let record;
|
|
||||||
try {
|
|
||||||
record = JSON.parse(strValue);
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err);
|
|
||||||
record = strValue;
|
|
||||||
}
|
|
||||||
allResults.push({ Key: key, Record: record });
|
|
||||||
}
|
|
||||||
return JSON.stringify(allResults);
|
|
||||||
}
|
|
||||||
|
|
||||||
async getAllResults(iterator, isHistory) {
|
async getAllResults(iterator, isHistory) {
|
||||||
let allResults = [];
|
let allResults = [];
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
@ -366,42 +348,42 @@ class Chaincode extends Contract{
|
||||||
async initLedger(ctx) {
|
async initLedger(ctx) {
|
||||||
const assets = [
|
const assets = [
|
||||||
{
|
{
|
||||||
ID: 'asset1',
|
assetID: 'asset1',
|
||||||
color: 'blue',
|
color: 'blue',
|
||||||
size: 5,
|
size: 5,
|
||||||
owner: 'Tom',
|
owner: 'Tom',
|
||||||
appraisedValue: 100
|
appraisedValue: 100
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ID: 'asset2',
|
assetID: 'asset2',
|
||||||
color: 'red',
|
color: 'red',
|
||||||
size: 5,
|
size: 5,
|
||||||
owner: 'Brad',
|
owner: 'Brad',
|
||||||
appraisedValue: 100
|
appraisedValue: 100
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ID: 'asset3',
|
assetID: 'asset3',
|
||||||
color: 'green',
|
color: 'green',
|
||||||
size: 10,
|
size: 10,
|
||||||
owner: 'Jin Soo',
|
owner: 'Jin Soo',
|
||||||
appraisedValue: 200
|
appraisedValue: 200
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ID: 'asset4',
|
assetID: 'asset4',
|
||||||
color: 'yellow',
|
color: 'yellow',
|
||||||
size: 10,
|
size: 10,
|
||||||
owner: 'Max',
|
owner: 'Max',
|
||||||
appraisedValue: 200
|
appraisedValue: 200
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ID: 'asset5',
|
assetID: 'asset5',
|
||||||
color: 'black',
|
color: 'black',
|
||||||
size: 15,
|
size: 15,
|
||||||
owner: 'Adriana',
|
owner: 'Adriana',
|
||||||
appraisedValue: 250
|
appraisedValue: 250
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ID: 'asset6',
|
assetID: 'asset6',
|
||||||
color: 'white',
|
color: 'white',
|
||||||
size: 15,
|
size: 15,
|
||||||
owner: 'Michel',
|
owner: 'Michel',
|
||||||
|
|
@ -412,10 +394,10 @@ class Chaincode extends Contract{
|
||||||
for (let i = 0; i < assets.length; i++) {
|
for (let i = 0; i < assets.length; i++) {
|
||||||
await this.createAsset(
|
await this.createAsset(
|
||||||
ctx,
|
ctx,
|
||||||
assets[i].ID,
|
assets[i].assetID,
|
||||||
assets[i].color,
|
assets[i].color,
|
||||||
assets[i].owner,
|
|
||||||
assets[i].size,
|
assets[i].size,
|
||||||
|
assets[i].owner,
|
||||||
assets[i].appraisedValue
|
assets[i].appraisedValue
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue