创建资产工厂用于解决一般问题,以下为初始提议:

从活动链(以及未来证书应用程序或如电影票、讲座门票在内的用例)我们找到了普遍要求,即当发行者创建资产时,他们通常想创建能根据模板进一步创建实际资产的工厂,这样,当某个人想购买该资产时,它只会生成实际资产并将其转移至买家。

所以,我们可以有 createassetfactory 协议,工厂将根据给出的地址生成资产状态。

当用户将代币转移至本地址时,它将根据资产工厂生成资产并将用户地址设置为所有者,然后,它会将代币从用户账户移到资产工厂的发行者账户。

资产工厂就像自助售货机一样,您支付所需的代币,资产将被生成并提供给您。

请注意,创建资产工厂 tx 目前为BETA版,其界面可能发生改变(大规模)。

协议定义

如需创建资产工厂,您需要使用CreateAssetTx消息和AssetFactory作为其数据(是的,我们重复使用 CreateAssetTx 而不重新创造 wheels):

message AssetAttributes {

bool transferrable = 1;

uint32 ttl = 2;

}



message AssetFactory {

string description = 1;

uint32 limit = 2;

BigUint price = 3;

string template = 4;

repeated string allowed_spec_args = 5;

string asset_name = 6;



AssetAttributes attributes = 7;

}



message CreateAssetTx {

string moniker = 1;

google.protobuf.Any data = 2;

bool readonly = 3;

bool transferrable = 4;

uint32 ttl = 5;

string parent = 6;

string address = 7;

}

如果您回顾CreateAssettx的协议定义,您会发现,AssetFactory中字段的设计使其可在内部生成CreateAssetTx。那是模板 allowedspecargs, asset_name 的目的和属性:

  • template:资产工厂将用于生成资产的模板,模板是字符串,可由带特定 args 的 EEx 处理,其输出为 json。然后,json 会被解析并根据 asset_name 转换。例如,如果您的资产名称为Ticket,则生成的 json 数据则会被转换为ForgeAbi.Ticket.new(json)
  • allowedspecargs:模板允许的参数。在转移 tx,用户可通过包含所需参数的 json 字符串向这个 AssetFactory 地址转移代币,解析 json 后,会对照此表格进行检查,如果任何字段不在列表中,则转移 tx 会失败。
  • asset_name:资产的 protobuf 消息名。请注意,此消息应被注册在 forge。
  • attributes:资产属性将被复制到已生成资产。请注意,从资产工厂生成的资产为只读。

拿电影票举例。加入您希望生成包含以下信息的电影票:

  • time:电影播放的日期和时间。
  • name:电影名称。
  • room:电影票可使用的放映室。
  • row:电影票所属的座位排。
  • seat:电影票所述的座位号。

您可以创建一个上述所有信息均为变量的工厂,或固定名称、时间和放映室作为每个工厂的常数。假如您想为每个放映室的一部电影创建一个工厂,如下:

template = {
  row: "{{ row }}",

  seat: "{{ seat }}",

  room: "5C",

  time: "11:00am 04/30/2019",

  name: "Avengers: Endgame"
};

然后您可以像这样创建一个工厂(放映室 5C 有 200 个座位):

factory = {
  description: "Movie ticket factory",

  limit: 200,

  price: 10,

  template: template,

  allowed_spec_args: ["row", "seat"],

  asset_name: "Ticket",

  attributes: {
    transferrable: true,

    // ticket is valid in 3 hours after consumption

    ttl: 3600 * 3
  }
};

asset_name Ticket代表此消息:

message Ticket {

string row = 1;

string seat = 2;

string room = 3;

string time = 4;

string name = 5;

}

当用户试图获取资产时,通过向工厂中的模板应用用户提供的参数,新的票券实例会被创建。然后,一个CreateAssetTx在内部生成(收据 db 中没有足迹,只为验证和创建实际资产状态生成)。

现在,我们来看看资产工厂的整个流程的示例代码:

w = ForgeSdk.create_wallet()

ForgeSdk.declare(ForgeAbi.DeclareTx.new(moniker: "theater"), wallet: w)

w1 = ForgeSdk.create_wallet()

ForgeSdk.declare(ForgeAbi.DeclareTx.new(moniker: "tyr"), wallet: w)



# Note application shall already registered `Ticket` into Forge via `deploy_protocol`.

factory = %{

description: "movie ticket factory",

limit: 5,

price: ForgeAbi.token_to_unit(1),

template: ~s({

"row": "{{ row }}",

"seat": "{{ seat }}",

"time": "11:00am 04/30/2019",

"room": "4"

}),

allowed_spec_args: ["row", "seat"],

asset_name: "Ticket",

attributes: %ForgeAbi.AssetAttributes{

transferrable: true,

ttl: 3600 * 3

}

}



ForgeSdk.create_asset_factory("Avenerages: Endgame", factory, wallet: w)

如需从资产工厂获取资产,请查看获取资产.

[1] 链接可能不可访问,因为我们尚未开放 forge。