Проблема с Hyperledger Fabcar Chaincode

У меня проблема с написанием смарт-контракта.

Вот мой код.

'use strict';

const { Contract } = require('fabric-contract-api');
//const {} = require("fabric-shim")

class FabCar extends Contract {

    async initLedger(ctx) {
        console.info('============= START : Initialize Ledger ===========');
        const cars = [
            {
                color: 'blue',
                make: 'Toyota',
                model: 'Prius',
                owner: 'Tomoko',
            },
            {
                color: 'red',
                make: 'Ford',
                model: 'Mustang',
                owner: 'Brad',
            },
            {
                color: 'green',
                make: 'Hyundai',
                model: 'Tucson',
                owner: 'Jin Soo',
            },
            {
                color: 'yellow',
                make: 'Volkswagen',
                model: 'Passat',
                owner: 'Max',
            },
            {
                color: 'black',
                make: 'Tesla',
                model: 'S',
                owner: 'Adriana',
            },
            {
                color: 'purple',
                make: 'Peugeot',
                model: '205',
                owner: 'Michel',
            },
            {
                color: 'white',
                make: 'Chery',
                model: 'S22L',
                owner: 'Aarav',
            },
            {
                color: 'violet',
                make: 'Fiat',
                model: 'Punto',
                owner: 'Pari',
            },
            {
                color: 'indigo',
                make: 'Tata',
                model: 'Nano',
                owner: 'Valeria',
            },
            {
                color: 'brown',
                make: 'Holden',
                model: 'Barina',
                owner: 'Shotaro',
            },
        ];

        for (let i = 0; i < cars.length; i++) {
            cars[i].docType = 'car';
            await ctx.stub.putState('CAR' + i, Buffer.from(JSON.stringify(cars[i])));
            console.info('Added <--> ', cars[i]);
        }
        console.info('============= END : Initialize Ledger ===========');
    }

    async queryCar(ctx, carNumber) {
        const carAsBytes = await ctx.stub.getState(carNumber); // get the car from chaincode state
        if (!carAsBytes || carAsBytes.length === 0) {
            throw new Error(`${carNumber} does not exist`);
        }
        console.log(carAsBytes.toString());
        return carAsBytes.toString();
    }

    async createCar(ctx, carNumber, make, model, color, owner) {
        console.info('============= START : Create Car ===========');

        const car = {
            color,
            docType: 'car',
            make,
            model,
            owner,
        };

        await ctx.stub.putState(carNumber, Buffer.from(JSON.stringify(car)));
        console.info('============= END : Create Car ===========');
    }

    async queryAllCars(ctx) {
        const startKey = 'CAR0';
        const endKey = 'CAR999';

        const iterator = await ctx.stub.getStateByRange(startKey, endKey);

        const allResults = [];
        while (true) {
            const res = await iterator.next();

            if (res.value && res.value.value.toString()) {
                console.log(res.value.value.toString('utf8'));

                const Key = res.value.key;
                let Record;
                try {
                    Record = JSON.parse(res.value.value.toString('utf8'));
                } catch (err) {
                    console.log(err);
                    Record = res.value.value.toString('utf8');
                }
                allResults.push({ Key, Record });
            }
            if (res.done) {
                console.log('end of data');
                await iterator.close();
                console.info(allResults);
                return JSON.stringify(allResults);
            }
        }
    }

    async changeCarOwner(ctx, carNumber, newOwner) {
        console.info('============= START : changeCarOwner ===========');

        const carAsBytes = await ctx.stub.getState(carNumber); // get the car from chaincode state
        if (!carAsBytes || carAsBytes.length === 0) {
            throw new Error(`${carNumber} does not exist`);
        }
        const car = JSON.parse(carAsBytes.toString());
        car.owner = newOwner;

        await ctx.stub.putState(carNumber, Buffer.from(JSON.stringify(car)));
        console.info('============= END : changeCarOwner ===========');
    }

    async createdTime(ctx, ii){
        var resultTime = await ctx.stub[ii].getTxTimestamp(); 
        console.log("ctx = ", ctx)
        console.log("ctx.stub = ", ctx.stub)
        console.log("ctx.stub",ii," = ", ctx.stub[ii])
        console.log("ctx.stub",ii,".getTxTimestamp() = ", ctx.stub[ii].getTxTimestamp())   
        return JSON.stringify(resultTime);
    }

    async currentID(ctx, ii){
        var resultID = await ctx.stub[ii].getTxID()
        return JSON.stringify(resultID);
    }   
    
    async listenEvent(ctx, name){
        var evntName = await ctx.stub[ii].setEvent(name)
        return JSON.stringify(evntName);
    }   

    async subCreator(ctx, ii){
        var creatorSub = await ctx.stub[ii].getCreator()
        return JSON.stringify(creatorSub);
    }   

    async signedProposalInf(ctx, ii){
        var sgnProposal = await ctx.stub[ii].getSignedProposal()
        return JSON.stringify(sgnProposal);
    }   

   

}

module.exports = FabCar;

Когда я развертываю этот смарт-контракт, который немного отличается от оригинального, я получил следующую ошибку:

предупреждение: [запрос]: оценка: идентификатор запроса "[объект объекта]" однорангового узла "peer0.org1.example.com:7051" не выполнен: сообщение = транзакция возвращена с ошибкой: ошибка: CARundefined не существует, стек = ошибка: транзакция возвращается с ошибкой: Ошибка: CARundefined не существует

Как я могу это решить? Я посмотрел на значения fabric-contract-api, stub и ctx, мне это кажется правильным. Я могу неправильно понять, я не знаю. Спасибо.


person mataramasukomiko    schedule 21.05.2020    source источник


Ответы (1)


Я также добавляю свой вызов

router.get('/cars/timestamp', async (req, res) => {

  try {
    const walletPath = path.join(process.cwd(),'..','..', 'wallet');
    const wallet = new FileSystemWallet(walletPath);
    const userExists = await wallet.exists('user1');
    if (!userExists) {
      res.json({status: false, error: {message: 'User not exist in the wallet'}});
      return;
    }

    const gateway = new Gateway();
    await gateway.connect(ccpPath, { wallet, identity: 'user1', discovery: { enabled: true, asLocalhost: true } });
    const network = await gateway.getNetwork('mychannel');
    const contract = network.getContract('fabcar');
    //console.log("contract = ", contract)
    const result = await contract.evaluateTransaction('createdTime', req.body.ii);
    console.log("result = ", result)
    res.json({status: true});
  } catch (err) { 
    res.json({status: false, error: err});
  }
});

person mataramasukomiko    schedule 21.05.2020