区块链概论
搜索文档…
⌃K

2.1 钱包及账户

钱包是区块链的入口
百度百科云:钱包,顾名思义是装钱的包包。
什么是(区块链)钱包?
(区块链)钱包是让人们能够管理自己的区块链账户,并且与去中心化应用(dApp)交互的工具软件。
显而易见:钱包是区块链的入口。
钱包和账户非绑定关系,一个账户可以在多数钱包里使用。同时你可以在一个以太坊钱包里,拥有很多个账户。还有:没有人能够冻结你的账号,撤销你的转账,也没有消费限额……并且无论对方在地球的哪个角落,ETH转账的一次确认时间只需7秒左右。
每个区块链,都至少需要一种具有货币属性的专属通证(token)。我们通常也把这个具有货币属性的通证叫做代币。这就意味着每个区块链也都需要钱包。每个区块链项目也都可以发行一种自己的代币——但一个公有链上的不同的去中心化应用(dAPP)可以共用同一个钱包,譬如以太坊上面的所有dApp,就可直接共用MetaMask或者Trust Wallet钱包。
根据载体的不同,区块链里的数字加密货币钱包分为计算机钱包、手机钱包、浏览器钱包、硬件钱包、纸钱包和脑钱包等等,这样不管您使用的是何种设备,或者有什么样的需求,都有配套的钱包供您使用。
其中脑钱包基本已经被淘汰。
硬件钱包是为了离线生成和保存私钥,是目前“公认”比较安全的数字加密货币存储方案——签署交易必须具有加载在内存中的未锁定私钥。传输必须连接到互联网并运行以太坊客户端。如果这两个功能在一台电脑或手机上,那确实是蛮危险的。硬件钱包采用的分离签名和传输的功能称为离线签名,是一种常见的安全措施。其中硬件钱包创建和签名交易,由手机或电脑里对应的app传输交易。
但是由于一些硬件钱包没有开源代码,同时还有一些没有经过硬件安全认证(硬件的全面开源还要假以时日),增加了很高的监守自盗风险。
浏览器钱包的代表为Metamask、Jaxx。
手机钱包的代表为Trust Wallet、MetaMask、imToken、TokenPocket
因为使用方便、用户群体大,手机钱包已经成为主流。计算机钱包的特点则刚好相反。

助记词、私钥、公钥和地址

你的各种“币”,都在你的钱包地址里。你给某个地址转账时,钱包会动用你的私钥对交易进行签名,在公钥的配合下广播这笔交易。
私钥、公钥和地址这三者长得相似,且也密切相关:私钥是钱包根据密码学原理生成;私钥通过特定的密码学原理(加密算法)生成公钥,公钥再采用另一个加密算法生成地址。这两种加密算法都保证了只能产生唯一的公钥和地址,且不能反向推算,即不能由地址破解出公钥,也不能由公钥破解出私钥。
譬如比特币钱包通过生成一个随机数,并对它进行SHA256哈希运算,再通过Base58Check编码转换而生成私钥;之后使用某个椭圆曲线算法将私钥转换为公钥,公钥再通过哈希算法和Base58Check编码转换得到地址。
有了某个地址的私钥,您才能使用它收款或转账。
私钥固定长度为256位(是从0到2256-1之间的任意值,近似于10的77次方。人类可观测的宇宙中的原子数目前约为10的80次方),使用十六进制表示如下:
6954ac6d0402d7239f1cc150da224d0ef08fd1226f245f06fe4d6d68accfce8a
因为私钥非常不便于使用,基本上只能靠拷贝来保存和移动,也就非常危险(譬如从电脑移动到手机,很多人就利用云工具,结果导致被盗)。所以BIP39协议通过加密算法,将一组英文单词和一个私钥形成单向对应的关系,以方便用户保存和在不同设备间使用。该方法诞生于比特币时代,后来又发生一些算法上的变迁,因此这组英文单词,通常为12~16个英文单词。
在区块链里私钥至关重要!它解决了其它一切手段都望而却步的怎么证明“你妈是你妈”的难题。对于你自己的资产,你毋须证明,因为私钥在你手上,其它任何人都休想能染指你的财产。这个世界从此少了很多被他人巧取豪夺、打家劫舍、掐尖落钞的烂事。
在日常交易中除非使用纸钱包,否则您通常并不用操心私钥公钥是什么,只要懂得使用钱包转账就足够了。
地址是一串很长的字符串,譬如这是某人接受比特币打赏的地址及其二维码:
1KorAWmhGaEnedUviL4rXPfsrHCB7ZVFoB
以太坊的外部地址是由用户的公钥经过哈希运算后取的后 20 个字节,在前面按照EIP85提案加上0x构成。如:0xf69451503E7EaEc6fe82E1129316104D2458010a
对于私钥,我们要先牢记四个简单的区块链基础逻辑:
  • 私钥是不可能被假冒的。
  • 私钥是完全私有的密钥,它应该自始至终都密不示人。因此在通常的支付场景下,你永远不应该出示你的私钥,你顶多需要使用私钥对你的转账进行签名—— 这个流程一般是钱包自动帮你做的。
  • 谁拥有某个地址的私钥,谁就是该地址上的那笔数字资产的主人。
  • 这是一个将人匿名的零知识证明!说明区块链应该坚持匿名原则!
零知识证明(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世纪80年代初提出的。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。
钱包和账户或者某个地址(严格地说是私钥)没有绑定关系,一个账户可以在多数钱包里使用。

比特币找零地址和以太坊账户地址

比特币转账和以太币转账不同的是,它会将全部数量的比特币从某个或某几个地址发送出去,将需要支付的数量打到收款方的地址上,并将剩余的比特币打回到自己的一个新地址亦即“找零地址”上:
图表 1 比特币转账流程
比特币的这个模型叫UTXO模型。UTXO英文全称为:Unspent Transaction Output,翻译为中文为“未花费交易输出”。理解UTXO最简单的方式就是类比我们平时使用的纸币:支付是交易输入,收款是未花费的交易输出。
“找零地址”在一些新版钱包里可自行设置,或者自作主张已经默认为原地址。但中本聪显然不建议置为原地址,他认为那样不安全,也就是不利于保护隐私。
同样因为比特币可以被跟踪,每次转账都需要向对方出示公钥和地址,为安全起见,比特币建议每次支付的时候,也都使用新的地址(实际上私钥、公钥和地址就全部换新了)。
比特币其实并没有所谓的账户。而以太坊的账户模型则跟我们通常所理解的账户概念是一致的。
一个以太坊帐户是一个可以拥有 ETH 余额的实体,可以在以太坊上发送交易。 帐户可以由用户控制,也可以作为智能合约部署。
以太坊中有两种账户地址:
  • 外部账户(Externally Owned Accounts,EOA)地址:我们常用的存储自己代币的账户地址。外部账户由私钥(或者说私钥的所有者)控制。
  • 合约账户(Contract Accounts,CA)地址:只受智能合约代码控制的账户地址。
这两种帐户类型都能:
  • 接收、持有和发送 ETH 和 token
  • 与已部署的智能合约进行交互

它们的主要区别

外部账户
  • 创建帐户是免费的
  • 可以发起交易
  • 外部所有的帐户之间只能进行 ETH 和代币交易
合约账户
  • 创建合约存在成本,因为需要使用网络存储空间
  • 只能在收到交易时发送交易
  • 从外部帐户向合约帐户发起的交易能触发可执行多种操作的代码,例如转移代币甚至创建新合约
以太坊账户维护以下几个状态(数据):
  • nonce:外部账户为交易次数,合约账户为创建的合约序号。
  • balance:该地址的以太币余额。
  • storageRoot:账户存储内容组成的默克尔树根之哈希值。
  • codeHash:账户EVM代码的哈希值。外部账户为空字符串的哈希值,合约账户为合约代码的哈希值——请注意只是合约代码的哈希值。以太坊智能合约部署后会创建一个合约账户,合约账户里保存着智能合约的编译之后的可执行字节码(在EVM里执行),并且有存储空间,合约能对合约账户的空间写入信息。
比特币的UTXO模型的优点:
  • 隐匿性比较强,理论上可以为每一笔输出设置一个地址。
  • 无需维护余额等状态值。
  • UTXO是独立数据记录,可以通过并行极大的提升区块链交易验证速度。
  • 无需关心事务问题,只需要关心输出脚本即可。
  • UTXO无法分割,每次交易都需要多个输出,分别为支出与找零。
账户模型的优点
  • 可快速获取账户的余额,而比特币需要将指定地址所拥有的所有UTXO中的未花费交易总值整合。
  • 节省记账空间,因为每笔交易只有一个输入一个输出。
  • 可以较容易的实现图灵完备的智能合约——这一点,让以太坊已经拔高一个维度,超越了比特币的电子现金的定位,对于区块链的应用发展意义非凡!

以太坊账户革新:账户抽象化(Account Abstruct)

目标是将两类以太坊账户抽象为一类,让合约账户也可以和外部账户一样支付交易费和执行交易。相关提案:EIP-2938ERC-4337
这也就是是,以太坊正在试图模糊两类以太坊账户的界限,即你可以同时拥有合约账户和外部账户,这种做法本质上就是让用户按照合约账户的格式来定义外部账户。2020年年底以太坊创始人V神等几个人发起了技术提案Acount Abstraction(EIP-2938),其核心“账户抽象”的目标是让智能合约成为顶级的账户类型,而非受限制的必须由外部账户调用的账户,这样合约账户就可以主动发起事务并支付手续费。这也就是说,没有了人类之手,区块链dApp一样可以在其它外部条件的触发下,自行启动其它操作,包括主动与其它合约交互!这一提案,非特斯拉的自动驾驶可以相提并论,意义深远!
账户抽象化实现后,因为合约帐户将能自主触发可执行多种操作的代码,譬如创建新合约,那么结合 AI ,对其应用我们就有了极大的想象空间。这一技术创新将给人类社会带来巨大的变化!

交易与gas

交易(Transaction)是由帐户发出,带密码学签名的指令。 帐户发起交易即可更新以太坊网络的状态(数据)。
最简单的交易是将 ETH 从一个账户转到另一个帐户。
例如,如果 Bob 发送 Alice 1 ETH,则 Bob 的帐户必须减少 1 ETH,而 Alice 的账户必须增加 1 ETH。 此项操作发生在交易中,会变更状态。
和比特币一样,交易需要收费并且必须开采才能有效。我们将交易手续费称为 Gas 费,将记账流程称之为挖矿。
所提交的交易包括下列信息:
  • recipient – 接收地址(如果为一个外部持有的帐户,交易将传输值。 如果为合约帐户,交易将执行合约代码)
  • signature – 发送者的标识符。 当通过发送者的私钥签名交易来确保发送者已授权此交易时,生成此签名。
  • value – 从发件人向收件人转移 ETH 的金额 (以 WEI 为单位,ETH 的一种面值单位)
  • data – 可包括任意数据的可选字段
  • gasLimit – 交易可以消耗的 Gas 的最大数量。 Gas 单位代表了计算步骤
  • maxPriorityFeePerGas - 作为矿工小费包含的最大 gas 数量
  • maxFeePerGas - 愿意为交易支付的最大 gas 数量(包括 baseFeePerGasmaxPriorityFeePerGas
Gas 本指在以太坊网络上执行特定操作(包括简单的代币转账)所需的计算工作量。由于用户必须为此计算支付费用,所以 Gas 又常指在以太坊成功进行交易所需的费用。
Gas = gasLimit * gasPrice
gasLimitgasPrice 决定了支付给矿工的最高交易费用。 关于 Gas 的更多信息
更多内容请见: