复杂美公链架构:chain33区块链 账户内部模型

直观描述

一个钱包里有很多个地址,一个地址我们就可以理解为一个账户. 一个对应很多资产:

  1. 可以是 bty
  2. 也可以是 某些 token
  3. 也可以是 平行链/跨链的资产
# bty
{
"wallets": [
{
"acc": {
"balance": "9977.6850",
"frozen": "0.0000",
"addr": "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
},
"label": "minerAddr"
}
]
}
# token 资产
{
"token": "TC",
"balance": "50.0000",
"frozen": "0.0000",
"addr": "12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
}
# 平行链资产
{
"exec": "user.p.para.token",
"symbol": "GD",
"amount": 1100000000,
"addr": "12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
}
# 查看跨链资产
{
"exec": "paracross",
"symbol": "token.TC",
"balance": "50.0000",
"frozen": "0.0000",

"addr": "12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
}

账户模型

coins/token

从上面的直观例子来看, chain33 里账户对应一个地址,由对应的私钥掌握其所有权。由于一个地址对应多种资产, 那么在chain33内部如何表示呢?

先从存储上看一种资产对应一个状态,存放在状态树上,节点的KEY包含地址和资产信息, 如下

mavl-{exec}-{symbol}-{addr}

这个一个普通账户的地址, 以bty为例,其状态树KEY表示为

exec=coins
symbol=bty
addr=12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv
key=mavl-coins-bty-12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv

因为资产的不同, 可以的exec,symbol部分会不一样, 所以一个帐户地址可以拥有多种资产。

在acccount 包里有函数 NewCoinsAccount 就是为了方便访问这个状态。通用的访问资产的函数是 NewAccountDB.

func NewCoinsAccount() *DB {
prefix := "mavl-coins-bty-"
return newAccountDB(prefix)
}
func NewAccountDB(execer string, symbol string, db dbm.KV) (*DB, error) {
...
accDB := newAccountDB(symbolPrefix(execer, symbol))
...
return accDB, nil
}

这样就容易推导出 token 的资产如何表示

key=mavl-token-TC-12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv
调用 NewAccountDB("token", "TC", db)

到这时你将看到chain33 的账户模型是这样的。 在linj地址下有两种资产, 对应bty,TC.

└── label:linj-addr:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
├── mavl-coins-bty-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
└── mavl-token-TC-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv

合约账户/合约子帐号

合约账户是什么? 他对应一个合约,也有个地址, 但是没有人掌握其私钥, 他能帮助我们完成合约规定的业务。

例子 trade, 交易合约,他可以帮助我们完成资产的交换。linj 想用 2个bty 换 10个 TC token, 正好 alice 愿意换

trade 合约地址:1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
linj 地址: 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
alice 地址: 1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d

合约地址对应的KEY的命名规则和普通地址一样

# trade bty 
mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
# trade TC token
mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4

chain33 处于安全的考虑,限制资产的处理,合约自能处理自己名下的资产。所以linj和alice要进行交易,先要把资产转到trade 合约。

下面是合约子帐号的表示

合约子帐号格式 mavl-exec-symbol-exec_addr:user_addr
alice 在 trade 合约中的 bty 和 TC 的子账户 如下
├── label:alice-addr:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d
│ ├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d

限制资产处理规则

  1. 合约可以处理自己的帐号
  2. 合约可以处理自己的帐号里的子帐号
  3. 合约可以自己合约的记录(包含资产帐号,其他业务相关的记录)

具体展开

  1. coins 合约可以处理 mavl-coins- 开始的状态
  2. token 合约可以处理 mavl-token- 开始的状态
  3. 而trade 合约可以处理 mavl-trade- 开始的状态。(这里没有列出来,mavl-trade- 开始的状态是交易相关的订单的记录)
  4. trade 可以处理其他合约里自己的帐号/子帐号, 满足格式 mavl-exec-symbol-trade_addr/mavl-exec-symbol-trade_addr:user_addr

上面我们已经看到 普通用户帐号,合约帐号,合约子帐号。下面用一下完整的交易过程。

就是上面提到的:linj 想用 2个bty 换 10个 TC token, 正好 alice 愿意换

假设原来 linj和 alice 都有 100bty 和 100 TC token.

交易的过程

  1. linj 转账 2bty 到 trade 账户; alice转账10TC 到 trade 账户
  2. linj 提出交易(挂单)
  3. alice 接受交换
  4. linj/alice 在交易完成后,把币提回到自己的帐号

初始状态

├── label:alice-addr:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0
│ ├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0
│ ├── mavl-coins-bty-1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 100
│ └── mavl-token-TC-1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 100
├── label:linj-addr:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
│ ├── mavl-coins-bty-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 100
│ ├── mavl-token-TC-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 100
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0
│ └── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0
└── label:trade-addr:1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 0
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0
│ └── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 0
├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0

linj 转账 2bty 到 trade 账户; alice转账10TC 到 trade 账户

├── label:alice-addr:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0
│ ├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 10 *
│ ├── mavl-coins-bty-1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 100
│ └── mavl-token-TC-1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 90 *
├── label:linj-addr:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
│ ├── mavl-coins-bty-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 98 *
│ ├── mavl-token-TC-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 100
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 2 *
│ └── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0
└── label:trade-addr:1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 2 *
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 2 *
│ └── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 10 *
├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 10 *

linj 提出交易(挂单): linj 在trade 合约的 2bty 会被冻结.

├── label:alice-addr:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0
│ ├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 10
│ ├── mavl-coins-bty-1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 100
│ └── mavl-token-TC-1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 90
├── label:linj-addr:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv

│ ├── mavl-coins-bty-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 98
│ ├── mavl-token-TC-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 100
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 2 *
│ └── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0
└── label:trade-addr:1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 2
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 2 *
│ └── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 10
├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 10

alice 接受交换: alice/linj 在trade 合约里的子帐号资产互换

├── label:alice-addr:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 2 *
│ ├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0 *
│ ├── mavl-coins-bty-1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 100
│ └── mavl-token-TC-1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 90
├── label:linj-addr:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
│ ├── mavl-coins-bty-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 98
│ ├── mavl-token-TC-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 100
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0 *
│ └── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 10 *
└── label:trade-addr:1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 2
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0 *
│ └── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 2 *
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 10
├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 10 *
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0 *

linj/alice 在交易完成后,把币提回到自己的帐号

├── label:alice-addr:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0 *
│ ├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0 *
│ ├── mavl-coins-bty-1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 102 *
│ └── mavl-token-TC-1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 90
├── label:linj-addr:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
│ ├── mavl-coins-bty-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 98
│ ├── mavl-token-TC-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 110 *
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0 *
│ └── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0 *
└── label:trade-addr:1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4

├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 0 *
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0
│ └── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0 *
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 0 *
├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0 *
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0

跨链资产

chain33 可以通过跨链合约,把资产转移到平行链上。 具体步骤

  1. 把资产从原始的合约里转到跨链合约
  2. 在调用跨链合约的跨链操作把资产转移到指定的平行链上
# 跨链合约地址
paracross=1HPkPopVe3ERfvaAgedDtJQ792taZFEHCe
# 跨链合约帐号 bty 资产
mavl-coins-bty-1HPkPopVe3ERfvaAgedDtJQ792taZFEHCe 2bty
# linj 在跨链合约帐号 bty 资产
mavl-coins-bty-1HPkPopVe3ERfvaAgedDtJQ792taZFEHCe:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 2bty
# 在平行链上的bty 资产. 资产原始合约为paracroos, 资产名字为 coins.bty
mavl-paracross-coins.bty-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 2bty
# 若将平行链上的bty移动到其他平行链上的合约使用,以 exec=paracross, symbol=coins.bty , 按上文规则进行组织帐号

其他合约

其他合约只要把合约地址换掉,带入上面的规则即可

资产存储

在区块链上账户资产信息是以 Key - Value 成对保存的, 上面在账户模型中介绍了 如何用一个帐号的地址对应不同的资产, 下面介绍下资产是如何保存的。

资产的存储

// Account 的信息
message Account {
// coins标识,目前只有0 一个值
int32 currency = 1;
//账户可用余额
int64 balance = 2;
//账户冻结余额
int64 frozen = 3;
//账户的地址
string addr = 4;
}
// currency = 0 表示可切分资产,后面可能会引入不可切分的资产。

资产的操作

在一个合约中,资产有三种操作

//资产控制权转移给合约 

message AssetsTransferToExec {
string cointoken = 1;
int64 amount = 2;
bytes note = 3;
string execName = 4;
string to = 5;
}
//从合约中转回资产控制权
message AssetsWithdraw {
string cointoken = 1;
int64 amount = 2;
bytes note = 3;
string execName = 4;
string to = 5;
}
//资产在合约内部转移
message AssetsTransfer {
string cointoken = 1;
int64 amount = 2;
bytes note = 3;
string to = 4;
}

合约内的资产操作

资产控制权给合约后,合约可以任意控制资产,主要是要支持下面几种操作

//冻结资产
ExecFrozen
//解冻资产
ExecActive
//给账户减少活动资产
ExecWithraw
//给账户增加活动资产
ExecDeposit
//这个可以通过 ExecDeposit 和 ExecWithraw 组合出来,但是因为比较常见,我们也作为一个操作

ExecTransfer
ExecTransferFrozen

trade的交易涉及的资产操作

再次以上面的例子分析资产的操作和变化.

linj和 alice 都有 100bty 和 100 TC token. linj 想用 2个bty 换 10个 TC token, 正好 alice 愿意换

交易的过程

  1. linj 转账 2bty 到 trade 账户; alice转账10TC 到 trade 账户
  2. linj 提出交易(挂单)
  3. alice 接受交换
  4. linj/alice 在交易完成后,把币提回到自己的帐号

linj 转账 2bty 到 trade 账户, alice转账10TC 到 trade 账户

linj 转账 2bty 到 trade 账户, 涉及三个资产变化, 即三组Key-Value 对
1. linj coins 合约 bty 资产: 余额 100,变为 98
1. trade coins 合约 bty 资产:余额 0, 变为 2
1. linj 在 trade 里的 bty 资产: 余额 0, 变为 2
├── label:linj-addr:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
│ ├── mavl-coins-bty-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 100
Account {
currency = 0
balance = 100 --> 98
int64 frozen = 0

addr = 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
}
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0
Account {
currency = 0
balance = 0 --> 2
int64 frozen = 0
addr = 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
}
└── label:trade-addr:1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 0
Account {
currency = 0
balance = 0 --> 2
int64 frozen = 0
addr = 1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
}
对应的资产操作是
1. 资产控制权转移给合约.
1. 合约内部ExecDeposit,将资产存入 trade合约子账户
//资产控制权转移给合约
message AssetsTransferToExec {
cointoken = bty;
amount = 2 * 10e8 // 一个bty在内部表示,即精度保留8为小数
note = "转账到trade合约,为了换TC token,按自己需要写吧";
execName = "trade"
to = "1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4" // trade 合约地址
}
//
alice 的资产变化: 资产控制权转移给合约
1. alice coins 合约 TC资产: 余额 100,变为 10
1. trade token 合约 TC 资产:余额 0, 变为 10
1. alice 在 trade 里的 TC 资产: 余额 0, 变为 10

linj 提出交易(挂单)

在trade合约里挂单交易, 需要冻结余额预期被交易的资产, 涉及资产为 linj在trade合约里的 bty 资产, 对应操作和合约内冻结操作, 并生成订单(订单状态这里不介绍, 和具体业务有关) 

//冻结资产
ExecFrozen
├── label:linj-addr:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0 *
Account {
currency = 0
balance = 2 --> 0
frozen = 0 --> 2
addr = 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
}

alice 接受交换

接受交换,即可完成交易, 在业务上首先判断alice 是否有足够的TC资产, 看能否完成交易。 
完成交易的资产变化
1. alice 在 trade 合约里的 10 TC,转移到 linj 在 trade 合约里的资产。
1. linj 在trade 合约里的 2 bty ,转移到 alice 在 trade 合约里的资产
资产在合约内部交易资产,合约自己帐号信息不变
alice 在 trade 合约里的 10 TC,转移到 linj 在 trade 合约里的资产, 涉及操作为 ExecTransfer, ExecTransferFrozen, 4个资产变化。
├── label:alice-addr:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0 *
Account {
currency = 0
balance = 0 --> 2
frozen = 0
addr = 1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d
}
│ ├── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d 0 *
Account {
currency = 0
balance = 10 --> 0
frozen = 0
addr = 1GaMeW34xAMo27iPEkVLeZenu1MfLAVn8d
}
├── label:linj-addr:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
│ ├── mavl-coins-bty-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0 *

Account {
currency = 0
balance = 0
frozen = 2 --> 0
addr = 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
}
│ └── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0 *
Account {
currency = 0
balance = 0 --> 10
frozen = 0
addr = 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
}

linj/alice 在交易完成后,把币提回到自己的帐号

linj 将 10 TC 从 trade 合约提币到 token 合约, 涉及操作 AssetsWithdraw
和 ExecWithraw
//从合约中转回资产控制权
message AssetsWithdraw {
string cointoken = TC;
int64 amount = 10* 10e8;
bytes note = "提币";
string execName = "trade";
string to = "1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4";
}
资产变化涉及3个
├── label:linj-addr:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
│ ├── mavl-token-TC-12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 110 *
Account {
currency = 0
balance = 100 -> 110
frozen = 0
addr = 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
}
│ └── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4:12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv 0 *
Account {
currency = 0
balance = 10 -> 0
frozen = 0
addr = 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv
}
└── label:trade-addr:1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
└── mavl-token-TC-1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 0 *

Account {
currency = 0
balance = 10 -> 0
frozen = 0
addr = 1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4
}

未涉及到的资产操作

  1. 从一个地址向另外一个地址转账. 可以用于给自己的其他账户转账, 或给朋友转账等


//资产在合约内部转移
message AssetsTransfer {
string cointoken = 1;
int64 amount = 2;
bytes note = 3;
string to = 4;
}

未涉及到的合约内的资产操作

//解冻资产, 解冻的反向操作, 如订单挂上后, 不想交易了 撤销订单
ExecActive


分享到:


相關文章: