账户CKB余额是否可以全部转出和最小余额

存储账户余额本身需要CKB,那账户上的CKB可以转干净吗,如果可以那就是说一旦转干净,账户的状态就会被删除,那么保留的最少余额是多少呢?

1 Like

看你需要存的那个状态是多大了吧。

比如你需要存 100 byte 的状态那就要保留 100 CKB。

能转移走的是那些没用来存状态的 CKB。

谈谈我的理解哈 ~

问题一:存储账户余额本身需要CKB?

首先,我们需要理解[存储账户余额本身需要 CKB ]这个概念。CKB 对应着 Cell 的 Capacity,假设用户有 100 CKB,其中 Cell 的必备字段占据 10 CKB(这是每个 Cell 必须存在的状态,这就是你认为的存储账户余额本身需要 CKB ),在这种情况下,Cell 可用 Capacity 为 90 CKB。

但是,这和转账交易是无关的。转账转移的是 Capacity,而非可用 Capacity。
存储账户余额会导致可用 Capacity 的减少,但是转账交易涉及的 Capacity 是不会减少的。

这就来到第二个问题。

问题二:账户上的 CKB 可以转干净么?

假设你所谓的账户余额是指 CKB 的余额,那么这是可以转干净的。譬如你有 100 CKB,既你的 Cell 的 Capacity 是 100 CKB,你可以转账的额度亦为 100 CKB。(这在上面已经解释了)

问题三:一旦转干净,账户的状态就会被删除,那么保留的最少余额是多少?

这也取决于你对于账户状态的定义:什么是账户状态?

首先我们需要理解区块链的账户概念,这和我们理解的中心化服务器的账户状态很不一样。在中心化服务器,您的账户被删除,意味着您的账号、密码被删除,交易信息被删除,一切都没了!

区块链的账户本质是公私钥对,外显是大家可以看到的地址与交易信息。当我们转移了所有的 CKB,你其实还拥有着你的私钥,也就是说你有这个账户的所有权利:包括接受别人给的你 token,使用 Dapp 等。而你历史记录,事实上都会展示在区块链里。换句话说,账户状态并没有被删除。这种情况下你也不需要保留最少余额。

这里有一个意外情况你需要考虑一下。如果你说的账户状态**包括 ERC20 token 等有价值的信息**,那么,如果你把仅剩的 100 CKB 全部转走,你的 ERC20 token 就会消失(这简直是噩梦)。这种情况下,往往钱包软件会提醒你不要转移有重要信息的 CKB。在种情况下,保留的最少余额就取决于你保留的重要信息有多大。如果你的重要信息有100 CKB,最少余额就是100 CKB。

5 Likes

感谢你的回复,非常细节到位!

1 Like

Cell 中的必备字段占据的 Capacity 不是 10 CKB,而是 40CKB。更为典型的,一个以 secp256k1 作为 lock 的 Cell 最小占据 60 CKB。

pub struct CellOutput {
    pub capacity: Capacity,
    pub data: Bytes,
    pub lock: Script,
    pub type_: Option<Script>,
}
pub struct Script {
    pub args: Vec<Bytes>,
    pub code_hash: H256,
}

CellOutput 就是 Cell 的存储结构,其中除了 capacity 和 lock 其它都是可选字段:

  • capacity: 8 CKB
  • lock: 52 CKB (最小 32 CKB)

EDIT
Script 结构更新:

pub struct Script {
    pub args: Vec<Bytes>,
    pub code_hash: H256,
    pub hash_type: ScriptHashType,
}

目前最小的 secp256k1 lock 的大小是 53CKB (lock 最小33CKB),也就是说目前一般来说最小 Cell 大小是 61CKB。

3 Likes

capacity: 8 CKB,你好,请问这个是小值吗?如果是的话,为什么不能是 7kb 呢

@LeonLeon @Phil

就是给 capacity 这个字段设置的 8 个字节的存储空间

你没看懂我问题,我指的是:为什么是8,而不是 7 或 6

因为它的数据类型是 64 bit unsigned integer (u64),占用 8 bytes 空间。