以太坊账户:外部账户和合约账户
以太坊有两种账户,它们共用同一个地址空间:
- 外部账户(externally owned accounts),由**控制。
- 合约账户(contract accounts),由智能合约的代码控制。
什么是外部账户?
外部账户,该类账户被公钥-私钥对控制(人类)。以太坊地址代表一个帐户。对于外部账户,地址是作为控制该账户的公钥的最后20个字节导出的。
例如:0x71C7656EC7ab88b098defB751B7401B5f6d8976F。这是一个十六进制格式(基数为16的表示法),通常通过向地址附加0x来明确指出。
外部账户的地址是由公钥加密后生成的,所以用户需要谨慎对待私钥,私钥用来查看和处理我们账户中的资产,一旦丢失,资产将永远丢失。
什么是合约账户?
合约账户(contract accounts),由智能合约的代码控制。只有合约账户才有代码,其中存储的是 codeHash(这个账户的以太坊虚拟机代码的哈希值)。这个字段在生成后是不可修改的,这意味着智能合约代码是不可修改的。
以太坊的账户包括四个字段:一个随机数、账户的余额、合约代码(如果有的话)、存储(通常为空)。
外部账户可以触发交易,而合约账户不能主动发起交易,只能在被触发后按预先编写的智能合约代码执行。
合约账户可以设置多重签名(multisign),比如一个简单示例是:现有一个合约账户,它要求一个转账由发起转账的人(Alice)和另一个人(Charles)签名均可。因此,当 Alice 通过这个合约向 Bob 转账 20 个 ETH 时,合约会通知 Charles 签名,在他签名后,Bob 才可以收到这 20 个 ETH(见下图)。
外部账户和合约账户的区别
以太坊的账户包括四个字段:一个随机数、账户的余额、合约代码(如果有的话)、存储(通常为空)。
外部账户:有账户余额;无代码;能触发交易(转账或执行智能合约);由私钥控制。
合约账户:有账户余额;有代码;能被触发执行智能合约代码;在智能合约创建后自动运行。
外部账户的地址是由公钥决定的。
合约账户的地址是在创建合约时确定的(这个地址由合约创建者的地址和该地址发出过的交易数量计算得到)。