钱包:区块链的入口

Ver 2022.1

周朝晖

开源教材

🐦 @zhous98 | 👋 DAism.io

全课程幻灯目录

1️⃣ 比特币:区块链 1.0

2️⃣ 钱包:区块链的入口

3️⃣ 以太坊:区块链 2.0

4️⃣ 通证标准的进化与应用

5️⃣ 去中心化交易与支付

6️⃣ 以太坊改进提案

7️⃣ 区块链发展:激励式开源协作

初学者每个幻灯的自学时间预计不低于30分钟

💰 钱包

包打天下:区块链钱包是让人们全权管理自己的账户和区块链资产(存储和使用),并且自由部署和使用去中心化应用的工具软件。

钱包和账户非绑定关系,一个账户可以在多种钱包里使用。同时你可以在一个钱包里,拥有很多个账户。

还有:没有人能够冻结你的账号,撤销你的转账,也没有消费限额……

⛓️ 私钥、公钥、地址和交易

我们在上节内容已经了解过后三者的关系:Unknown deck

重复下,区块链是匿名的:
1️⃣ 这个隐私模型是中本聪用加密算法做到的,你无法破解。
2️⃣ 哪个地址是隔壁老王的,你怎么能知道?
3️⃣ 某人有多少钱包地址,你怎么能知道?
4️⃣ 哪些地址的私钥是多个人共同拥有的,你知道?
5️⃣ 中本聪对比特币交易加密的设计,有效避免了私钥的泄露。

📝 助记词

  • Mnemonic Phrase,Seed Phrase,Seed
  • 就是私钥的变体。主要技术标准:BIP-39。
  • BIP39助记词有12、15、18、24个等区分,但原理都类似。
    早期钱包助记词为12个单词,以常用的2048个单词里进行组合。
    助记词单词越多安全性越高,这样也就导致钱包并不互相兼容。
  • 助记词可推算出唯一的私钥,但私钥不可推算出助记词。
  • 助记词的作用是便于保管!
  • 获得账户时,多数钱包给你生成助记词,少数还是直接给你私钥。
  • 🦺 助记词的安全性

    早期的HD 钱包助记词是12个单词,假如我们从2048 个单词里组合,根据公式“n!/( n - r )!”我们可以计算出随机生成的助记词所有可能性:

    2048!/(2048-12)! = 5.2715379713014884760003093175282 e+39 。

    地球上的沙子数量在大约是1 后面 18 个零。

    如果你每秒生成一百万个助记词,那么大约需要 1.6715937e+26 年遍历以上所有助记词!

    🆘 谨防损失

  • 助记词和私钥遗失。
  • 未备份助记词和私钥。
  • 备份遗失或损坏:如手机或电脑损坏,或者遭遇火灾等天灾。
  • 助记词或私钥暴露。
  • 云存储、软件传递、拷贝、木马病毒潜入、远程入侵、手机或电脑被回收、摄像头拍摄。
  • 手机或电脑被盗。
  • 假钱包
    层出不穷!
  • 伪劣项目窃取私钥。
  • 对不良智能合约(dApp)误授权。
  • 亲朋好友搭档监守自盗。
  • 意外身亡。
  • 🦮 助记词保管方法

  • 用纸或专业防火设备抄写
    用纸抄写要注意墨和纸张质量。抄写有一定的错误概率,即使复抄。复核很重要。最重要是单词的前四位正确。
    专业防火设备抄写错误概率低。复核仍然重要。
  • 防火保险柜
    天灾:如失火。
  • 各种防失窃
    上防监控中防闺蜜下防老公
  • 🪙 币与通证(Token)

    我们平时所说的币,专业名称就叫通证。

    Unknown deck

    🏦 以太坊账户

    ℹ️ 以太坊简介

    在以太坊网络中,有一台规范化计算机(称为以太坊虚拟机,或 EVM),其状态得到以太坊网络中所有人的一致同意。 每个参与以太坊网络的人(每个以太坊节点)都会保存一份这台计算机的状态。 此外,任何参与者都可以广播请求这台计算机进行任意计算。 每当广播这样的请求网络时,网络上以太坊节点就会验证、确认并进行(“执行”)计算。 这个命令会导致 EVM 的状态变化,并且在整个网络中传播。

    计算请求被称为交易请求;所有交易的记录以及 EVM 的当前状态都存储在区块链中,而区块链又由所有节点存储并达成一致。以太坊实际有 N 个完全一致的副本。

    加密机制确保了一旦交易被验证为有效并添加到区块链中后,之后就不会被篡改。 同样的机制还确保所有交易都以适当的“权限”签名和执行(除了 Alice 本人,任何人都不能从 Alice 的账户发送数字资产)。

    📖 账户概念

    以太坊的账户模型则跟我们通常所理解的银行账户概念是一致的。

    一个以太坊帐户是一个具有 Ether(ETH)余额的实体,它在钱包里显现为一对私钥(或助记词)及其地址(address),帐户可以在以太坊上发送交易。 帐户可以由用户控制,也可以作为智能合约部署。

    🚀 账户抽象化 Account Abstraction, AA

    以太坊中有两种账户:

  • 外部账户(Externally Owned Account, EOA):
    个人常用的存储通证的账户。该类账户被”公钥-私钥“对控制。
  • 合约账户(Contract Account, CA):
    只受智能合约(代码)控制的账户。没有私钥!
  • 外部账户的地址由公钥生成,合约账户的地址是在创建该合约时生成的。
  • 以太坊账户革命:账户抽象化(Account Abstraction, AA)
    目前,只有外部账户(EOA)是交易的触发器,一笔交易无论后面有多少合约调用,一开始都必须由一个 EOA 发起并且支付足够的 gas 才可以进行。
    账户抽象化的目的,就是让合约账户也可以和外部账户一样独立支付交易费,发起并完成交易(发起请求并完成计算)。
    账户抽象化实现后,因为合约帐户将能自主触发可执行多种操作的代码,譬如创建新合约,那么结合 AI ,对其应用我们就有了极大的想象空间。这一技术创新将给人类社会带来巨大的变化!
    AA 相关提案:EIP-2938EIP-3074ERC-4337EIP-5003
  • ⛰️ 技术细节

    以太坊账户维护着四个状态(数据):

  • nonce:外部账户为交易次数,合约账户为创建的合约序号。如果你想取消一笔已广播但尚未完成的交易,发送0个ETH到合约地址,填写该笔交易的nonce,即可。
  • balance:该地址的以太币余额。
  • storageRoot:账户存储内容组成的默克尔树根之哈希值。
  • codeHash:账户EVM(虚拟机)代码的哈希值。外部账户为空字符串的哈希值,合约账户为合约代码的哈希值。
  • 📍 交易及gas

    📦 交易(Transaction)

    交易是由帐户发出的,带密码学签名的指令。

    帐户发起交易即可更新以太坊网络的状态(数据)。

    最简单的交易是将 ETH 从一个账户转到另一个帐户。

    例如,如果 Bob 发送 Alice 1 ETH,则 Bob 的帐户必须减少 1 ETH,而 Alice 的账户必须增加 1 ETH。 此项操作发生在交易中,会变更状态。

    改变 EVM 状态的交易需要广播到整个网络。 任何节点都可以在 EVM 上广播交易请求;此后,矿工将执行交易并将由此产生的状态变化传播到网络的其他部分——矿工的工作奖励包括系统奖励和发起交易请求的用户支付的交易手续费。

    所以交易需要收费并且必须开采才能有效。

    其它交易示例:

  • 将一些智能合约代码发布到以太坊虚拟机状态中(将合约部署到以太坊主网)。
  • 使用参数 Y 执行 EVM 中地址 X 的智能合约代码(与合约交互)。
  • 💸 Gas

  • Gas 本指在以太坊网络上执行特定操作(包括简单的代币转账)所需的计算工作量。
  • 由于用户必须为此计算支付费用,所以 Gas 又常指成功进行交易发起请求的用户所需支付的费用,即交易手续费。
  • 以太坊交易手续费,采用了竞价模式。
  • Gas算法:
    Gas = gasLimit * gasPrice
    交易手续费 = 算力上限 X 算力单价
  • 🧑‍💻 交易的技术细节

    所提交的交易包括下列信息:

  • recipient – 接收地址(如果为一个外部持有的帐户,交易将传输值。 如果为合约帐户,交易将执行合约代码)
  • signature – 发送者的标识符。 当通过发送者的私钥签名交易来确保发送者已授权此交易时,生成此签名。
  • value – 从发件人向收件人转移 ETH 的金额 (以 WEI 为单位,ETH 的一种面值单位)
  • data – 可包括任意数据的可选字段
  • gasLimit – 交易可以消耗的 Gas 的最大数量。 Gas 单位代表了计算步骤
  • maxPriorityFeePerGas - 作为矿工小费包含的最大 gas 数量
  • maxFeePerGas - 愿意为交易支付的最大 gas 数量(包括 baseFeePerGasmaxPriorityFeePerGas
  • ‼️ 双重支付(双花)

  • 双重支付又被称为“双花”,顾名思义就是同一笔钱(区块链资产)被重复支付两次,也就是将同一个地址上的通证同时支付给两个不同的接收地址。
  • 如果双重支付是有意而为之,那么就是双花攻击。
  • ✍️ 签名与多重签名

    🖊️ 签名

    用户使用私钥签署其所要广播的消息,即为签名(Signature) 。

    Sig = FuncSig(FuncHash(m), dA)

  • Sig 是签名
  • dA 是私钥
  • m 是交易(或其部分)
  • FuncHash 是散列函数
  • FuncSig 是签名算法
  • 用私钥加密信息(实际上是消息的哈希值)产生无法被伪造的一段数字串。用公钥验证数字串,如果验证通过证明这个信息确实是该私钥发出的且未被篡改。

    👥 多重签名

    比特币的多重签名(Multi Signature,又被称为M-N多签名)指的是需要总共N个私钥中的M个(M≤N)共同签署一笔比特币转账,这笔交易才可能发生。

    它实际收集的是这N个私钥对应的公钥,签名时仍然是验证这些公钥是否是由有效的私钥公布的。

    以太坊的多重签名虽然机制和比特币的多重签名相近,但它是通过智能合约来部署,其技术手段通常有两种:

  • 用你的私钥对相应的花费(金额、目标地址等等)进行签名,并给出签名结果;
  • 用你的私钥发送一笔以太坊交易,去调用某个特定接口,并给予特定参数。
  • 基于智能合约管理,是否需要人工或者什么情况下需要人工进行多重签名,完全由智能合约细节决定。可编程,应用场景非常灵活。譬如,可通过智能合约设置每日提款限额,超过每日提款限额时才需要人工进行多重签名。又譬如,以太坊多重签名可应用于所有采用ERC-20通证标准的链上资产的管理。

    结合前面提到的账户抽象化,可以想见区块链和 AI 结合之后,整个世界会发生多宏大的变化!

    门限签名

    门限签名(TSS,Threshold Signature Scheme是一种分布式多方签名协议,包含分布式密钥生成、签名,以及在不改变公钥的情况下更换私钥碎片的 re-sharing 等算法。

    一个 m-n 的 tss 指的是一个公钥对应了 n 个私钥碎片,其中 m 个碎片的联合签名可以被公钥验签成功。

    不难发现这个逻辑类似于多签(multi-sig),他们的区别主要在私钥的使用方式。

    举例来说,2-2 的多签签名是一个门上挂了 2 把锁,必须两个钥匙同时使用才能开门;2-2 的 tss 是一个门上挂了 1 把锁,但是钥匙由两个片段组成的,合起来用才能打开门。

    门限签名的创新来自比特币时代的窘况,因为那时候没有智能合约可用,只能在一个私钥上找安全方案。私钥碎片很显然要比助记词更难以保管,我不看好该技术的未来。

    🏦 钱包的特色与类型

    🔭 特色

  • 区块链钱包,更像一个私有银行。因为一个以太坊钱包里,可以有很多个(没有限制)地址或账户。里面的每个地址或账户,本身就很像一个银行帐号。
  • 并且没有人能够冻结你的账号,撤销你的转账,也没有消费限额……无论对方在地球的哪个角落,ETH转账的确认时间甚至只需要9秒左右。
  • 未来可能会有数千万种通证:每条公链,一般也都发行一种自己的代币。每个区块链dapp都可以发行一种具有货币属性的专属通证(token)。
  • 🫧 根据载体分类

    分类

  • 计算机钱包——安全风险高,不够方便
  • 手机钱包——方便、安全。
  • 浏览器钱包——安全风险较高,比较方便。
  • 硬件钱包——很不方便,安全性存在争议。
  • 纸钱包——早期用于激励(礼品)。
  • 脑钱包——几乎被淘汰。
  • 示范

    注意事项

  • 慎用专用硬件钱包
    硬件钱包品牌:Ledger Nano S、Trezor。
    牺牲了便利性——大家通常会把硬件钱包放在家里,结果常常发生的事是人在外,要投资一个项目,或者需要转账,突然发现做不了!
    没有绝对的安全——Intel连电脑CPU里面都敢放后门,这世界哪里有绝对的安全。有的硬件钱包客户端和服务器端代码都没有开源,安全靠信仰?
    MEW(MyEtherWallet)是一个有意思的解决方案。
  • 勿使用需要注册的钱包
    注册意味着钱包开发者,使用中心化服务器存储了你的个人资料,譬如你的密码和你的ETH地址。一旦监守自盗,或者被黑客盗取,你的区块链资产情况就会完全暴露。
  • 多链钱包
    均由中心化服务器提供全节点数据服务。
  • 勿使用非开源钱包
    Exodus Wallet是一个业界比较知名的钱包,但代码没有开源。
  • 🧶 根据数据存储方式分类

  • 全节点钱包(Full Nodes Wallet):指包含了全部历史交易数据的钱包。
    多被矿工和钱包所使用。其优点是安全可靠。缺点是要下载或更新全部数据。这在吾国会变成一个越来越大的问题。
  • 轻钱包(Light Wallet):通过 “简易支付验证”(Simplified Payment Verification ,SPV)的方式来完成交易验证。其节点即“SPV节点”又叫“轻量级节点”,相对应的钱包就是轻钱包。
    SPV节点只需下载区块头信息,而不下载每个区块中的所有交易信息,由此产生的不含交易信息的区块链,比完整区块链小了很多。“简易支付验证”只是“支付验证”而非“交易验证”,所以SPV节点可以证实某个交易的存在,但不能验证某个交易不存在,这个缺陷可被针对SPV节点的拒绝服务攻击或双重支付攻击所利用。为了防御这些攻击,SPV节点
  • 🏴 找零地址与分层确定性钱包

    💵 比特币找零地址

    比特币没有账户概念,它的交易方式类比我们与使用纸币一致:将全部数量的比特币从某个或某几个地址发送出去,其中需要支付的数量被打到收款方的地址上,并将剩余的比特币打回到自己的一个新地址亦即“找零地址”上:

    这意味着普通钱包要不停更换私钥

    🌟 分层确定性钱包

    分层确定性钱包(Hierarchical Deterministic Wallet, HD Wallet,HD钱包)就是为了应对比特币钱包的风险,采用加密算法设计出来的。常常也被称为多层确定性钱包,也曾被称为双层确定性钱包

    多层确定性钱包让用户无需每次转账后都备份。它的种子密码(Seed)可以生成很多私钥:它的私钥是对种子密码进行单向哈希运算生成的,在分层确定性钱包中,只要有这个种子密码,就可以按顺序找回所有私钥,因此备份了种子密码就相当于备份了您的所有资产,所以它非常方便使用。

    分层确定性是2012年2月11日Pieter Wuille通过 BIP32 提出。直到2016年6月15日才被合并到Bitcoin Core,目前几乎所有的钱包服务商都整合了该协议。

    BIP39 用算法将种子密码转为助记词 (Mnemonic),由12~18个英文单词组成。

    BIP44 在 BIP43 和 BIP32 的基础上增加多币种支持。

    🧑‍💻 以太坊钱包多采用 EIP85 技术标准

    受BIP44的启发,以太坊的 EIP85 提案规划其HD钱包的路径为 :

    m/44'/60'/a'/0/n

  • a——表示帐号;n——第 n 个地址
  • 60 在BIP44提案对应的就是ETH。
  • 以太坊各钱包的具体实现如下:

  • m/44'/60'/0’/0/n——imToken(可自定义路径),MetaMask,Jaxx,MyEtherWallet,TREZOR,Exodus
  • m/44'/60'/x'/0/0——KeepKey,MetaMask
  • m/44'/60'/0'/x——Electrum,Ledger Chrome App,
  • m/44'/coin_type'/account'/0——Coinomi
  • 🐕‍🦺 钱包的账户备份策略

  • JSON文件
    这是你的未加密JSON格式的私钥文件。这意味着你发送交易时不需要密码,也意味着拿到这个JSON文件的任何人都可以无需密码进入你的钱包,动用你以太系的所有资产。
  • 私钥(未加密)
    1️⃣ 这是未加密的文本格式私钥文件,用它发送交易也不需要密码。
    2️⃣ 如果某个人拿到了你的未加密的私钥,也就有了你资产的百分百的控制权。
  • 助记词(未加密)
  • 钱包通常可以让用户设置一个使用密码。这个密码只与你正在使用的钱包有关,与你的账户无关!

    📝 钱包试用

  • 浏览器钱包Metamask
  • 手机钱包Trust Wallet
  • 手机钱包imToken国际版
  • 手机钱包TokenPocket
  • 纸钱包Ethaddress
  • 智能钱包Argent(https://www.argent.xyz/)
  • 🔊 叨叨

    我们对于世界的认知,现在因为互联网的发达,不仅是效率更高,而且得到质的飞跃!问题在于:区块链是一个崭新的高科技领域,各种声音都有,目前是外行声音更大且十分嘈杂!

    千万不要把区块链当作物理化学来学,需要我们多一点自己的判断!

    编辑这个Deck的时候,看了一个外行人的视频,里面的区块链内容已经遗忘。对于VR我冒出以下想法:

    手机以2D的方式延伸我们的双手和头脑,让相隔十万八千里的地球人可以用媒体进行实时交流。

    VR以3D的方式延伸我们的整个身体,让我们可以完全融入一个虚拟世界。你说这不是革命,你是一定要闻到浓浓的钱的味道才算革命吗?

    但区块链确实有浓浓的钱的味道……