密钥和地址
在以太坊中,有两类以太坊账户可以用来持有和操作以太币:外部账户和合约账户。
外部账户对以太币的所有权是通过私钥、以太坊地址和数字签名建立起来的。私钥乃是用户与以太坊交互的核心。实际上,账户地址直接由私钥推导而来:一个私钥会与唯一一个以太坊地址(也称为账户)挂钩。
以太坊系统中没有任何地方直接用到了私钥,私钥也从不会用以太坊网络传输或存储。
也就是说,私钥应该保密,既不应该在以太坊网络通信中出现,也不应存储在链上。只有账户地址和数字签名可以在链上传输或存储。
这保证了私钥在交易的过程中不可能被泄露。
在任何以公钥加密为基础的系统(比如以太坊)中,密钥是成对的,由私钥与公钥组成。我们可以把公钥想象成银行账户,而私钥则是账户密码,私钥以加密形式保存在钱包软件所管理的文件中。
在进行以太坊交易的支付过程中,目标收款方是由以太坊地址表示的。而外部账户的地址是由公钥生成的。
图1展示了以太坊中地址的生成过程。
公钥密码学和加密货币
公钥密码学使用一种独特的密钥对来保护信息安全。
这对密钥的数学基础是一类具有特殊属性的数学函数,这类函数易于从一个方向进行计算,但要反向计算却十分困难。基于这些数学函数,密码学可以用来创造数字密钥和不可篡改的数字签名,而这些密钥与签名的安全性都是由数学定律保障的。
这类数学函数中有一种基于椭圆曲线上的算术运算。在椭圆曲线运算中,质数的模乘运算是非常简单的,但是模除运算(反向运算)却是几乎不可能的,这被称为离散对数难题,至今我们还没有发现陷门。椭圆曲线密码学在现代计算机系统中被广泛应用,也是以太坊(和其他加密货币)的密钥对和数字签名的基础。
在以太坊中,我们使用公钥密码学(也称为非对称密码学)来创建公钥私钥对。
之所以称之为“一对”密钥,是因为公钥是通过私钥生成的。公钥和私钥一起表示一个以太坊账户,公钥用于可访问账户管理(也就是地址),而私钥用于控制账户内持有的以太币,并控制使用智能合约时所需的认证程序。私钥是生成数字签名所唯一需要的信息,而用户需要数字签名来签署账户内的所有交易以使用账户资金,私钥因此成为控制账户资金的手段。
在大多数钱包实现中,私钥和公钥往往作为密钥对一起保存。然而,由于公钥可以直接由私钥计算得出,所以即使只保存了私钥也是没问题的。
一般的钱包应用后台不会存储用户的私钥,所以私钥必须自己保存好。一般钱包应用可以有多个方式让用户备份私钥,包括直接导出私钥,通过密码加密的keystore,keystore是JSON格式的数据,还有助记词等。
对以太坊交易来说,交易本身的细节就是以消息的形式使用的。
数字签名可以签署任何消息。密码学(这里具体指椭圆曲线密码学)中的数学规则使消息(即交易细节)可以与私钥结合在一起,创建出只能用私钥生成的代码。这些代码就是所谓的数字签名。注意,一笔以太坊交易可被视为对特定账户的使用请求。以太坊交易可以转移资金或与智能合约交互,在被发送到以太坊网络时,交易必须附带一个与地址对应的私钥创建的签名。椭圆曲线数学意味着任何人都可以验证交易的有效性,只需校验数字签名是否与交易细节以及要转移资产的地址相匹配。验证过程完全无须使用私钥——私钥完全不必公开。然而,验证过程可以使人们打消疑虑,因为交易只能来自掌握着与以太坊地址对应的私钥的人。这就是公钥密码学的神奇之处。
以太坊协议中并没有任何加密的部分,也就是说,所有在以太坊网络上发送的消息都可以(且必须可以)公开阅读,因此,私钥只用来创建数字签名以验证交易。