一张思维导图打通《精通以太坊》密钥、钱包与交易核心链路 1. 为什么我要把《精通以太坊》4到6章画成一张思维导图如果你正在啃《精通以太坊》这本书大概率会有一种感觉前三章讲背景和基础还算友好到了第4章开始信息密度突然拉满密钥、地址、钱包、交易、Gas、签名、重放保护一股脑全砸过来看完一遍好像懂了合上书又什么都串不起来。我当初也是这样书翻了两遍笔记记了一堆真到要跟别人讲清楚“一笔交易从构造到上链到底经历了什么”的时候还是卡壳。后来我换了个思路不再按书的顺序线性记笔记而是把第4章到第6章这三章的核心概念抽出来画成一张思维导图。画完那一刻我才发现这三章其实是一条完整的链路密钥决定你是谁钱包决定你怎么管这些身份交易决定你怎么用这些身份去改变链上状态。三者环环相扣单独看每一章都容易迷路放到一张图上逻辑一下就通了。这篇内容就是把我画这张思维导图的全过程拆开讲。我会告诉你这三章各自的核心骨架是什么、哪些概念是必须吃透的、哪些是容易混淆的坑、导图应该怎么分层才不糊成一团。不管你是刚接触区块链开发的新手还是已经写过一些合约但底层概念一直没理顺的开发者都能照着这篇文章自己画出一张属于自己的导图。我踩过的那些坑你大概率也会踩提前说清楚能省你不少时间。2. 第4章到第6章的整体骨架拆解2.1 三章之间的逻辑关系到底是什么很多人把这三章当成三个独立的知识块来学这是最容易走弯路的地方。我一开始也是这么干的结果就是密钥学完学钱包钱包学完学交易每一块单独看都还行但一到实际场景就懵为什么钱包里能放多个账户为什么一个助记词能恢复出所有地址为什么交易签名要用私钥而不是地址这些问题的答案恰恰藏在三章的连接处。我的理解是这三章构成了一个“身份—管理—行动”的三角结构。第4章讲的是身份的最小单元也就是密钥和地址它回答的是“链上你是谁”。第5章讲的是身份的组织方式也就是钱包它回答的是“你如何持有和管理这些身份”。第6章讲的是身份如何行动也就是交易它回答的是“你如何用身份去改变链上状态”。三者不是并列关系而是层层递进、互相依赖的关系。画导图的时候我建议把这三章放在同一张图上而不是分开画三张。因为一旦分开你就看不到它们之间的连线了。而恰恰是这些连线才是真正理解以太坊的关键。比如钱包章节里的“确定性钱包”这个概念如果你不结合第4章的密钥派生知识就理解不了为什么一个种子能生成无数个密钥再比如交易章节里的“签名”过程如果你不结合第4章的椭圆曲线签名原理就理解不了为什么签名能验证身份却不能伪造。2.2 导图分层的三个原则画思维导图最怕的就是把所有东西都堆在一层最后变成一团乱麻。我试过好几种分层方式最后总结出三个原则分享给你。第一个原则是按抽象层级分层。最外层是章节主题第二层是核心概念第三层是概念的属性或操作第四层是具体的例子或参数。比如“密钥”是第二层“私钥的生成方式”是第三层“随机数生成”是第四层。这样分层的好处是你从任何一个节点都能快速定位到它所在的抽象层级不会迷失。第二个原则是按流程顺序连线。有些概念之间不是包含关系而是先后关系比如“私钥→公钥→地址”就是一条明确的流程链。这种关系不要用树形结构表示而要用箭头连线表示。我在导图里专门用不同颜色的连线来区分“包含关系”和“流程关系”一眼就能看出哪些是结构、哪些是过程。第三个原则是给每个节点标注关键词而非完整句子。思维导图不是笔记它的价值在于快速唤起记忆而不是替代阅读。每个节点写三五个字就够了比如“椭圆曲线签名”写成“ECDSA签名”看到这几个字你脑子里就能展开一整段知识。写太多反而会让导图变得臃肿失去快速浏览的意义。2.3 我用的工具和画法工具这块其实没什么讲究纸笔、XMind、MindNode、甚至用画图软件手绘都行。我一开始用的是纸笔因为画起来快改起来也方便但缺点是画大了之后不好调整加一个节点可能要重画半张图。后来换成了电子工具主要图的是能随时拖拽调整而且可以折叠展开复习的时候能按需查看细节。我的画法是“先粗后细”。第一遍先把三章的一级和二级节点画出来不求全只求把骨架搭起来。第二遍再往每个二级节点下面补充三级和四级节点这时候会发现自己哪里理解得不够回头翻书补上。第三遍是复习的时候把已经记住的节点折叠起来只看那些还不太熟的反复几次就全记住了。提示不要试图一次画完。我第一版导图画了整整一个下午结果画完就再也没看过。后来改成每天画一点、复习一点反而记得牢。导图的价值在画的过程不在画完的结果。3. 第4章核心内容拆解密钥与地址3.1 私钥、公钥、地址这条主线怎么理第4章的核心就是一条线私钥生成公钥公钥生成地址。这条线看起来简单但里面藏着好几个容易搞混的点。我当初就犯过一个错误以为公钥和地址是一回事只是叫法不同。后来才明白地址是公钥经过哈希运算后截取的一部分两者在数学上有关联但在使用场景上完全不同。私钥的本质是一个随机数范围在1到2的256次方之间。这个范围大到什么程度呢大概相当于宇宙中所有原子的数量级。所以理论上你随便生成一个私钥撞上别人私钥的概率几乎为零。但这里有个坑随机数必须是真的随机不能用伪随机或者有规律的数。我见过有人用“123456”当私钥测试结果资产直接被转走这就是典型的随机性不足导致的悲剧。公钥是由私钥通过椭圆曲线乘法推导出来的。这里的关键是这个推导过程是单向的也就是说你知道私钥能算出公钥但知道公钥算不出私钥。这就是整个加密体系安全性的基石。椭圆曲线乘法不是普通的乘法而是一种定义在椭圆曲线上的特殊运算它的单向性来自于离散对数问题的困难性。你不用去深究数学细节但必须理解“单向”这个特性否则后面讲签名的时候你会想不通为什么签名能验证身份。地址是公钥经过Keccak-256哈希后取最后20个字节得到的。注意这里用的是Keccak-256不是标准的SHA3-256虽然它们很像但在填充方式上有区别。这个细节在实际开发中很重要如果你用错了哈希函数生成的地址就跟以太坊网络不兼容。我当初写代码的时候就踩过这个坑用Python的hashlib.sha3_256生成地址结果怎么都对不上后来换成pysha3才搞定。3.2 助记词和种子为什么它能恢复所有密钥助记词是第4章里我觉得最巧妙的设计。它的核心思想是用一个人类可读的单词序列来代表一个随机种子然后从这个种子推导出所有密钥。这样做的好处是备份方便你只需要记住12个或24个单词就能恢复整个钱包的所有账户。助记词的标准叫BIP-39它定义了一个2048个单词的词库每个单词对应11位二进制数。12个单词就是132位其中128位是随机熵4位是校验和。24个单词则是264位256位随机熵加8位校验和。校验和的作用是防止你输错单词如果输入的助记词校验和不匹配钱包就会提示你输入有误。从助记词到种子用的是PBKDF2函数迭代次数是2048次盐值可以自定义默认是“mnemonic”加一个可选的密码短语。这个密码短语是个很有意思的设计它相当于给助记词加了一层保护即使别人拿到了你的助记词不知道密码短语也恢复不出正确的种子。但反过来如果你自己忘了密码短语那助记词也救不了你。我建议如果你要用密码短语一定要单独记在一个安全的地方不要跟助记词放在一起。从种子到具体密钥用的是BIP-32定义的层级确定性派生。简单说就是种子生成主密钥主密钥派生子密钥子密钥再派生子密钥形成一棵树。每个节点都有一个派生路径比如“m/44/60/0/0/0”就是以太坊常用的路径。这个路径里的每个数字都有含义44表示BIP-44标准60表示以太坊的币种编号后面的0、0、0分别表示账户、外部链、地址索引。理解这个路径结构你就能明白为什么同一个助记词在不同钱包里能生成相同的地址也能明白为什么改一个数字就能生成完全不同的地址。3.3 密钥存储的几种方式及各自的风险私钥生成出来之后怎么存是个大问题。我见过太多人因为存储方式不当导致资产丢失所以这块我想多说几句。最原始的方式是明文存储就是把私钥直接写在文件里或者数据库里。这种方式的风险不用我多说一旦文件泄露或者数据库被拖私钥就没了。但在某些场景下比如本地开发测试明文存储也不是不能接受关键是你要清楚它的风险边界不要把它用在生产环境。稍微好一点的方式是加密存储用密码对私钥进行对称加密比如用AES或者scrypt。这样即使文件泄露攻击者还需要破解密码。但这里的关键是密码的强度如果你用“123456”当密码那跟明文存储没什么区别。我建议密码至少16位包含大小写字母、数字和特殊符号而且不要跟其他服务的密码重复。更安全的方式是硬件钱包私钥永远不离开设备签名操作在设备内部完成。这种方式的安全性最高但成本也最高而且使用起来没有软件钱包方便。我的建议是大额资产用硬件钱包小额日常用的可以放软件钱包但软件钱包的助记词一定要离线备份。还有一种方式是托管钱包私钥由第三方保管。这种方式最方便但你实际上放弃了对自己资产的控制权。我不推荐这种方式除非你完全信任那个第三方而且能接受它跑路的风险。注意不管你用哪种方式存储私钥都不要截图、不要发聊天工具、不要存云盘。我见过有人把私钥截图存在手机相册里结果手机丢了资产也跟着丢了。私钥一旦泄露没有任何办法可以挽回。4. 第5章核心内容拆解钱包的运作机制4.1 钱包到底“装”的是什么很多人以为钱包里装的是币这是个常见的误解。钱包里装的其实是密钥币始终在链上钱包只是帮你管理访问这些币的凭证。理解这一点很重要因为它意味着“转账”并不是把币从一个钱包移到另一个钱包而是用私钥签名一笔交易把链上某个地址的余额转到另一个地址。钱包的核心功能有三个生成密钥、存储密钥、签名交易。生成密钥用的是第4章讲的那些算法存储密钥用的是第3章讲的那些方式签名交易用的是第6章要讲的流程。所以你看钱包其实是连接第4章和第6章的桥梁它把密钥管理和交易签名串起来了。钱包还负责跟节点通信查询余额、估算Gas、广播交易。这部分功能通常是通过JSON-RPC接口实现的钱包会连接到一个以太坊节点把用户的请求转发给节点再把节点的响应展示给用户。有些钱包自己运行节点有些钱包用第三方节点服务各有优劣。自己运行节点更安全但更麻烦用第三方节点更方便但需要信任第三方。4.2 确定性钱包的派生路径详解确定性钱包是第5章的重点也是我觉得最值得花时间搞懂的部分。它的核心思想是所有的密钥都从一个种子派生出来只要备份了种子就备份了所有密钥。这个设计解决了传统钱包的一个大问题每生成一个新地址就要备份一次备份次数多了容易丢三落四。派生路径是确定性钱包的关键概念。以以太坊常用的“m/44/60/0/0/0”为例我来逐段解释一下。最前面的“m”表示主密钥这是整棵树的根。“44”表示使用BIP-44标准这个标准定义了多币种钱包的层级结构。“60”是以太坊的币种编号这个编号是注册过的比特币是0以太坊是60。“0”表示第一个账户如果你有多个账户这里就是0、1、2这样递增。后面的“0”表示外部链用于接收地址“1”表示内部链用于找零地址。最后的“0”是地址索引同一个账户下可以有多个地址。这里有个容易搞混的地方带撇号的数字和不带撇号的数字有什么区别带撇号表示硬化派生不带撇号表示普通派生。硬化派生的意思是从父公钥和父链码无法推导出子公钥必须要有父私钥才行。普通派生则可以从父公钥推导出子公钥。这个区别在安全性上有意义如果你只暴露了扩展公钥普通派生下的子公钥可能被推导出来但硬化派生下的不会。所以一般建议在账户层级用硬化派生在地址层级用普通派生。4.3 扩展密钥与钱包的安全边界扩展密钥是确定性钱包里的一个重要概念它由密钥和链码两部分组成。扩展私钥可以派生出所有子私钥扩展公钥可以派生出所有子公钥但不能派生出子私钥。这个特性让扩展公钥有了一个很有用的应用场景你可以把扩展公钥放在服务器上让它生成接收地址但服务器上没有私钥即使被攻破也转不走资产。但这里有个安全边界需要注意扩展公钥加上任何一个子私钥就能推导出扩展私钥。所以如果你用了扩展公钥方案千万不要把任何一个子私钥暴露出去。我见过有人为了调试方便把某个地址的私钥导出来用结果整个钱包的扩展私钥都能被推导出来所有地址的资产都处于风险之中。钱包的安全边界还体现在密码短语上。前面提到过密码短语相当于给助记词加了一层保护但它也带来了一个新的风险如果你忘了密码短语助记词也恢复不了钱包。而且密码短语没有校验机制你输错一个字母钱包不会提示你错误而是直接生成一个全新的空钱包。所以如果你要用密码短语一定要确保自己记得住或者单独备份。5. 第6章核心内容拆解交易的完整生命周期5.1 一笔交易从构造到上链的全过程第6章讲的是交易这是三章里最复杂也最实用的一章。我把它拆成五个阶段构造、签名、广播、打包、确认。每个阶段都有很多细节我逐个来说。构造阶段是确定这笔交易要做什么。一笔交易包含几个核心字段nonce、gasPrice、gasLimit、to、value、data。nonce是发送方已经发送的交易数量用来防止重放攻击。gasPrice是你愿意为每个Gas支付的价格gasLimit是你愿意支付的最大Gas数量。to是接收方地址如果是合约创建这个字段为空。value是转账金额data是附加数据调用合约时用来指定调用哪个函数、传什么参数。签名阶段是用私钥对交易进行签名。签名的过程是先把交易字段用RLP编码然后对编码后的数据做Keccak-256哈希再用私钥对哈希值进行椭圆曲线签名。签名结果包含三个值v、r、s。v表示恢复标识r和s是签名的两个部分。这三个值加上原来的交易字段就构成了签名后的交易。广播阶段是把签名后的交易发送到网络。钱包通常会把交易发送给连接的节点节点再转发给其他节点最终传播到整个网络。这里有个细节交易广播出去之后你并不能保证它一定会被打包因为矿工可以选择打包哪些交易。如果Gas价格设得太低交易可能会长时间停留在待打包池里。打包阶段是矿工把交易包含进区块。矿工会从待打包池里挑选Gas价格高的交易打包进自己挖出的区块。打包之后交易状态从“待处理”变成“已打包”但这时候还不能算最终确认因为区块可能被重组。确认阶段是等待足够多的区块确认。一般来说等6个区块确认之后交易就可以认为是最终确定了。等待的区块数越多被重组回去的概率越低。对于大额交易建议等12个甚至更多区块确认。5.2 Gas机制为什么你的交易会卡住Gas是以太坊里最让人头疼的概念之一但也是最必须搞懂的概念。简单说Gas是衡量计算工作量的单位每笔交易都要消耗GasGas的价格由市场决定。你支付的手续费等于Gas用量乘以Gas价格。Gas用量取决于交易做了什么。简单的转账只需要21000 Gas这是固定的。调用合约则取决于合约代码的复杂度可能几万也可能几百万。如果Gas用量超过了gasLimit交易会失败但已经消耗的Gas不会退还。所以设置gasLimit的时候要留一些余量但也不能设得太高因为gasLimit乘以gasPrice就是你要预付的最大金额设太高会冻结你太多余额。Gas价格是动态变化的取决于网络的拥堵程度。网络空闲的时候Gas价格可能只有几Gwei网络拥堵的时候可能涨到几百Gwei。如果你设的Gas价格太低交易就会卡在待打包池里迟迟不被矿工打包。这时候你有两个选择要么等网络空闲下来要么用同样的nonce发一笔Gas价格更高的交易来覆盖它。EIP-1559之后Gas机制有了变化引入了基础费用和小费的概念。基础费用由网络自动计算会被销毁小费是给矿工的激励。这种机制让Gas价格更可预测但理解起来也更复杂。我的建议是如果你只是做简单转账用钱包的默认设置就行如果你要调优Gas成本那就需要花时间研究一下当前的网络状况和EIP-1559的机制。5.3 签名与重放保护交易安全的核心签名是交易安全的核心它保证了只有私钥持有者才能发起交易。签名的过程前面简单提过这里我再展开说一下。椭圆曲线签名的数学原理是用私钥对消息哈希进行签名生成r和s两个值验证者用公钥、消息哈希和签名值进行验证如果验证通过说明签名确实是由对应的私钥生成的。这个过程的关键是没有私钥就无法生成有效的签名而且签名跟消息是绑定的改一个字节签名就会失效。重放保护是另一个重要的安全机制。在没有重放保护的情况下一笔在主网上的交易可以被复制到测试网或者其他分叉链上重新执行造成意外的资产转移。EIP-155引入了链ID的概念签名的时候把链ID也包含进去这样一笔交易就只能在特定的链上执行换到别的链上签名就失效了。v值的含义也跟重放保护有关。在EIP-155之前v只能是27或28EIP-155之后v变成了链ID乘以2加35或36。这个变化让签名跟链ID绑定实现了重放保护。如果你在代码里手动构造交易一定要注意v值的计算方式算错了签名就无效。提示如果你在测试网上测试交易发现签名总是验证失败先检查一下链ID设对了没有。我当初在测试网上调试的时候就是因为链ID设成了主网的1怎么都签不过去折腾了半天才发现问题。6. 把三章画成一张导图的实操步骤6.1 导图结构设计与节点规划现在到了动手画导图的时候。我的建议是先用一张白纸或者空白画布把三章的一级节点列出来。一级节点就是三个密钥与地址、钱包、交易。这三个节点横向排列中间留出足够的空间因为后面要往下面挂很多子节点。然后给每个一级节点挂二级节点。密钥与地址下面挂四个私钥、公钥、地址、助记词与种子。钱包下面挂四个钱包类型、确定性钱包、派生路径、扩展密钥。交易下面挂五个交易结构、签名、Gas机制、广播与打包、重放保护。这些二级节点就是导图的骨架先把它们摆好再往下面填细节。三级节点是二级节点的展开。比如私钥下面挂生成方式、随机性要求、存储方式。公钥下面挂椭圆曲线乘法、单向性、压缩与非压缩格式。地址下面挂Keccak-256哈希、校验和、地址格式。助记词下面挂BIP-39标准、种子生成、密码短语。这样一层层展开直到你觉得够用为止。四级节点是具体的例子或参数。比如随机性要求下面可以写“256位随机数”Keccak-256哈希下面可以写“取后20字节”BIP-39标准下面可以写“2048词库、12/24单词”。这些具体数字能帮你快速回忆细节但不要写太多否则导图会变得很臃肿。6.2 连线与标注的技巧节点摆好之后接下来是连线。连线分两种一种是层级连线表示包含关系用直线就行另一种是流程连线表示先后关系用箭头表示。比如私钥到公钥到地址就是流程连线用箭头串起来钱包到确定性钱包到派生路径就是层级连线用直线连接。我还会用不同颜色来区分不同的知识块。密钥相关的用蓝色钱包相关的用绿色交易相关的用橙色。这样一眼看过去就知道哪个节点属于哪个知识块。如果你用的是电子工具还可以给节点加图标或者标签进一步区分类型。标注方面我会在关键节点旁边加一些小注释。比如在“硬化派生”旁边写“带撇号”在“EIP-1559”旁边写“基础费用小费”在“v值”旁边写“链ID*235/36”。这些注释不用太长几个字就行但能帮你快速回忆起关键细节。6.3 复习与迭代让导图真正发挥作用导图画完不是终点而是起点。我的做法是每隔几天就拿出来复习一遍复习的时候先不看细节只看一级和二级节点试着在脑子里把下面的内容展开。如果某个节点展开不出来就翻书补上然后在导图上做个标记下次重点复习。复习的时候我还会做一件事把导图上的节点跟实际代码对应起来。比如看到“私钥生成”就去翻一下自己写的代码看看用的是哪个库、哪个函数看到“签名”就去翻一下交易签名的代码看看v、r、s是怎么算出来的。这样把理论和实践对应起来记忆会深刻很多。导图也需要迭代。随着理解的深入你会发现有些节点可以合并有些节点需要拆分有些连线需要调整。我第一版导图跟第三版导图差别很大但每一版都比上一版更清晰。所以不要怕改导图就是越改越好的。7. 常见问题与避坑指南7.1 密钥与地址部分的常见坑第一个坑是混淆公钥和地址。前面说过地址是公钥哈希后截取的两者不能混用。我见过有人在代码里把地址当公钥传给签名函数结果怎么都签不对。记住签名用私钥验证用公钥转账用地址。第二个坑是助记词顺序搞错。助记词是有顺序的顺序错了校验和就不对钱包会提示错误。但有些钱包不校验顺序只是生成一个不同的种子结果就是你恢复出一个空钱包。所以输入助记词的时候一定要按顺序来不要觉得单词对了就行。第三个坑是密码短语丢失。前面说过密码短语没有校验机制忘了就恢复不了。我建议如果你要用密码短语把它跟助记词分开存放但都要确保自己能找到。不要存在脑子里人的记忆是靠不住的。第四个坑是随机数生成不安全。有些编程语言的随机数函数默认是不安全的比如Python的random模块它生成的是伪随机数可以被预测。生成私钥一定要用密码学安全的随机数生成器比如Python的secrets模块或者os.urandom。7.2 钱包与派生路径部分的常见坑第一个坑是派生路径不匹配。同一个助记词用不同的派生路径会生成不同的地址。如果你在一个钱包里生成的地址在另一个钱包里恢复不出来大概率是派生路径不一样。以太坊常用的路径是“m/44/60/0/0/0”但有些钱包用“m/44/60/0/0”或者“m/44/60/0”恢复的时候要选对路径。第二个坑是扩展公钥泄露。前面说过扩展公钥加上任何一个子私钥就能推导出扩展私钥。所以如果你用了扩展公钥方案千万不要把任何子私钥暴露出去。我建议扩展公钥只用来生成接收地址不要用来做任何需要私钥的操作。第三个坑是钱包文件损坏。软件钱包通常会把加密后的密钥存在文件里如果文件损坏或者丢失又没有助记词备份资产就找不回来了。所以一定要备份助记词而且要备份在多个安全的地方。7.3 交易与Gas部分的常见坑第一个坑是nonce管理混乱。nonce是递增的如果你并发发送多笔交易nonce可能会冲突。我建议串行发送交易等前一笔确认了再发下一笔。如果确实需要并发那就手动管理nonce确保每笔交易的nonce都是唯一的。第二个坑是Gas价格设得太低。网络拥堵的时候低Gas价格的交易会卡很久。我建议参考当前网络的Gas价格设一个稍高于平均值的价格这样能更快被打包。如果交易已经卡住了可以用同样的nonce发一笔高Gas价格的交易来覆盖它。第三个坑是gasLimit设得太低。如果gasLimit低于实际消耗的Gas交易会失败但已经消耗的Gas不会退还。我建议gasLimit设得比预估用量高20%到30%留一些余量。但也不要设太高因为gasLimit乘以gasPrice会冻结你的余额。第四个坑是链ID设错。前面说过链ID是重放保护的一部分设错了签名就无效。主网的链ID是1测试网各有各的链ID。如果你在测试网上测试一定要确认链ID设对了。7.4 常见问题速查表问题现象可能原因排查方法签名验证失败链ID设错、v值计算错误检查链ID和v值计算公式恢复出的地址跟预期不符派生路径不匹配、助记词顺序错误检查派生路径和助记词顺序交易长时间未打包Gas价格太低、nonce冲突提高Gas价格或用相同nonce覆盖交易失败但扣了GasgasLimit低于实际用量提高gasLimit留20%余量地址格式不合法校验和错误、哈希函数用错检查Keccak-256和校验和计算钱包恢复后余额为零密码短语错误、派生路径错误检查密码短语和派生路径8. 我画完这张导图之后的几点体会画完这张导图之后我最大的感受是以太坊的底层设计其实非常优雅只是被太多细节掩盖了。密钥、钱包、交易这三块单独看每一块都有很多琐碎的知识点但放到一起看你会发现它们其实是在解决同一个问题的不同层面如何安全地证明身份、如何方便地管理身份、如何可靠地使用身份。另一个感受是画导图的过程比导图本身更有价值。我在画的过程中被迫去梳理概念之间的关系被迫去回答“这个节点为什么挂在这里而不是那里”这种主动思考比被动阅读有效得多。我建议你不要直接抄我的导图而是自己动手画一遍哪怕画得没我好收获也会比我直接给你一张图大得多。最后分享一个小技巧如果你觉得三章一起画太复杂可以先分开画三张每张只画一章的内容画完之后再把三张拼到一起用连线把相关的节点连起来。这样既降低了单次画图的难度又能保证最后看到全貌。我第一遍就是这么干的效果不错。