Stellar 使用签名进行授权。事务总是需要至少一个公钥的授权才能被视为有效。通常情况下,事务只需要来自源账户的公钥授权。
事务签名是通过使用密钥对事务中的内容进行加密签名创建的。Stellar 目前使用的是 ed25519 签名方案,但是您也可以使用其他类型的公钥/密钥方案。带有附加签名的事务被视为得到了该公钥的授权。
在两种情况下,事务可能需要多个签名。如果交易具有影响多个账户的操作,则需要每个相关账户的授权。如果与事务关联的账户具有多个公钥,则事务还需要额外的签名。有关示例,请参阅操作指南。
所有的操作都属于特定的阈值类别: 低、中或高。给定水平的阈值可以设置为 0-255 之间的任意数字。此阈值是授权该级别上的操作所需的签名权重。
假设 Diyang 把她的一个账户的中等阈值设置为 4。如果该账户提交了一个包含支付操作(中等阈值权限)的事务,则该事务的阈值为 4 —— 事务上的签名权重必须大于或等于 4 它能被成功执行。如果 Diyang 的主密钥的权重小于 4,那么她不能在没有其他可签名者授权的情况下成功执行该事务。
当事务的签名阈值满足后,如果有任何多余的签名,事务将会因具有过多的签名而失败,即使多余的签名是有效的。例如,一个事务拥有 N 个签名,当验证到第 K 个签名时(N > K)就已经满足了事务所需的阈值,那么这个事务将会失败。
每个账户都可以设置自己的阈值。默认情况下,所有阈值级别都被设置为 0,并且主密钥的权重被设置为 1。Set Options 操作允许您更改主密钥的权重并添加具有不同权重的其他签名密钥。
低等权限操作:
中等权限操作:
高等权限操作:
在大多数情况下,我们推荐将阈值的大小设置为 low <= medium <= high
。
账户由一个公钥标识。与此公钥对应的密钥称为主密钥。可以使用 Set Options 操作将其他签名密钥添加到账户中。
如果主密钥的权重被设置为 0,那么主密钥就被认为是无效的密钥,您不能使用它签署任何事务(即使对于阈值为 0 的操作也是如此)。如果该账户上有其它的签名者,他们仍然可以继续授权事务。
"签名者"指的是主密钥或后来添加的任何签名密钥。签名者由公钥及权重构成。
每个除主密钥之外的额外签名者都会增加账户的最低账户余额。
要启用一些高级的特性(如智能合约),还需要一些额外的签名类型。这些签名类型也具有权重,可以像普通签名类型那样添加和删除它们。但是,与检查加密签名的授权不同的是,他们用另外一种不同的方法来证明其在网络上的有效性。
账户可以通过将准备在未来提交的事务的 hash 添加为账户上的"签名人"来预先授权该事务。为此,您需要事先准备一个包含了适当序列号的事务,然后您可以获得此事务的 hash 并将其作为签名者添加到账户中。
当与签名者列表中的 hash 匹配的事务被成功执行后,这个签名者将自动从账户中删除。如果匹配的事务出现错误,或者从未提交匹配的事务,则签名者仍然会保留在账户中,您必须使用 Set Options 操作手动删除它。
这种类型的签名者在托管账户中特别有用。您可以预先授权两个不同的事务,两者具有相同的序列号且不同的接收者,这意味这它们中只有一个能被成功执行。
添加 hash(x) 类型的签名允许任何知道 x
的人签署事务。这种类型的签名者可用于原子跨链交换,而原子交换是像闪电网络这样的区块链间的协议所需要的。
首先,创建一个随机的 256 bit 值,我们称之为 x
。该值的 SHA256 hash 可以作为 hash(x) 类型的签名者添加。然后,为了对事务进行授权,将 x
添加为事务的签名之一。请记住,一旦有以 x
作为签名的事务被提交到网络上,那么 x
将被世界上的任何人知道。这意味着此时任何人都可以使用 x
对事务进行签名。通常您需要为您的账户配置其它签名者,这样别人只有同时知道其它签名者的密钥和 x
才能得到在该账户上执行事务所需的权重阈值。
事务信封包含了事务对象和一组签名。事务对象是签名者实际签署的东西。从技术上讲,事务信封是在网络中传输并包含在事务集中的东西。
若要确定事务是否具有运行所需的授权,请累加事务信封中所有签名的权重。如果权重和大于或等于为该操作类型设置的阈值(见下文),则该操作被视为通过了授权。
通过多重签名,您可以作出很多灵活的方案,比如您可以设置一个账户使它的付款需要得到多位签名者的授权,您也可以配置一个任何人都能执行授权操作的账户,您还可以拥有一个能够授予或撤销别人对账户访问权限的主密钥。以下是一些示例:
您运行一个锚点并使发行账户保持离线状态。这样一来,恶意用户几乎不可能得到发行账户的密钥,从而防止恶意用户发行资产。但是,您需要通过运行
Allow Trust
操作来授权其它用户是否能持有您发行的资产。在向账户发放资产之前,您需要验证该账户是否正常。
多重签名允许您在不暴露锚点的主密钥的情况下完成所有操作。您可以使用 Set Options
操作向您的账户添加另一个签名密钥,并且这个签名者的权重应低于中等阈值。因为 Allow Trust
是一个低阈值操作,所以这个额外的密钥可以授权其它用户持有锚点发行的资产。但是,由于 Payment
是一个中等阈值的操作,所以这个额外的密钥并不能授权锚点发行资产,因此您的锚点仍然是安全的。
您的账户设置如下:
主密钥权重:2
额外的密钥的权重:1
低等阈值:0
中等阈值:2
高等阈值:2
您想与 Bilal 和 Carina 建立联合账户,以便三人中的任何人都可以授权付款。您还想设置账户,以便在三人都同意的情况下可以更改签名者(例如,删除或添加某人)。您将 Bilal 和 Carina 作为签名者添加到联名账户中,然后配置三人的权重,使其高于中低等阈值,并让三人权重和等于高等阈值。
Joint account setup:
主密钥权重:1
低等阈值:0
中等阈值:0
高等阈值:3
Bilal 的密钥权重:1
Carina 的密钥权重:1
您的公司想要拥有一个账户,任何由该账户发起的事务必须得到 3 到 6 个雇员的签署才能成功执行。
公司账户的设置如下:
主密钥权重:0 (屏蔽主密钥,该账户无法在未获得雇员签名的情况下执行任何操作)
低等阈值:3
中等阈值:3
高等阈值:3
雇员 1 的密钥权重:1
雇员 2 的密钥权重:1
雇员 3 的密钥权重:1
雇员 4 的密钥权重:1
雇员 5 的密钥权重:1
雇员 6 的密钥权重:1
您完全控制着一个开支账户,但您希望您的两个同事 Diyuan 和 Emil 能够授权对该账户发起的事务进行授权。您在该账户上加上 Diyuan 和 Emil 的签名密钥。如果 Diyuan 或者 Emil 离开了公司,您可以移除他们的签名密钥(这是高等权限操作)。
开支账户的设置如下:
主密钥权重:3
低等阈值:0
中等阈值:0
高等阈值:3
Diyuan 的密钥的权重:1
Emil 的密钥的权重:1
您想要发行自定义货币并确保之后不会再增发该货币。您可以创建一个源账户并向持有账户发送您想发行的货币金额。然后,将源账户的主密钥权重设置为低于中等阈值,此后该源账户不能再发行货币。
源账户的设置如下:
主密钥权重:0
低等阈值:0
中等阈值:0
高等阈值:0
注意,即使这里的阈值为 0,主密钥也不能对事务进行签名,因为它自身的权重为 0,这使它成为了无效的签名密钥。