# 账户和地址

# 什么是地址

比原链资产的所有权是通过地址、数字签名来确立的。每笔交易都需要一个有效的签名才会被存储在区块链上,只有有效的数字密钥才能产生有效的数字签名。因此,拥有数字密钥就等于拥有了该账户的资产控制权。密钥是成对出现的,由一个公钥和一个私钥组成。简单地说,公钥可以作为交易输出的地址,而私钥可以为交易生成数字签名。一般情况下,他们被存储在钱包文件中,由钱包软件进行管理。

当发行一笔资产时,会将资产发行到指定的地址上。当花费一笔资产时,从一个已经存在的地址消费它们并转到一个新的地址上。当销毁一笔资产时,同样从一个已经存在的地址消费它们但转到一个永远无法被消费的地址上。

此外,并非所有的地址都是公钥,它们也可以代表其他支付对象,譬如脚本。我们将支付脚本称之为控制程序,每一个控制程序包含一系列为了花费该输出时需要满足的谓词。

# 账户控制程序

其中,最基本的控制程序属于账户控制程序,它定义了多个密钥以及在花费资产单元时需要的签名数。当存入一笔资产到指定账户时,钱包客户端会从根密钥中导出一系列新的子公钥,并创建一个唯一的、且只被使用一次的控制程序,该控制程序使用了之前定义的签名数。

根据账户中密钥的个数可分为单签账户和多签账户。单签账户在创建控制程序时采用P2PKH方式。其主要验证Public Key是否能够转换成正确的地址以及Signature是否正确,也就是证明你是这个Public Key的主人。多签账户在创建控制程序时采用P2SH的方式,例如对于3-2的多签账户,它需要验证至少两个有效的签名。

尽管同一个账户的所有控制程序使用的子公钥都从同一个根密钥导出,但区块链上的其他参与者不可能识别出它们之间的联系。这项技术被称之为分层确定性密钥推导,它确保了只有与你交易的区块链上的参与者才会知道该控制程序属于你的。对于其他人,并不能知道该控制程序的创建者。

# 销毁控制程序

销毁控制程序是一种非常简单的控制程序,它只有一个简单的谓词:FAIL。即它确保了上面的资产单元永远不可能被消费,所以等于说该笔资产从区块链中去除了流通。

# 自定义控制程序

比原的合约虚拟机支持自定义的控制程序。我们开发了一套高级别的语言,使得开发者可以在比原上编写智能合约程序。详细介绍见智能合约文档。

# 什么是账户

在比原中,账户是一种可以通过追踪控制程序(control program)或者地址(address),来确定资产在区块链上所有权而进行抽象的实体。控制程序或地址会出现在每一笔交易的输出中。其中,控制程序定义了一系列在花费这笔输出时必须满足的条件;地址通过对公钥或脚本进行hash计算生成。控制程序和地址都可以作为一笔交易的输出地址,当下一笔交易花费该输出时,需要与输出地址对应公钥相匹配的私钥进行签名。

在本地可以存在多个账户实体,账户实体并不会保存到区块链上,而只会存在于本地,只有在账户中创建的控制程序或地址才会出现在区块链上。然而,当一笔交易被处理时,依附于本地的账户数据可以提供更加强大且对用户更易于理解的查询。

# 账户余额

账户余额本身也是一个便于用户理解而抽象的概念,它表示使用了该账户的地址或控制程序的UTXO中所有资产的总和。当构建一笔资产转账交易,你的账户会收集足够数量的UTXO来作为新交易的输入。

# 创建账户

当创建一个账户时,需要提供账户的别名、一到多个密钥以及签名数。

  • 账户别名是必选的,它是用来在本地操作账户的唯一标识。
  • 非严谨地说,密钥可以用来生成地址、以及对交易进行签名。根据密钥为一个还是多个可以分为单签账户和多签账户,详见地址部分。
  • 签名数表示当使用该账户花费一笔资产且需要签名时,至少需要私钥进行签名的个数。
上次更新: 2021/8/11下午3:57:51