У меня проблема с написанием смарт-контракта.
Вот мой код.
'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, мне это кажется правильным. Я могу неправильно понять, я не знаю. Спасибо.