javascript - 在 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 提供了一些东西:
- 通过 put/get 操作访问账本状态
- 访问事务上下文的便利函数
您可以在智能合约中自由实现您想要的任何逻辑,但如果您想从/向分类帐读取和/或写入数据,则需要使用存根 API。
一个典型的函数将从账本中读取一些状态(通常基于函数的输入),运行一些逻辑(更改值,检查值),然后将新的和/或更新的状态写入账本。
推荐阅读
- php - 如何从 PHP 包含的文件中通过 AJAX 传递数据
- rust - 当我们让 trait 继承 'static 是什么意思?
- c# - 有没有办法改变邮件消息的样式?
- linux - 如何为 2 个不同的 gitlab 帐户设置 ssh 配置?
- next.js - 我正在运行下一个 js 项目。我在运行项目时遇到了一点错误
- c# - 是否可以在 ListView 项目样式上添加背景颜色淡入淡出(动画)?
- excel - Excel:表单控制按钮,每月计数
- c - 如何在 execv() 中使用少量命令
- php - 使用 livewire 仅选中一个复选框并取消选中其他复选框
- dataframe - : 和 ! 之间的区别 在朱莉娅数据框中