精通以太坊-以太坊背后的密码学

四、以太坊背后的密码学

4.1 密钥和地址

截至本书出版时(18年),以太坊协议本身并没有任何加密信息,也就是说,所有通信和交易数据都不是加密的,因此所有人都必然可以读取。

一个私钥会与唯一一个以太坊地址(也称为账户)挂钩。

资金的访问与控制权都是通过数字签名实现的。

外部账户的以太坊账户地址由密钥对中的公钥生成。

合约背后就没有私钥来控制所有权。

4.2 公钥密码学和加密货币

质因数分解问题、离散对数难题。

公钥和私钥一起表示一个以太坊账户,公钥用于可访问账户管理(也就是地址),而私钥用于控制账户内持有的以太币,并控制使用智能合约时所需的认证程序。

4.3 私钥

私钥就是一组随机获取的数字,以太坊软件使用底层操作系统的随机数生成器生成一个256位的“熵”,作为随机源,放入256比特的哈希算法中,产生一个256比特的数字。

请使用密码学安全的伪随机数生成器(如CSPRNG)生成私钥,并且使用熵源充足的随机源做种子。

4.4 公钥

每个以太坊公钥都是椭圆曲线上的一个点(x, y)。

以太坊使用跟比特币系统相同的椭圆曲线算法,称为secp256k1。

通过私钥可以推算出公钥,但是通过公钥无法反向计算得出私钥,因为这个数学算法是单向的。

采用130个十六进制字符(65字节)表示的公钥。这是由SECG所发布的行业标准的一种序列化编码方式。

以太坊只使用未压缩的公钥,因此唯一相关的前缀就是0x04。

4.5 密码学哈希函数

以太坊协议中多处用到了名为Keccak-256的密码学哈希函数。

如何辨别所使用的程序库是FIPS-202 SHA-3还是Keccak-256:

  1. Keccak256(“”) = c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
  2. SHA3(“”) = a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

4.6 以太坊地址

从私钥开始,通过椭圆曲线乘法运算获得了一个公钥,然后使用Keccak-256来计算公钥的哈希值,保留后20位(大端序中最末的字节),这就是我们的以太坊地址。

ICAP地址可以用于编码以太坊地址,也可以用于编码注册在以太坊域名注册服务之下的通用名称。

EIP-55为以太坊地址提供了一种后向兼容的校验机制,这个机制是通过修改十六进制地址中的大写字母来实现的:对全小写的十六进制地址计算Keccak-256哈希,如果在哈希中对应的十六进制大于或者等于8,就把这个字母改为大写。

疑惑

  1. 有效范围什么意思?
  2. 公钥加密算法中的G是固定的吗
  3. 为什么要对地址进行编码?