账户


在SWTC公链的账本中,“账户”代表着包括SWTC在内的资产的持有者和交易的发起者。一个账户由一对私钥和公钥组成。账户的核心要素是:

在账本所储存的数据中,账户的核心数据存储在AccountRoot账本对象类型中。账户也可以被其他几种类型数据所拥有或部分拥有。

创建账户

在SWTC公链中并没有专门的“创建账户”交易。如果给一个有效的、但还没有使用的SWTC地址发送大于等于20个SWTC,那么系统会为其自动创建一个账户。这个过程也可以称为激活账户,同时会在账本中创建AccountRoot对象。

警告: 激活账户并不意味着你对该账户的所有权和支配权。拥有该账户地址所对应私钥的人才可以完全控制账户及其所包含的资产。

在SWTC账本中获取账户的方法如下:

  1. 从强大的随机源中生成密钥对,并通过该密钥对计算出地址。

  2. 让那些拥有SWTC账户的人将SWTC发送到你生成的地址中。

例如,您可以在私人交易所购买SWTC,然后将SWTC从交易所提币到您指定的地址。

注意: 第一次在您自己的SWTC账本地址上收到SWTC时,您必须预留一定的账户储备金(当前为20SWTC),这20SWTC将被无限期地锁定。相比较的是,中心化交易所通常将所有客户的SWTC集中保管在一些共享的SWTC账户中,因此客户无需为交易所的个人账户预留储备金。

地址

SWTC账本中的账户由base58定义。账户地址来自该账户的公钥,该公钥又来自私钥。地址在JSON中表示为字符串,具有以下特征:

任何有效地址都可以通过获得SWTC来激活从而成为SWTC账本中的账户。只有被激活的账户才能发送交易。

从密钥对开始,创建有效账户地址是一个不可逆的数学过程。你可以完全脱机生成密钥对并计算其地址,而无需与SWTC公链或任何其他方通信。从公钥到地址的转换涉及单向散列函数(Hash),因此可以确认公钥与地址匹配,但是不可能仅从地址反推出公钥。

有关如何计算SWTC账户地址的更多技术细节,请参阅地址编码。

账户的持久性

账户一旦创建后,会永远存在于SWTC账本中。根据序列号可永久追踪交易,避免双花问题。

与比特币和许多其他加密货币不同,SWTC账本的每一个新版本都包含账本的完整状态,账本长度随着新账户增加而增加。因此,除非完全有必要,否则SWTC公链不鼓励创建新账户。

交易历史

在SWTC账本中,交易历史通过交易的哈希值和账本的索引链接来实现追溯。AccountRoot账本对象拥有哈希值和最近修改它的交易账本。该交易的元数据包含AccountRoot节点先前的状态,因此可以通过这种方式遍历单个账户的历史记录。此交易历史记录包括直接修改AccountRoot节点的所有交易,包括:

地址编码

SWTC账户地址使用base58和jingtum字典进行编码:jpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65rkm8oFqi1tuvAxyz

下图显示了密钥和地址之间的关系:

Passphrase → Secret Key → Public Key + Type Prefix → Account ID + Checksum → Address

计算SWTC账户地址的公式如下。有关完整的示例代码,请参阅secp256KeyPair.go

    pubBytes := pub.ToBytes()

    /* SHA256 Hash */
    sha256H := sha256.New()
    sha256H.Reset()
    sha256H.Write(pubBytes)
    pubHash1 := sha256H.Sum(nil)

    /* RIPEMD-160 Hash */
    ripemd160H := ripemd160.New()
    ripemd160H.Reset()
    ripemd160H.Write(pubHash1)
    pubHash2 := ripemd160H.Sum(nil)
    address = jtUtils.EncodeB58(jtConst.AccountPrefix, pubHash2)