交换交易是一种需要多重签名的交易。它试图解决这个常见场景:Alice希望购买Bob拥有的资产。他们就价格达成一致,然后完成了交易。这个场景常用于电子商务业务中,通过交换 tx,我们使其在区块链可用。以下是它可支持的一些场景:

  • 淘宝模式:卖家以固定价格销售商品。在我们的交换 tx,卖家可预填充交换 tx,任何想购买商品的人只需多重签名交换 tx 即可。
  • ebay 模式:卖方拥有一个可接受投标的资产。任何潜在买家均可在其投标内预填充交换 tx,卖家可选择一个投标并进行多重签名以完成交易。

与转移交易不同,交换交易是一个有两阶段的提交交易。在第一阶段,发送者创建 tx 并签署。然后,发送者需通过某种方式将 tx 交付给接收者(例如,通过电子邮件或网站)——这是一个链下操作;在第二阶段,接收者会多重签名 tx 并将其交付给链。仅多重签名的交换 tx 可被接受并处理。

协议定义

转移代币/资产,定义了TransferTx

message ExchangeInfo {
  BigUint value = 1;
  repeated string assets = 2;
}



// we could support these cases (and vise versa):
// 1. sender fungible token \<-> receiver one or more assets
// 2. sender fungible token + asset \<-> receiver one or more assets
// 3. sender one or more assets \<-> receiver one or more assets

message ExchangeTx {
  string to = 1;
  ExchangeInfo sender = 2;
  ExchangeInfo receiver = 3;
  google.protobuf.Timestamp expired_at = 4;

  // forge won't touch this field. Only forge app shall handle it.
  google.protobuf.Any data = 15;
}
  • to是接收者的地址。to可以为空,如果其为空,我们会使用第一个多重签名的地址作为接收者的地址。
  • sender交换信息是发送者愿意支付的价格(代币和/或资产)。
  • receiver交换信息是接收者愿意支付的价格(代币和/或资产)。

在 ExchangeInfo 中:

  • value是一个人愿意支付的代币数。最少为一个单位(默认情况下,1 个代币 = 10^^16 单位,您可以在 forge 配置中进行调整)。如果您不想转移任何代币,可以留空不填。
  • assets是一个人要支付的资产地址列表。如果您不想转移资产,可以留空不填。请注意,valueassets不得均为空。

以下为发送交换 tx 的示例:

# say there are two wallets: alice and bob, and alice owns an asset mona_lisa, bob's willing to pay 10000 tokens to buy it.

sender = ForgeAbi.ExchangeInfo.new(value: ForgeSdk.token_to_unit(10000))

receiver = ForgeAbi.ExchangeInfo.new(assets: [mona_lisa])

itx = ForgeAbi.ExchangeTx.new(to: alice.address, sender: sender, receiver: receiver)

# bob generate the tx

tx = ForgeSdk.prepare_exchange(itx, wallet: bob)

# bob gave the tx to alice to multi-sign

tx = ForgeSdk.finalize_exchange(tx, alice)

ForgeSdk.send_tx(tx: tx)