自学笔记 | BTC&ETH入门级问题

171 阅读10分钟

比特币是怎么达成共识的?

比特币希望在去中心化的世界中实现共识,采用的是特殊的“投票”机制——PoW,普通的投票可能会带来女巫攻击,比特币中节点获取发布区块的权利是通过算力“投票”决定的,通过解决Puzzle Friendly的问题,这种比拼计算资源和运气的方案相对公平。

下面是具体实现过程:

  1. 比特币账户在转账过程中产生交易并广播到网络中,等待矿工打包发布,平均每十分钟出一个块;
  2. 争取记账权力的矿工将一定数量的交易打包到block body中,加上block header中必要的参数,通过尝试不同nonce值(有时为了扩展空间也会尝试调整coinbase的前8个字节的值)来找到符合难度阈值的随机数(这个过程叫做“挖矿”),第一个解决问题的矿工能够获取记账权并在区块链中发布自己的块;
  3. 其他矿工监听到新块的发布就通过一次哈希验证区块的合法性,并检查交易中每一笔交易是否有转账人的签名,UTXO结构中是否有双花问题;
  4. 由于网络时延或恶意攻击使主链发生分叉时,所有节点都遵循最长合法链原则,最长的链是最有权威的,也集中了社区中绝大多数的算力;
  5. 随着越来越多区块被添加到发布的区块后面,这个区块被篡改的可能性也越来越小,这个区块的交易也就达成了共识。

比特币系统为什么没有办法做智能合约?

  1. 设计理念:比特币在最初设计理念上就不适合做智能合约,它更专注于作为数字货币的安全传输和存储,相比智能合约的复杂性和高吞吐量,比特币更为保守;
  2. 脚本语言:比特币系统使用的脚本语言相对简单,不支持复杂的逻辑和状态操作,它被设计为有限的脚本语言,以减少潜在的安全问题;Solidity 是一种高级、图灵完备的脚本语言,支持更复杂的逻辑和状态操作,使得以太坊的智能合约可以灵活实现各种功能,但也带来了安全和漏洞的风险;
  3. 状态管理:比特币中的交易是通过维护UTXO数据结构来表示交易的输入输出,并通过一系列脚本的执行来验证交易的合法性,这样的设计不适合智能合约这种需要维护“状态”的应用场景,在以太坊中,每个以太坊合约都维护一个状态树(Merkle Patricia Trie),它记录了合约的状态和数据。合理的设计使得合约状态的变化和维护不会太繁琐;
  4. 账户稳定性:比特币的用户与账号关联不稳定,一个用户对应多个公私钥对,通常做一笔转账交易就不用了,而合约需要用户和账户的关联性比较稳定。

以太坊中的世界状态是什么?

以太坊中的世界状态(World State)是指存储在区块链上的所有账户和合约的当前最新状态,每一个区块中都维护了一个状态树(MPT),这颗树以以太坊的账户地址为键,账户信息为值的树,具有强大的数据快速检索、变更、验证等能力。

状态树是一种神奇的数据结构,以太坊的40位十六进制数的地址作为键,树中节点包含Branch Node和Extension Node,以及记录账户余额、合约存储数据、代码和其他相关信息的Leaf Node;根哈希值将存储在区块头中,用于标识当前区块的账户状态。

image.png

以太坊的节点类型 以及它们都存储什么数据?

  1. 全节点(挖矿节点): 以太坊网络中最完整的节点类型,存储了整个区块链的所有数据,包括账户状态、合约代码、交易历史、交易执行结果、收据等。全节点能够验证交易和合约执行,提供最高程度的安全性和可靠性,但也需要大量的存储空间和计算资源。
  2. 轻节点(钱包节点): 轻节点存储了一些必要的元数据和状态信息,可以用来验证交易和状态。轻节点不存储完整的区块链数据,而是使用 Bloom filter 等技术来查询感兴趣的交易和数据。
  3. 中继节点:中继节点在网络中传播交易和区块,帮助维持网络的稳定性和可靠性。它们通常不存储完整的区块链数据,但会保留一些交易池和其他信息,以便有效地传播数据。

用智能合约在区块链上开发和Web2的开发模式有什么区别?

  1. 去中心化与中心化:智能合约是去中心化的,意味着没有单一的中心服务器控制所有操作,合约的执行是由网络中的节点共同协作完成的,这么做虽然公开透明,却牺牲了系统的效率;在 Web2 中,通常存在中心化的服务器架构,所有操作都受到中心服务器的控制。
  2. 可信度和透明性:智能合约具有高度的可信度和透明性,所有操作都可以被审计和验证,具有去信任化的特性;Web2 中的中心化系统可能需要用户信任中心服务器,而不易于验证操作。
  3. 数据持久性:智能合约的状态和数据是持久性的,记录了合约的所有状态变化,一旦写入难以篡改;在 Web2 中,数据可能存在数据库中,容易受到数据篡改和删除的风险。
  4. 交易费用:在区块链上,每个智能合约操作都需要支付一定数量的加密货币作为交易费用(Gas),这是为了防止滥用和确保系统的稳定性;在 Web2 中,操作通常是免费的。

智能合约应用适合用于去中心化需求强、安全性和透明性要求高、不可篡改、跨边界交互需求强的场景;Web2应用适合中心化业务模式、性能和扩展性要求高、交易成本低的场景。

为什么以太坊要用一个虚拟机?

EVM包括以下性质:

  1. 跨平台一致性:为需要在分布式系统中不同计算机下运行的代码创造了一套统一的隔离环境,确保智能合约在不同平台上以相同的方式执行,消除了平台差异可能导致的问题;
  2. 可编程性:EVM拥有一套完整的规范,允许开发人员使用高级编程语言(如Solidity)编写智能合约,这使得智能合约的开发更加规范、方便;
  3. 分布式共识: 在以太坊网络中,所有节点都需要对智能合约的执行结果达成一致的共识。虚拟机提供了一种标准的执行环境,确保所有节点都可以执行相同的代码,从而达到共识;
  4. 隔离和隐私: 虚拟机的隔离特性可以确保智能合约的数据和状态不会泄露给其他合约或节点,从而提供了一定程度的隐私保护。

以太坊钱包有哪些种类?各自的安全性和可能的风险如何?

硬件钱包(Hardware Wallets):

  • 硬件钱包是一种专门设计的硬件设备,用于离线存储私钥和签署交易。具有很高的安全性,因为私钥永远不会离开硬件设备。但是,如果硬件钱包丢失或损坏,可能会导致无法访问资金。
  • 纸钱包是将私钥以纸质形式存储的方式。这种方式最大的优势是离线存储,但需要确保纸张的安全和防止丢失、损坏。

软件钱包(Software Wallets):

  • 桌面钱包(Desktop Wallets): 运行在个人电脑上的钱包应用,提供较高的安全性,但可能受到电脑病毒和恶意软件的威胁。
  • 移动钱包(Mobile Wallets): 运行在移动设备上的钱包应用,便于随身携带和使用。安全性较高,但手机被盗或失窃时可能有风险。
  • 在线钱包(Online Wallets): 运行在互联网上的钱包,通常由第三方服务提供商托管。方便易用,但需要信任第三方,并可能受到网络攻击的威胁。

多重签名钱包(Multi-Signature Wallets):

  • 多重签名钱包需要多个私钥共同签署交易才能执行,提供额外的安全性。然而,私钥的管理可能更加复杂,丢失多个私钥可能导致资金无法访问。

以太坊区块链里面的隐私性如何?

在公开透明的区块链网络中,交易的发起者、接收者和交易金额等信息都可以被公开访问。尽管有一些解决隐私保护的技术方案,但账户间关联性、与实体世界交互方面仍不可避免隐私泄露。

方案:

  1. 零知识证明:zk-SNARKs 和 zk-STARKs等技术,可以在不公开详细信息的情况下验证交易的有效性,提供了隐私性交易的技术保证;
  2. 混币服务:将多个交易混合在一起,使得交易路径难以追踪,从而一定程度上提高了交易的隐私性,但具有一定的信任风险和法律风险;
  3. 侧链和扩展性解决方案:一些侧链和扩展性解决方案也可以在一定程度上提升以太坊的隐私性。例如,Plasma 和状态通道等技术可以使得一些交易在侧链上进行,减少主链上的可见性。

不可避免:

  1. 账户分析:通过账户与其他账户之间的交易记录的分析可以大致推断出哪些账户是属于同一个人的;
  2. 真实世界关联:在真实世界中使用虚拟货币进行交易时,可以通过时间、交易金额等信息在以太坊中查询以缩小范围,多次交易基本可以锁定人和账户的关联关系;
  3. 不可篡改:由于区块链的不可篡改性,一旦节点做存在污点的行为,将会被永久保留。

区块链中开发项目和传统互联网有哪些不同?

  1. 技术栈不同:需要特定的技术,如智能合约编程、密码学、博弈论等;传统互联网开发涉及更广泛的技术栈,如前端、后端、算法、数据分析等等;
  2. 安全性方面:由于区块链的不可篡改性,在合约部署前必须确保合约的正确性和安全性,如果存在安全漏洞将会有不可逆转的损失;
  3. 交易费用方面:开发过程中要合理设计使得合约代码经济、高效执行,需要尽量降低交易费;
  4. 社区治理方面:需要设计一定的机制来协调和管理社区的意见和决策;
  5. 用户体验方面:区块链上交易效率不比Web2应用,需要设计合理的等待机制或异步操作,在面临性能瓶颈时,需要考虑通过优化合约代码来提高性能;
  6. 资金管理方面:涉及资金的操作需要注意防范攻击,确保资金安全,通常会有安全审计的工作。