【Ethereum基础】:账户、地址、私钥和公钥

原创 2018年04月17日 09:46:10

在以太坊中,账户、地址、私钥(Private Key)和公钥(Public Key)是非常重要的概念。账户扮演着以太坊的中心角色,地址是我们与以太坊系统进行交互的标识,它是以太坊账户与外界进行交互的名字,而私钥与公钥是保护我们账户安全的重要屏障。

什么是账户(Accounts)?

账户在以太坊中扮演者十分重要的角色,它是以太坊的中心概念。在以太坊中,有两种类型的账户1:一种是外部账户(EOAs,Externally Owned Accounts),另一种是合约账户(Contracts Accounts)。当我们提到账户这个术语的时候,我们通常指的是外部账户(EOA),当提到合约账户的时候我们通常称其为“合约”。

不论是外部账户还是合约账户,它们在以太坊中所维护的都是一系列叫做状态对象(state objects)的实体。这些实体中都拥有状态信息:外部账户存储的是账户的余额(balance),合约账户存储的是余额和合约中的内容。它们存储的这些状态会通过以太坊网络进行更新以及保证数据的一致性。账户是用户在以太坊区块链上创建交易必不可少的一部分。

账户标识了以太坊网络中每一个参与者的身份,每一笔交易都需要通过账户使用公钥加密进行签名才能够正常进行,这样的话,EVM(以太坊虚拟机)才能够对交易发送者进行验证来确保交易的真实可靠。

什么是以太坊地址(Address)?

一个以太坊地址就代表着一个以太坊账户,地址是账户的标识。对于外部账户来说,地址表示的是该账户公钥的后20字节(通常会以0x开头,例如,0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826,该地址使用的是16进制表示法2)。上述示例中的地址中的字母全部是小写。在EIP553中引入了一种大小写混用的地址表示方法,通过这种表示方法进行表示的地址隐含了一个校验和(checksum)能够验证该地址的有效性。

什么是私钥和公钥?

每个账户都由一对钥匙定义,一个私钥(Private Key)和一个公钥(Public Key)。 账户以地址为索引,地址由公钥衍生而来,取公钥的最后20个字节。每对私钥/地址都编码在一个钥匙文件里。该文件是JSON格式的,下面我们将会查看一个私钥文件示例(Keystore)。

以太坊的私钥是一串64位16进制字符(32字节)。它是账户安全最重要的部分,需要妥善保管,如果丢失了私钥也就意味着你的账户丢失了。

查看一个Keystore文件

Keystore文件通常保存在以太坊数据目录的keystore文件夹下,它是JSON格式的:

{  
   "address":"358f94366124d9f2817b09c84921d2a653f5ac0c",
   "crypto":{  
      "cipher":"aes-128-ctr",
      "ciphertext":"41c14f88ec8f35c9fe57cd39121a76c2dadbd82ea8fec59866468bc0d7371f2e",
      "cipherparams":{  
         "iv":"43443bf394e8f6ebcc687e13bc0effb9"
      },
      "kdf":"scrypt",
      "kdfparams":{  
         "dklen":32,
         "n":262144,
         "p":1,
         "r":8,
         "salt":"aaef6847d09cb1e9f5ceadaf5865d96a7493df1cae146b24e31092cc0a7844af"
      },
      "mac":"5e9781c587db5795c6d41cb4f001bf086cc3db33b6e7eefcc2ef472145e76821"
   },
   "id":"bcd61a88-283f-4d81-8457-30ec9c11521f",
   "version":3
}

通过keystore文件中的内容,我们可以看到其中包括了私钥加密的相关信息:
- address:该账户的地址
- cipher:加密方法使用的是AES-128-CTR算法4
- ciphertext:加密后的密文
- cipherparams:AES-128-CTR算法加密所需的相关参数
- kdf:秘钥生成函数,用于使用密码对keystore文件进行加密
- kdfparams:kdf算法所需的参数
- mac:用于验证密码的编码

私钥、公钥和地址是如何生成的?

大体来说,地址的生成的流程是:私钥 -> 公钥 -> 地址。因此地址的生成需要三步:
1. 生成一个随机的私钥(32字节)
2. 通过私钥生成公钥(64字节)
3. 通过公钥得到地址(20字节)

私钥的生成

私钥是一组64位的16进制字符,通过私钥我们能够访问一个账户。以太坊的私钥生成是通过secp256k15曲线生成的,secp256k1是一个椭圆曲线算法,比特币使用的也是相同的曲线算法。

通过OpenSSL6我们可以生成一个椭圆曲线私钥:

$ openssl ecparam -name secp256k1 -genkey -noout                                                                                                                                                                                                                    
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEICGlTPPQInj0R/jaa7+bjF1twiR3RDLdOChSq98L5FmWoAcGBSuBBAAK
oUQDQgAERynScthXq2n4Ahkfp08s/QNogZEtVCfQE/XTvpjsnIeQEZGJIOb+Liyl
uF8PIerBE1CjvCs5LLU+fZz+B31+Bg==
-----END EC PRIVATE KEY-----

公钥的生成

其实,通过OpenSSL我们可以同时得到私钥和公钥:

$ openssl ecparam -name secp256k1 -genkey -noout | openssl ec -text -noout                                                                                                                                                                                          
read EC key
Private-Key: (256 bit)
priv:
    3f:64:bb:20:0a:b5:82:e9:73:03:8a:8b:79:68:62:
    41:8b:98:a7:10:00:fb:50:de:c4:4d:0d:06:3d:a2:
    ed:cd
pub:
    04:4a:18:c2:c7:40:f4:9a:77:b2:89:e9:27:0c:39:
    94:8b:94:10:a1:b0:c9:81:d9:af:06:8c:06:23:93:
    63:d7:26:82:fd:b0:22:fe:f6:7f:4f:8a:69:58:2f:
    98:3a:b3:94:ab:5f:06:85:4c:25:f3:3d:8e:f1:35:
    2f:e7:fe:50:4d
ASN1 OID: secp256k1

地址的生成

地址是通过对上述的公钥做Keccak-256哈希7,然后取最后的40位16进制字符得到的。我们对上述的公钥做哈希后并取后40位的结果是:0x24602722816b6cad0e143ce9fabf31f6026ec622。得到的该结果就是一个有效的以太坊地址。

如何验证地址的有效性

Geth Web3进行验证:

通过以太坊客户端Geth的Web3接口可以对以太坊地址进行有效性验证:

> web3.utils.isAddress('0xc1912fee45d61c87cc5ea59dae31190fffff232d');
> true

通过第三方JS库进行验证:

wallet-address-validator8是一个JavaScript库能够对多种加密货币的地址进行验证。

var WAValidator = require('wallet-address-validator');
var valid1 = WAValidator.validate('0x24602722816b6cad0e143ce9fabf31f6026ec622', 'ETH');
if(valid1)
    console.log('This is a valid address');
else
    console.log('Address INVALID');

本文的版权归作者 罗远航 所有,采用 Attribution-NonCommercial 3.0 License。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!

版权声明:本文为博主原创文章,未经博主允许不得转载。(文章来源:http://blog.luoyuanhang.com) https://blog.csdn.net/luoyhang003/article/details/79970254

比特币私钥、公钥、钱包地址之间的关系

比特币交易涉及到很多密码学知识:公钥、私钥、哈希、对称加密、非对称加密、签名等等。那么哪些是需要用户认真保管不能对外泄露的,那些是需要用户公开的呢?先从钱包地址的生成说起。 钱包地址生成 ...
  • qishuo_java
  • qishuo_java
  • 2015年08月31日 18:38
  • 15070

区块链原理学习之二-私钥公钥和地址

比特币属于加密货币,其加密的基础是加密学。秘钥分为公钥和私钥,其成对出现。公钥用于交易中的收款确认,类似于银行交易中的“收款方”。私钥用于数字签名,确认交易的所有权,类似于银行交易中的“签名”。加密基...
  • sunhaidong886
  • sunhaidong886
  • 2017年08月31日 14:17
  • 2480

比特币『私钥』『公钥』『钱包地址』间的关系

https://www.bikeji.com/t/110#reply25 比特币交易涉及到很多密码学知识:公钥、私钥、哈希、对称加密、非对称加密、签名等等。那么哪些是需要用户认真保管不能...
  • yhtoo
  • yhtoo
  • 2015年07月21日 16:56
  • 1858

比特币的密钥(yue)、公钥、和地址之间的概念理解

随机取32个字节的【秘钥】 ---》椭圆加密算法 ----》【公钥】(压缩的话,只取前面的32位。) -----》sha256 ----》哈希160 ---》生成【公钥哈希】 然后比特...
  • u010833547
  • u010833547
  • 2017年10月12日 22:56
  • 1336

一文读懂比特币私钥、公钥、钱包地址的来历和关系

作者:景辰链接:https://www.zhihu.com/question/22399196/answer/201836128来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明...
  • DDFFR
  • DDFFR
  • 2018年01月19日 16:12
  • 617

什么是私钥,公钥和地址

http://www.btcside.com/new/detail/2145 这是比特币中经常出现的三个词,那么他们分别是什么意思呢?他们之间又有什么样的关系呢? 先说说私钥,例如...
  • yhtoo
  • yhtoo
  • 2015年07月21日 16:59
  • 2722

区块链之比特币的私钥,公钥和地址是什么?

在比特币中,经常出现三个词:私钥,公钥和地址。他们是什么意思呢?他们之间又有什么样的关系呢?搞清楚他们之间的关系和区别,是了解比特币的基础。 私钥 先说说私钥,一般我们看到的私钥是下面这样的一段字...
  • ziyuzhiye
  • ziyuzhiye
  • 2017年08月16日 12:12
  • 1609

公钥 私钥 CA

点击打开链接http://www.williamlong.info/archives/837.html 点击打开链接http://www.williamlong.info/archives/82...
  • lein_wang
  • lein_wang
  • 2013年03月01日 14:00
  • 2259

比特币原理入门之三:比特币私钥和地址

在前面的文章中我们提到,在整个比特币的系统中,有一个东西在其中扮演了非常重要的角色,就是那个神奇的钱包。关于钱包,它那么神奇,那我呢准备在下一个视频中再详细介绍,在介绍钱包之前,我们先插入今天的这文章...
  • angciyu
  • angciyu
  • 2018年02月10日 21:43
  • 137

网络安全中的公钥和私钥

公钥和私钥的核心就是加密和解密的密码不一样,一个是公钥,另一个是私钥,这个机制也叫非对称密码机制。 和原来的对称密码不同,原来双方使用同一个密码,除了自己保存外,如果跟别人通讯,则要求对方也有同样的...
  • easebone
  • easebone
  • 2012年03月09日 12:05
  • 2160
收藏助手
不良信息举报
您举报文章:【Ethereum基础】:账户、地址、私钥和公钥
举报原因:
原因补充:

(最多只允许输入30个字)