什么是以太坊账户
# 以太坊账户
当我们在使用钱包时候,可以通过钱包来创建一个账户,也可以通过导入私钥的形式,从链上导入一个以太坊账号。除此之外,如果你编写过智能合约,可能还会听说过一个叫做Address
的库,这个库中有一个函数是这样的:
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
2
3
这个函数的作用是判断一个地址是合约地址还是非合约地址。
那么就由此产生了一个问题,合约账户和钱包账户到底有什么区别?
# 帐户类型
以太坊有两种帐户类型:
- 外部持有 – 私钥的所有者控制
- 合约 – 一种由代码控制,部署在网络上的智能合约。 了解智能合约 (opens new window)。
这两种帐户类型都能:
- 接收、持有和发送 ETH 和 token
- 与已部署的智能合约进行交互
# 主要区别
外部持有
- 创建帐户是免费的
- 可以发起交易
- 外部所有的帐户之间只能进行 ETH 和代币交易
合约
- 创建合约存在成本,因为需要使用网络存储空间
- 只能在收到交易时发送交易
- 从外部帐户向合约帐户发起的交易能触发可执行多种操作的代码,例如转移代币甚至创建新合约
# 帐户组成
以太坊帐户有四个字段:
nonce
– 显示从帐户发送的交易数量的计数器。 这将确保交易只处理一次。 在合约帐户中,这个数字代表该帐户创建的合约数量- 这个nonce值一般通过钱包自动生成,但在某些情况下,你也可以自己指定nonce值
balance
– 这个地址拥有的 Wei 数量。 Wei 是以太币的计数单位,每个 ETH 有 1e+18 Wei。- 对于刚接触以太坊的用户来说,存在一个常见的误区就是误认为只有用户账户才会持有余额,实际上,可以通过
address(this).balance
的方法获得合同的余额
- 对于刚接触以太坊的用户来说,存在一个常见的误区就是误认为只有用户账户才会持有余额,实际上,可以通过
codeHash
- 该哈希表示以太坊虚拟机 (EVM) 上的帐户代码。 合约帐户具有编程的代码片段,可以执行不同的操作。 如果帐户收到消息调用,则执行此 EVM 代码。 与其他帐户字段不同,不能更改。 所有代码片段都被保存在状态数据库的相应哈希下,供后续检索。 此哈希值称为 codeHash。- 对于外部持有的帐户,codeHash 字段是空,这也是判断地址是否是合约地址的方法
storageRoot
– 有时被称为存储哈希。 Merkle Patricia Trie 根节点的 256 位哈希已编码了帐户的存储内容(256 位整数值映射),并编码为 Trie,作为来自 256 的 Keccak 256 位哈希的映射位整数键,用于 RLP 编码的 256 位整数值。 此 Trie 对此帐户存储内容的哈希进行编码,默认情况下为空。
# MPT树
MPT(Merkle Patricia Trie),是一种用hash索引数据的前缀树。通过key去查询value,就是用key在MPT树上进行索引,在经过多个中间节点后,最终到达存储数据的叶子节点。如图是全局状态树,4个叶子节点(key/value值)通过如下组织形式,构成状态树。
# 外部账户的公私钥原理
# 什么是外部账户
一个帐户由一对加密密钥组成:公钥和私钥。它们有助于证明交易实际上是由发件人签署的,并防止伪造。您的私钥是您用来签署交易的,因此它授予您对与您的帐户相关联的资金的保管权。你从来没有真正持有加密货币,你持有私钥——资金总是在以太坊的分类账上。
这可以防止恶意行为者广播虚假交易,因为您始终可以验证交易的发送者。
如果 Alice 想从她自己的账户向 Bob 的账户发送以太币,Alice 需要创建一个交易请求并将其发送到网络进行验证。以太坊对公钥加密的使用确保了 Alice 可以证明她最初发起了交易请求。如果没有加密机制,恶意对手 Eve 可以简单地公开广播一个看起来像“从 Alice 的账户向 Eve 的账户发送 5 ETH”的请求,并且没有人能够验证它不是来自 Alice。
# 账户创建
当您想创建一个帐户时,大多数库都会为您生成一个随机私钥。
私钥由 64 个十六进制字符组成,可以使用密码进行加密。
例子:
fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f
公钥是使用椭圆曲线数字签名算法 (opens new window)从私钥生成的。通过获取公钥的 Keccak-256 哈希的最后 20 个字节并添加0x
到开头,您可以获得您帐户的公共地址。