首页 > 解决方案 > 在 Fabric 上编写链码时,我是否仅限于链码存根定义的函数?

问题描述

例如,当我使用 VScode Hyperledger 插件启动一个 js 项目时,我会得到一个这样的智能合约:

onst { Contract } = require('fabric-contract-api');

class MyAssetContract extends Contract {

    //****I added stuff */
    async nameSomething(ctx, myAssetId, nameToGive){
        const buffer = await ctx.stub.getState(myAssetId);
        if (!exists) {
            throw new Error(`The my asset ${myAssetId} does not exist`);
        }
        //NAME SOMETHING HERE?
    }

    async myAssetExists(ctx, myAssetId) {
        const buffer = await ctx.stub.getState(myAssetId);
        return (!!buffer && buffer.length > 0);
    }

    async createMyAsset(ctx, myAssetId, value) {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (exists) {
            throw new Error(`The my asset ${myAssetId} already exists`);
        }
        const asset = { value };
        const buffer = Buffer.from(JSON.stringify(asset));
        await ctx.stub.putState(myAssetId, buffer);
    }

    async readMyAsset(ctx, myAssetId) {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (!exists) {
            throw new Error(`The my asset ${myAssetId} does not exist`);
        }
        const buffer = await ctx.stub.getState(myAssetId);
        const asset = JSON.parse(buffer.toString());
        return asset;
    }

    async updateMyAsset(ctx, myAssetId, newValue) {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (!exists) {
            throw new Error(`The my asset ${myAssetId} does not exist`);
        }
        const asset = { value: newValue };
        const buffer = Buffer.from(JSON.stringify(asset));
        await ctx.stub.putState(myAssetId, buffer);
    }

    async deleteMyAsset(ctx, myAssetId) {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (!exists) {
            throw new Error(`The my asset ${myAssetId} does not exist`);
        }
        await ctx.stub.deleteState(myAssetId);
    }

}

module.exports = MyAssetContract;

如您所见,我尝试通过命名来添加自己的功能。我来自以太坊,所以我习惯于定义变量并像传统程序一样命名它们。但是,我觉得我需要遵守存根定义的内容。是这样吗?如果是这种情况,Fabric 的 API 是否更新了账本,或者我可以在合约中明确写入权限?

标签: javascripthyperledger-fabricblockchainhyperledger-chaincode

解决方案


存根 API 提供了一些东西:

  • 通过 put/get 操作访问账本状态
  • 访问事务上下文的便利函数

您可以在智能合约中自由实现您想要的任何逻辑,但如果您想从/向分类帐读取和/或写入数据,则需要使用存根 API。

一个典型的函数将从账本中读取一些状态(通常基于函数的输入),运行一些逻辑(更改值,检查值),然后将新的和/或更新的状态写入账本。


推荐阅读