获取资产用于从AssetFactory中购买/取得资产。

注意AssetFactoryAcquireAssetTx目前为BETA版,其界面可能发生改变(大规模)。

协议定义

如需获取资产,您应使用AcquireAssetTx消息:

message AssetSpec {

string address = 1;

string data = 2;

}



message AcquireAssetTx {

string to = 1;

repeated AssetSpec specs = 2;



google.protobuf.Any data = 15;

}

我们把向资产工厂模板提供的参数称为asset spec。资产规格包括地址和数据:

  • address:address是生成资产的地址。发送方应将spec应用于模板,以生成资产结构,然后生成 CreateAssetTx,然后计算地址。SDK 可以为这个流程提供帮助。通过在这里引入地址,我们确保一个规格只能应用于资产工厂一次。例如,如果已经生成了第 10 排第 2 个座位的票,则您不能再次获得它。
  • data:data是 json 字符串,包含资产工厂模板的参数。

在很多情况下,买家可能在一次交易中购买多个资产。例如,您一次会购买两张电影票——如果不能满足这一要求,您很可能不会购买或者会选择别的场次。因此,在AcquireAssetTx,我们允许重复的asset spec,使多个资产的获取全部满足或全部失败。

以下是获取资产的示例:

# code to create asset factory

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)





# code to acquire asset

specs =

Enum.map(["0", "2"], fn seat ->

apply(ForgeAbi.AssetSpec, :new, [%{data: ~s({"row": "15", "seat": "#{seat}"})}])

end)



itx = ForgeAbi.AcquireAssetTx.new(to: address, specs: specs)



ForgeSdk.acquire_asset(itx, wallet: w1)