以太坊账户分为两种:外部账户(Externally Owned Account, EOA) 和 合约账户。

    (1)外部账户:一般简称为“账户”,是由人创建的,可以存储以太币,由公钥和私钥控制的账户。

    每一个外部账户拥有一对公私钥,这对秘钥用来签署交易,它的地址由公钥决定。外部账户不能包含以太坊虚拟机(EVM)代码。做一个简单的类比:把外部账户看作用户在某个银行的账户,公钥就是用户为该账户设置的卡号,而私钥则是用户设置的密码。一个外部账户具有的特性为:拥有一定的账户余额、可以发送交易、通过私钥控制、没有相关联的代码。

    用户可以使用Geth指令创建一个外部账户。生成一个账户地址的过程主要有3步:

    a. 设置账户的私钥,也就是通常意义上的用户密码。

    b. 使用加密算法(SECP256K1椭圆曲线密码算法)由私钥生成对应的公钥。

    c. 根据公钥得出相应的账户地址,在以太坊中使用SHA3方法。

    用户创建好账户之后,一定要记住私钥。如果忘记了,那么用户就不能再访问这个账户了,私钥也不可能再找回,因为以太坊没有可以让用户重置或者找回私钥的功能。秘钥文件通常保存在keystore目录下,用户可以经常性的备份秘钥文件。

    (2)合约账户:由外部账户创建的账户,是包含合约代码的账户。

    合约账户不是由私钥文件直接控制,而是由合约代码控制。合约账户的地址是由合约创建时,合约创建者的地址,以及该地址发出的交易共同计算出来的。合约账户具有的特性为:拥有一定的余额、有相关联的代码,代码通过交易或者其他合约发送的调用来激活、当合约被执行的时候,只能操作合约账户拥有的特定存储。合约账户和普通账户最大的不同是:合约账户存有智能合约。

    每当合约账户收到一条交易消息的时候,其合约代码将被交易输入的参数调用执行。而合约代码将会在参与到网络中的每一个节点上执行,并将执行结果作为新块验证的一部分。

    以太坊中这两种账户统称为“状态对象”(存储状态)。其中外部账户存储以太币余额状态;而合约账户除了余额,还有智能合约及其变量的状态。通过交易的执行,这些状态对象发生变化,而Merkle树用于索引和验证状态对象的更新。一个以太坊账户包含4个部分:

    (1)该地址交易的次数(nonce),它是用于保障每笔交易有且只能被处理一次的计数器,有效避免重放攻击。

    (2)账户目前的以太币余额。

    (3)账户的合约二进制码。

    (4)账户的存储(默认为空)。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐