在 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 更新的,还是我可以在合约中明确写入权限?

存根 API 提供了一些功能:

  • 通过放置/获取操作访问账本状态
  • 用于访问事务上下文的便利函数

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

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

最新更新