新手入门web3

190 阅读43分钟

web3入门

从关键词开始一点一点构建web3世界

web3是什么,与web吧2.0和web1.0有什么关系

Web3" 是对下一代互联网的一种概念性描述,它强调了去中心化、区块链技术、智能合约和数字身份的重要性。下面是 Web1、Web2 和 Web3 的简要比较:

  1. Web1: Web1 是指早期的互联网,主要以静态网页为主,信息的发布者和消费者之间的交互较为有限。Web1 的代表是“Web 1.0”,用户主要是 passively 消费信息,而不太涉及互动。
  2. Web2: Web2 是指近年来的互联网,以用户生成的内容、社交媒体、在线协作工具为特征。Web2 的代表是“Web 2.0”,用户更加参与,能够创建内容、分享信息,并通过社交媒体平台进行互动。
  3. Web3: Web3 是一种关注去中心化、区块链技术和加密经济的愿景。它强调用户拥有自己的数据和身份,并通过智能合约进行去中心化的交互。Web3 的代表是“分布式 Web”或“去中心化 Web”。

Web3 与 Web1 和 Web2 的关系在于,它被视为下一步的演进,弥补了一些 Web1 和 Web2 的局限性。Web3 希望解决一些由中心化数据控制、数字身份问题以及中间商权力过大等引起的问题,提供更多的用户控制权和隐私保护。

总的来说,Web1 是互联网的起源,Web2 是社交化和用户参与的时代,而 Web3 强调去中心化、加密和用户权利的新时代。这三个阶段代表了互联网的演进和不断的技术创新。

web3的定义

关于web3记住的几个点: 去中心化、自执行、无信任、安全透明无篡改。

智能合约: 数字化合同,能够自执行并存储。

作用:

  • 自动执行: 智能合约是一段在区块链上运行的代码,其中包含了合同的规则和条款。一旦事先设定的条件满足,合约就会自动执行,无需第三方的干预。
  • 无需信任: 参与方无需相互信任,因为智能合约的执行是通过区块链上的共识算法完成的,确保了公正性和可信度。
  • 去中心化: 与传统合同不同,智能合约不需要中间人,它在区块链网络上分散存储和执行,增强了去中心化的特性。

实现方式:

  • 编写智能合约: 智能合约是用编程语言编写的,如Solidity(以太坊的主要智能合约语言)。开发人员编写智能合约代码,定义合同的条件和执行逻辑。
  • 部署到 区块链 编写的智能合约代码被部署到区块链上,成为一个可在网络中执行的智能合约实例。智能合约的部署通常需要一些加密货币作为成本,以支付网络上的矿工费用。
  • 交互: 一旦部署,智能合约就可以与其他合约或用户进行交互。用户可以通过发送交易请求与智能合约进行互动,触发其自动执行
  1. 参与方:
    1. 开发人员: 编写智能合约代码的专业人员。
    2. 用户: 参与智能合约的一方,可以触发合约的执行并获得相应的结果。
    3. 矿工: 在一些区块链网络中,矿工负责验证并打包智能合约的交易,将其添加到区块链上。

总体而言,智能合约通过自动执行、去中心化和无需信任的特性,为参与方提供了更加高效和安全的交互方式。

区块链是什么?

区块链技术是一种去中心的分布式存储的数据库技术。最初设计是为了存储加密货币而设计的。区块链的核心概念就是将数据分布式存储在多个节点上,通过共识算法保证数据的一致性和安全性,从而实现去中心化和不可篡改的特性

区块block: 是区块链中最小的单元,用来存储交易数据和上一个区块的hash值。区块是按照顺序链接在一起的,形成一个不断增长的链

哈希hash:区块中的数据通过hash算法生成一个固定长度的字符串,成为hash值。每个区块的hash值包含上一个区块的hash值,形成了链式连接。

去中心化:区块链不依赖于单一的中央管理机构,而是由网络中的多个节点一同维护。这使得数据在整个网络中分布,并消除单点故障。

分布式数据库:是一个分布式的数据库,每一个节点都拥有数据完整的副本。这种分布式结构提供了高度的可靠性和抗攻击性。

共识机制:通过共识机制来确定哪个节点有权添加新的区块到链上。通常使用工作量机制,权益机制

智能合约: 区块链上可以运行智能合约,这是一种自执行合约规定的代码。智能合约可以用于创建去中心化应用程序。(下面有详细说,智能合约执行后会生成一个新的块,然后鼓励矿工挖矿把块链接到区块链上)

不可篡改性:一旦一个区块被添加到区块链中,它就很难被修改或删除。由于区块的hash值和上一个hash值的关系,任何尝试篡改都会导致整个链上的hash值失效。

加密技术:区块链使用加密技术确保交易的安全性。用户可以通过私钥进行数字签名,证明交易的真实性。

区块链的实现平台有哪些

既然我们已经提出了一种实现web3的思想,由于在实现的过程中侧重点不同,肯定会有很多的不同实现平台。比如最耳熟能详的比特币主要的功能是支持对加密货币的交易, 以太坊可以支持智能合约的执行。

有许多区块链的实现平台,每个平台都有其独特的特性和用途。以下是一些常见的区块链实现平台:

区块链的实现平台有很多,其中一些最知名和最常用的包括:

  1. Ethereum(以太坊) :Ethereum 是最受欢迎的智能合约和去中心化应用(DApp)平台之一。它支持开发者构建和部署智能合约,以及创建各种类型的去中心化应用和数字资产。
  2. Hyperledger:Hyperledger 是一个开放源代码的区块链项目,旨在促进企业级区块链解决方案的开发和部署。它提供了多个区块链框架和工具,以满足不同的企业需求。
  3. Binance Smart Chain(币安智能链) :Binance Smart Chain 是由币安推出的区块链平台,旨在为去中心化金融(DeFi)应用和数字资产提供低成本和高性能的解决方案。
  4. Cardano:Cardano 是一个开放源代码的区块链平台,旨在提供安全、可扩展和可持续的区块链基础设施。它采用了一种称为Ouroboros的独特的共识算法。
  5. Polkadot:Polkadot 是一个跨链解决方案,旨在实现不同区块链网络之间的互操作性。它允许区块链之间进行通信和资产转移,从而为开发者和用户提供更大的灵活性和选择。
  6. Solana:Solana 是一个高性能区块链平台,采用了一种称为Proof of History的共识算法,旨在提供高吞吐量和低延迟的区块链解决方案。

以上是一些常见的区块链实现平台,每个平台都有其独特的特点、优势和适用场景,开发者和用户可以根据自己的需求选择合适的平台。

b4lf2ie8pz.larksuite.com/sync/FruxdR…

  1. 比特币(Bitcoin): 比特币是第一个区块链实现,用于支持加密货币交易。它主要专注于去中心化的数字货币。
  2. 波卡(Polkadot): 波卡是一个多链框架,旨在使不同区块链之间可以互相通信和传输价值。
  3. 卡尔达诺(Cardano): 卡尔达诺是一个开源的区块链平台,着重于可持续性、可扩展性和互操作性。
  4. Hyperledger Fabric: 由 Linux 基金会主持的 Hyperledger 项目的一部分,Hyperledger Fabric 是一个适用于企业的分布式账本平台。
  5. Ripple(XRP): Ripple 是一个为金融机构提供实时支付解决方案的区块链平台。
  6. Tezos: Tezos 是一个自我修复的区块链平台,具有治理机制,允许持有人通过投票来升级网络协议。
  7. EOS: EOS 是一个面向去中心化应用的平台,提供高性能和低延迟的区块链服务。
  8. Tron: Tron 是一个去中心化的娱乐内容分享平台,致力于构建全球范围内的去中心化互联网。
  9. Binance Smart Chain(BSC): BSC 是由 Binance 推出的区块链平台,旨在提供快速、低成本的智能合约服务。

这些是仅仅是众多区块链平台中的一小部分。每个平台都有其自己的优势、特性和适用场景,选择取决于项目的需求和目标。

代币和加密货币是什么?有什么区别

  1. 定义:
    1. 代币(Token): 代币是建立在现有区块链网络上的数字资产。这些代币可以代表任何具体的数字或实物资产,如资产、权益或权利。代币通常是通过智能合约发行的,智能合约定义了代币的规则和功能。
    2. 加密货币(Cryptocurrency): 加密货币是一种数字或虚拟货币,通常构建在独立的区块链网络上。比特币(Bitcoin)是最早的加密货币之一,而其他的加密货币如以太坊(Ethereum)、莱特币(Litecoin)等也属于这一类别。
  1. 发行平台:
    1. 代币: 代币可以在现有的区块链网络上发行,例如以太坊上的 ERC-20 代币或 ERC-721 不可替代代币(NFT)。
    2. 加密货币: 加密货币通常是通过自己独立的区块链网络发行的,具有自己的共识机制和规则。
  1. 用途:
    1. 代币: 代币的用途多种多样,可以代表实物资产、参与治理、支付手续费等。NFT 是一种代表独特数字资产的代币。
    2. 加密货币: 加密货币通常作为一种数字资产和支付手段存在,用于交易和价值存储。
  1. 共识机制:
    1. 代币: 代币的共识机制通常与其所在的区块链网络相对应,可以是基于工作量证明(Proof of Work)或权益证明(Proof of Stake)等。
    2. 加密货币: 加密货币有自己独立的共识机制,例如比特币使用的是 Proof of Work,以太坊计划转向 Proof of Stake。
  1. 例子:
    1. 代币: ERC-20 代币(如 USDT、UNI)、ERC-721 NFT(如 CryptoKitties)。
    2. 加密货币: 比特币(BTC)、以太坊(ETH)、莱特币(LTC)。

总体而言,代币是一种数字资产,可以在任何支持智能合约的区块链上创建,而加密货币通常是在独立的区块链网络上发行的数字货币。加密货币是代币的一种特例,它在自己的区块链上运行,并具有独立的共识机制。

不同的区块链币存在多种性的原因

不同的区块链币(或称为加密货币、代币)存在的原因有很多,这些币种通常基于不同的区块链技术和协议,拥有不同的设计目标和特性。以下是一些常见的原因:

  1. 技术差异: 不同的区块链币通常基于不同的区块链技术和协议,如比特币、以太坊、波卡等。这些技术差异导致了不同的币种在安全性、智能合约功能、共识算法等方面的差异。
  2. 智能合约平台: 有些区块链币专注于成为智能合约平台,允许开发者创建和执行智能合约。以太坊是最著名的智能合约平台之一,而其他平台如波卡、卡尔达诺等也提供了类似的功能。
  3. 隐私保护: 一些区块链币专注于提供更高级的隐私保护功能。例如,Monero 和 Zcash 是专注于保护用户隐私的加密货币,使用了特殊的隐私保护技术。
  4. 性能和扩展性: 区块链网络的性能和扩展性是关键考虑因素。一些币种设计旨在提高交易速度和网络扩展性,例如,Ripple 提供了一种高效的交易结算网络。
  5. 社区和治理: 不同的区块链币有着不同的社区和治理模式。一些币种采用去中心化的治理机制,允许社区成员共同参与网络的决策过程。
  6. 用途和应用场景: 区块链币的设计通常与其用途和应用场景密切相关。例如,Chainlink 的 LINK 代币用于支付链上的数据提供者,而 Uniswap 的 UNI 代币用于治理去中心化交易所 Uniswap。
  7. 创新和实验: 区块链技术仍在不断发展,因此新的区块链币不断涌现,试图通过创新解决现有技术和应用上的问题,推动整个行业的发展。

总体而言,不同的区块链币的存在是为了满足不同的需求和设计目标。投资者和开发者可以根据项目的特性、目标以及团队的背景来选择适合自己需求的区块链币。

以太坊是什么及怎么实现的

以太坊是一个基于区块链技术的去中心化平台。 允许开发者构建和部署智能合约。第一个智能合约功能的区块链平台。

智能合约: 以太坊的核心功能之一是支持智能合约的创建和执行。智能合约是自执行的代码,定义了在区块链上进行的合约和交易的规则。

去中心化:去中心化平台不依赖于单一实体或中央机构。分布在全球的节点网络来维护区块链的完整性和安全性

ether以太币:以太坊的本地加密货币eth,用于支付交易费用gas和作为智能合约的执行成本。它可以作为一种数字资产进行交易和投资。

gas费用: 在以太坊是执行智能合约和交易需要支付gas费用。gas是以太币的单位,用于衡量计算和网络资源的消耗。

区块链共识机制: 以太坊目前使用工作量证明机制pow,即通过挖矿来验证和添加新的区块。目前正在计划使用更环保的权益证明机制成为以太坊2.0

以太坊虚拟机evm:以太坊上的智能合约是以太坊虚拟机evm执行的。evm是一个基于栈的虚拟机,允许智能合约在以太坊上执行。

发展和升级: 经历了改进性能、安全和功能这些代号为homestead、metropolis、lstanbul

去中心化应用dapp: 允许开发者去构建去中心化的应用,这些应用使用智能合约在区块链上执行逻辑。dapp可以包括去中心化金融defi,游戏等等。

solidity编译后生成的

1.json是这个接口描述,可以通过这个json调用这个合约

2.二进制文件 就是这个合约的文件内容

可以把合约和合约之间连接起来; 可以把合约和区块链连接起来。

以太坊虚拟机

"EVM" 是 "Ethereum Virtual Machine" 的缩写,翻译为中文是 "以太坊虚拟机"。EVM 是以太坊区块链上执行智能合约的运行环境,它是以太坊网络的核心组件之一。

以下是 EVM 的关键特点和作用:

  1. 虚拟机: EVM 是一个基于栈的虚拟机,被设计为可以在以太坊网络上执行智能合约的运行环境。它提供了一个安全的隔离环境,使得智能合约可以在去中心化网络上执行,而不受单一主机的影响。
  2. 智能合约执行: EVM 执行以太坊上的智能合约,这些合约是由 Solidity 或其他支持的编程语言编写的。智能合约是一组自动执行的代码,定义了在区块链上的交互和逻辑。
  3. 沙盒环境: EVM 提供了一个沙盒环境,智能合约在其中运行,互不影响。这确保了智能合约的安全性,一个合约的错误或攻击不会波及到其他合约或整个网络。
  4. Gas: 在以太坊中,执行智能合约需要支付一定的计算成本,称为 "Gas"。每个操作都有一个与之相关的 Gas 成本,确保网络资源的合理分配和防止滥用。
  5. 合约状态: EVM 维护智能合约的状态,包括存储在区块链上的数据。这些状态的更改是由交易触发的,通过区块链的共识机制保证了合约状态的一致性。
  6. 指令集: EVM 定义了一组指令,这些指令用于执行各种操作,包括数学运算、逻辑判断、存储和加载数据等。合约的代码由这些指令组成。

通过 EVM,以太坊创造了一个去中心化应用程序的运行环境,使得开发者可以在区块链上创建安全、透明、可信的智能合约。EVM 的设计使得在以太坊网络上运行的智能合约具有可移植性,可以在任何兼容 EVM 的区块链上运行。

以太坊网络有哪些?

在以太坊网络中不同的网络,代表不同的链

  1. 以太坊主网(Ethereum Mainnet): 这是以太坊的主要网络,也是运行实际价值的网络。在主网上进行的交易是真实的,需要使用真实的以太币。
  2. Ropsten: Ropsten 是以太坊的测试网络,用于进行开发和测试。在 Ropsten 上的以太币是测试以太币,可以免费获得。
  3. Kovan: Kovan 是以太坊的另一个测试网络,使用了以太坊的 PoA(Proof of Authority)共识机制。
  4. Goerli: Goerli 是一个跨客户端的 PoA 测试网络,用于测试以太坊 1.0 和以太坊 2.0 客户端的互操作性。
  5. 私有网络: 除了上述网络之外,很多开发者还会在本地或内部网络上搭建私有的以太坊网络,以便在受控的环境中进行测试和开发。

与区块链上的网络交互的主要步骤

与区块链网络进行交互的步骤

一、选择合适的工具和库 客户端和浏览器

二、连接到区块链节点 使用上面的库通过节点的json-rpc接口连接到以太坊网络节点、

可以连接到本地节点或者远程节点

注:与合约交互会分为客户端和服务端交互,服务端交互一般采用json-rpc的形式, 客户端交互可以使用如: metamask浏览器钱包插件, etherjs,web3js,wagmi插件等

三、创建钱包和密钥对 需要以太坊地址和密钥对

四、查询区块链状态 可以使用以太坊客户库查看区块链上的状态 获取状态和检查交易

五、发送交易和调用合约

创建并发送交易执行合约调用;交易可以包括转账以太币或者与智能合约交互

六、监听事件

监听智能合约事件,实时获取区块链上变化。

七、处理交易确认和错误

区块链上的交易不是立即确认的,而是等待一定数量的区块确认。我的应用需要处理交易的确认以及错误的情况。

八、使用ipfs或者其他分布式存储

九、测试和部署

官网地址:

etherjs

json-rpc

wagmi

区块链中生成一个新的块,并验证添加这个块

生成、验证和添加新的区块是区块链的核心机制,他涉及到共识算法和区块链网络的运作

一、生成区块链(挖矿)

1.交易池:区块链网络中存在一个交易池,包含待处理的交易。这些交易使用户发送的数字货币交易或智能合约执行的结果。

2.区块头:挖矿节点会手机一定数量的待处理交易,然后构建一个新的区块。区块头包含了前一个区块的hash值,时间戳和一些其他的元数据。

3.工作量证明:大多数区块链网络使用pow共识机制。在pow中,节点需要通过解决一个数学难题来证明其对网络的共享。这个过程成为挖矿,挖矿节点需要不断尝试使用随机数,直到找到一个符合网络难度要求的解。

4.hash值:一旦找到满足条件的解,挖矿节点会将解加入到区块头中,形成新的区块。然后,这个区块的hash值会被计算,并且满足网络设定的hash条件。

5.广播:一旦新的区块生成,挖矿节点会将它广播到整个网络,让其他节点知道

二、检验和添加区块

1.接受新区块:其他节点在接收到新的区块后,会先检查区块的格式,hash值和其他元数据是否符合规定

2.共识验证:节点会验证新的节点是否通过共识机制,例如pow,这保证了区块的生成是经历过一定的共识规则的

3.交易验证:节点会验证区块中包含的每一笔交易,确保交易的有效性和合法性。这包含检查数字签名和账户余额

4.前一个区块hash值验证:节点会验证新区快的前一个区块的hash值是否与其记录的链上的最后一个区块一致。确保了连接性。

5.添加到本地链:如果所有的验证都通过,节点会将新的区块添加到自己的本地链上。

6。传播:验证通过后,节点将这个新区块广播给其他节点,使得整个网络的区块链保持同步。

去中心化应用dapp和智能合约的理解

去中心化应用(DApp)和智能合约是区块链技术的两个关键组成部分,它们可以结合在一起以创建功能强大、透明、自动执行的应用程序。下面解释了它们之间的关系:

  1. 1. 去中心化应用(DApp):
  • 定义: 去中心化应用是构建在区块链上的应用程序,其特点是去中心化、透明、开放和安全。它们不依赖于单一的中央控制点,而是通过区块链网络上的节点共同维护和执行。
  • 特性:
    • 去中心化: DApp 不由单一实体控制,而是通过区块链上的多个节点来实现。
    • 透明性: DApp 的规则和操作是公开可验证的,用户可以查看和审计应用程序的代码和交易。
    • 开放性: 大多数 DApp 是开源的,任何人都可以查看和参与其开发。
  • 组成部分: DApp 通常由前端用户界面(UI)、后端智能合约以及与区块链进行交互的去中心化存储或数据库等组成。
  1. 2. 智能合约:
  • 定义: 智能合约是一种在区块链上执行的自动化合约,其中包含了代码和规则,定义了在特定条件下应如何执行操作。智能合约通常用于处理和执行数字资产的交易和逻辑。
  • 特性:
    • 自动执行: 智能合约自动执行,无需人为干预。
    • 透明和不可篡改: 合约的代码和执行结果被记录在区块链上,可被审计和验证。
  • 用途: 智能合约可以用于各种应用,包括数字货币交易、去中心化金融(DeFi)应用、投票系统、数字身份验证等。

结合 DApp 和智能合约:

  • 逻辑执行: DApp 的核心逻辑通常由智能合约处理。智能合约定义了应用程序的规则和行为,而 DApp 的前端用户界面通过与智能合约交互来实现这些规则。
  • 用户交互: 用户通过 DApp 的界面与智能合约进行交互,发起各种操作,例如进行数字资产的转账、参与投票、购买商品等。
  • 数据存储: DApp 可以利用去中心化存储或区块链上的数据存储功能,将一些不敏感但需要透明存储的信息保存在区块链上。
  • 事件触发: 智能合约的执行结果会触发事件,这些事件可以被 DApp 监听和响应,以更新用户界面或执行其他操作。

通过将 DApp 和智能合约结合起来,可以构建出更安全、透明、无需信任的应用程序,同时充分利用区块链技术的特性。用户可以在去中心化的环境中使用应用程序,而无需担心中央机构的风险。

后端编写智能合约到区块链上的主要过程

智能合约的部署指的是将编写好的智能合约代码上传到区块链网络,使得合约在区块链上得以执行和使用的过程。在这个过程中,智能合约的代码被转换成字节码,并将合约的字节码和相关信息记录在区块链的某个区块中。 自己的理解: 上链之前的一堆准备 例如链接特定的网络、连接钱包 使用钱包签名确定归属问题 同时也能通过这个钱包快速找到自己的合约在哪个块上 。在这个特定的网络上调用智能合约也就是创建块的过程也叫做交易,矿工执行共识算法进行上链操作

部署智能合约通常包括以下步骤:

  1. 编写合约: 开发者使用 Solidity 或其他智能合约编程语言编写合约代码,定义了合约的行为和规则。
  2. 编译合约: 合约代码通过编译器转换为机器可执行的字节码。这个步骤生成了字节码和合约的 ABI(Application Binary Interface)。
  3. 选择网络: 开发者选择目标区块链网络,比如以太坊、Binance Smart Chain等。
  4. 连接钱包或节点: 开发者需要连接到一个以太坊节点或其他支持的节点,以便与区块链进行交互。
  5. 使用钱包进行签名: 在将合约上传到区块链之前,需要使用钱包对合约的部署交易进行签名,以证明拥有合约的控制权。
  6. 发送交易: 开发者通过调用区块链的合约创建交易,将合约的字节码和其他相关信息发送到区块链网络。
  7. 等待确认: 区块链网络中的矿工会确认并打包这笔交易,将合约部署到区块链上。这个过程需要一些时间,因为需要等待交易被区块确认。

一旦合约被成功部署,它就在区块链上具有独特的地址,并可以通过这个地址在 DApp 或其他智能合约中进行调用和交互。

怎么知道智能合约部署到哪个区块链的哪个位置

知道智能合约部署到哪个区块链的哪个位置上通常需要查看合约的事务(Transaction)和区块(Block)信息。以下是一些方法:

  1. 事务浏览器: 区块链网络通常有事务浏览器,你可以在上面搜索合约的地址,然后查看相关的事务和区块信息。以太坊网络有一些知名的事务浏览器,如Etherscan。在事务浏览器中,你可以找到智能合约的地址、所在区块的高度以及其他相关信息。
  2. 使用 区块链 节点: 如果你连接到了一个区块链节点,你可以通过使用节点的 API 查询合约的事务和区块信息。这通常需要一些编程技能,但是这种方法可以提供更灵活的查询选项。
  3. 钱包应用: 有些钱包应用也提供了查看合约部署信息的功能。如果你使用的是特定钱包,可以尝试在钱包中查看部署的合约。

请注意,合约地址是唯一标识一个智能合约的信息,而不同的区块链网络有不同的命名空间。例如,以太坊上的合约地址与Binance Smart Chain上的合约地址是不同的。因此,确保在正确的区块链网络上查找相应的信息是非常重要的。

以太坊的事务浏览器sepolia.etherscan.io/

智能合约事务是什么?

在区块链上,智能合约的事务(Transaction)是指通过执行合约中的函数或者发送交易来与智能合约进行交互的操作。每一笔交易都包含了对智能合约状态的修改,或者对区块链状态的其他一些操作。以下是智能合约事务的一些功能:

  1. 调用合约函数: 通过发送交易调用智能合约中的函数,可以执行合约中定义的特定逻辑。这些函数可能包括状态修改、数据查询等操作。
  2. 修改智能合约状态: 如果智能合约包含了可变状态,通过发送包含状态修改操作的交易,可以更新合约中的数据。
  3. 支付代币: 有些智能合约可能包含接受代币的功能。通过发送带有一定数量代币的交易,可以支付给合约,并根据合约逻辑执行相应的操作。
  4. 触发事件: 在合约中执行某些操作时,可以通过事务触发事件。事件是一种机制,用于在区块链上记录某些关键活动,以便其他应用程序或合约能够监听和响应。
  5. 查询数据: 智能合约事务中也可以包含只读操作,即查询合约状态而不修改它。这样的操作不会在区块链上产生状态变更,不需要支付燃气费用,但可以获得合约当前状态的快照。
  6. 燃气费用支付: 每个事务都需要支付一定数量的燃气费用,以保障网络安全和防止滥用。燃气费用的多少取决于事务的复杂性和执行的计算成本。

事务是区块链上合约与外界互动的主要手段,通过执行事务,可以实现合约的各种功能和应用场景。

区块链中的区块提供哪些api功能

区块链节点的 API 提供了对区块链网络的访问接口,使开发者能够查询区块链上的信息、发送交易、获取合约数据等。不同的区块链节点可能提供不同的 API,以下是一些常见的区块链节点 API 功能

  1. 区块 查询(Block Query): 允许开发者查询区块链上的区块信息,包括区块的高度、哈希值、时间戳、交易数量等。
  2. 交易查询(Transaction Query): 允许开发者查询特定交易的详细信息,包括交易哈希、发送者、接收者、金额等。
  3. 地址查询(Address Query): 允许开发者查询特定地址的余额、交易历史等信息。
  4. 合约查询(Smart Contract Query): 允许开发者查询智能合约的状态、代码、事件等信息。
  5. 交易发送(Transaction Broadcasting): 允许开发者通过 API 将签名的交易发送到区块链网络,以便在区块链上执行。
  6. 事件订阅(Event Subscription): 一些节点提供了事件订阅功能,允许开发者订阅区块、交易、合约事件等,以便实时获取网络的变化。
  7. 燃气价格查询(Gas Price Query): 允许开发者查询当前网络上的燃气价格,以确定发送交易时应支付的费用。
  8. 网络状态查询(Network Status Query): 允许开发者查询区块链网络的当前状态,如节点数、区块高度、同步状态等。

区块链浏览器中可以查询的信息?

在以太坊区块链浏览器中,你可以查看许多关键的信息,包括但不限于:

  1. 区块信息: 查看最新的区块,了解每个区块的高度、时间戳、交易数量等。
  2. 交易历史: 检查特定地址的交易历史,包括发送和接收的以太币,以及与智能合约的交互。
  3. 地址余额: 查询以太坊地址的余额,即地址拥有的以太币数量。
  4. 智能合约: 检查特定智能合约的详情,包括合约地址、源代码、交易历史等。
  5. Token 交易: 查看 ERC-20 或其他标准代币的交易历史和持有人。
  6. 内部交易: 了解与智能合约互动的内部交易,这包括从合约发送到合约的交易。
  7. Gas 费用: 检查交易所涉及的 Gas 费用,了解当前的 Gas 价格和区块的 Gas 上限。
  8. 事件日志: 查看智能合约中发生的事件日志,这对于追踪合约的状态变化非常有用。
  9. 网络统计: 了解整个以太坊网络的统计信息,包括算力、难度、节点数量等。
  10. 合约调用和内存: 如果有智能合约调用或状态变更,可以查看相关的调用和内存变化。

总体而言,以太坊区块链浏览器为用户提供了对区块链上的各种活动和数据的透明访问,使他们能够更好地了解、监视和验证交易和合约的状态。

开发一个dapp过程

去中心化应用(Decentralized Application,DApp)是一种构建在区块链技术上的应用程序,其特点是不依赖于中心化的服务器,而是通过分布式网络中的节点来运行和存储数据。DApp 通常采用智能合约来定义应用的规则和逻辑,并使用区块链上的去中心化存储来存储数据。

  1. 选择合适的 区块链 平台: 选择适合你应用需求的区块链平台。以太坊是最常用的区块链平台之一,但还有其他平台如 Binance Smart Chain、Polkadot、Solana 等。
  2. 设计智能合约: 定义应用的规则和逻辑,通常通过智能合约来实现。智能合约是在区块链上运行的自动执行的代码,负责处理应用的核心功能,如转账、数据存储、业务逻辑等。
  3. 选择合适的去中心化存储: 如果应用需要存储大量数据,可以选择使用去中心化存储解决方案,如 IPFS(InterPlanetary File System)或其他类似的协议。这样可以确保数据的分布式存储,提高可靠性和去中心化程度。
  4. 构建用户界面: 开发用户界面,可以使用传统的 Web 技术,如 HTML、CSS、JavaScript,也可以使用现代的前端框架,如 React、Vue.js 等。用户界面将与智能合约进行交互,与区块链网络通信,并显示用户相关的信息。
  5. 集成 区块链 交互: 使用以太坊客户端库(如 Web3.js、Ethers.js)或其他适用于所选区块链平台的库,实现与区块链网络的交互。这包括查询区块链状态、发送交易、调用智能合约等操作。
  6. 身份和钱包管理: 管理用户的身份和钱包信息,可以使用区块链浏览器插件(如 MetaMask)或其他身份验证解决方案。这些工具允许用户与 DApp 进行安全的身份验证和交互。
  7. 测试和部署: 在测试网络上进行充分的测试,确保智能合约和应用的功能正常。一旦确认无误,就可以将 DApp 部署到主网络上,供用户使用。
  8. 社区和营销: 建立社区,宣传和推广你的 DApp。与用户和其他开发者交流,不断改进和扩展你的应用。

以上是一般性的步骤,实际的 DApp 开发可能会涉及更多的细节和具体的技术选择。去中心化应用的实现涉及到区块链和分布式系统的概念,同时需要考虑用户体验、安全性和可扩展性等方面的问题。

钱包如何连接到dapp

  1. 获取用户地址和权限: 一旦用户授权连接,你的 DApp 将能够获取用户的钱包地址以及其他可能需要的权限。这使得 DApp 能够读取用户的区块链信息,执行交易等操作。
  2. 处理断开连接: 你的 DApp 应该能够处理用户断开连接的情况。一些钱包提供了事件或回调函数,使你能够监测到用户是否断开了连接。
  3. 安全性考虑: 在整个连接过程中,务必要考虑安全性。确保使用安全的连接方法,避免存储敏感信息,并仅在必要时请求用户的授权。

以下是一个简单的使用 Web3.js 连接 MetaMask 的例子:

javascriptCopy code
// 检测 MetaMask 是否已安装
if (typeof window.ethereum !== 'undefined') {
  // 请求用户授权连接
  window.ethereum.request({ method: 'eth_requestAccounts' })
    .then((accounts) => {
      const userAddress = accounts[0];
      console.log('Connected to MetaMask. User address:', userAddress);
      // 连接成功后执行其他逻辑
    })
    .catch((error) => {
      console.error('Error connecting to MetaMask:', error);
    });
} else {
  console.error('MetaMask not detected. Please install MetaMask.');
}

这只是一个简单的示例,实际上可能需要更复杂的逻辑来处理连接、断开连接、权限等情况。

Json-rpc

客户端通过网络调用远程服务。通过对象的形式。

  1. 构造 JSON-RPC 请求对象: 创建一个包含必要信息的 JSON 对象,表示你要调用的远程方法。一个基本的 JSON-RPC 请求对象包括以下字段:
jsonCopy code
{
  "jsonrpc": "2.0",
  "method": "methodName",
  "params": [param1, param2],
  "id": 1
}
  • "jsonrpc" :指定 JSON-RPC 协议的版本,通常是 "2.0"。
  • "method" :指定要调用的方法名。
  • "params" :包含方法参数的数组。
  • "id" :标识请求的唯一标识符,可以是任意值,用于匹配请求和响应。
  1. 发送 JSON-RPC 请求: 将构造的 JSON-RPC 请求对象发送到远程服务器。这通常是通过 HTTP POST 请求或 WebSocket 连接实现的,具体取决于服务器的支持。例如,使用 JavaScript 的 fetch 函数:
javascriptCopy code
const url = "https://example.com/jsonrpc-endpoint";
const requestOptions = {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ /* 构造的 JSON-RPC 请求对象 */ })
};

fetch(url, requestOptions)
  .then(response => response.json())
  .then(data => {
    // 处理 JSON-RPC 响应
    console.log(data);
  })
  .catch(error => {
    // 处理错误
    console.error("Error:", error);
  });
  1. 处理 JSON-RPC 响应: 从服务器接收到 JSON-RPC 响应后,解析响应并提取结果。一个基本的 JSON-RPC 响应对象包括以下字段:
jsonCopy code
{
  "jsonrpc": "2.0",
  "result": "resultData",
  "id": 1
}
  • "jsonrpc" :指定 JSON-RPC 协议的版本,通常是 "2.0"。
  • "result" :包含调用方法的结果。
  • "id" :与请求中的 "id" 对应,用于匹配请求和响应。

处理响应的方式将取决于你的应用程序的需求。

需要注意的是,JSON-RPC 还有错误处理机制,可以在响应中包含错误信息。详细的规范和细节可以在 JSON-RPC 的官方文档中找到。

智能合约

其他博客文档

理解智能合约: learnblockchain.cn/2018/01/04/…

进入web3世界的一些操作

以进入以太坊区块链学习为例, 首先我们要安装一个钱包ethereum.org/zh/wallets/… 并在区块链浏览器中查看交易。

注: 钱包的种类很多, 有的是客户端,有的是浏览器的插件,根据不同的功能进行选择。 以metamask钱包为例

注: 通过faucet水龙头获取测试币, 如通过sepoliafaucet.com/可以获取sepolia…

solidity 简单语法介绍

hardhat 可以通过hardhat 开发solidity。也可以通过chainide.com/zh-CN/ 云端多链开发编译和部署。

Solidity 是一种为以太坊和其他以太坊兼容区块链设计的智能合约语言。智能合约是在区块链上运行的自动化合同,可以执行特定的功能,存储数据,并与其他智能合约或外部实体进行交互。

以下是 Solidity 的一些关键特点和概念:

  1. 静态类型语言: Solidity 是一种静态类型语言,这意味着变量的类型在编译时就已经确定,而不是在运行时。
  2. 面向对象: Solidity 支持面向对象编程范式,包括合约、继承、库等概念。
  3. 智能合约: Solidity 主要用于编写智能合约,这些合约是在区块链上执行的代码,通常用于实现去中心化应用(DApps)中的业务逻辑。
  4. Gas 成本: Solidity 合约在以太坊上执行时需要消耗 Gas,这是一种计算资源。开发者需要注意编写高效的合约,以降低执行成本。
  5. 安全性: 由于智能合约执行在区块链上,安全性至关重要。Solidity 提供了一些功能和最佳实践,以防范各种安全漏洞,如重入攻击、溢出等。
  6. ERC-20 和 ERC-721 标准: Solidity 常用于编写符合 ERC-20(代币标准)和 ERC-721(非同质代币标准)的智能合约。

关于solidity这个语言,它是一个静态类型语言,指的是编译之后指定类型,编译器能更早的错误检查,把它理解为和Java这种强类型的语言。

首先简单掌握solidty的结构、类型,类型的转换, 存储方式,合约,和常用的方法

结构: 状态变量、函数、事件、错误、结构体、枚举类型的声明

类型: 值类型,引用类型 及类型之间的转换

TODO: 待熟练基础语法

与智能合约交互

Etherjs

官网使用文档: learnblockchain.cn/ethers_v5/

  1. 连接到以太坊网络

方式一:metamask 生成web3Provider实例,通过这个实例可以连接以太网网络

import {ethers} from 'ethers'

//如果浏览器安装了metamask插件,window.ethereum就会获取到
const provider = new ethers.providers.web3Provider(window.ethereum)

方式二:json-rpc形式

import {ethers} from 'ethers'

//如果浏览器安装了metamask插件,window.ethereum就会获取到
const provider = new ethers.providers.JsonRpcProvider()
  1. 保存并访问私钥,并可以对信息进行签名
const signer = provider.getSigner()
  1. 使用provider查询当前块号
provider.getBlockNumber().then(val=>{
 console.log('block number:',val)
})
  1. 使用provider查询指定账户地址的原生代币余额
provider.getBalance(address).then(val=>{
 console.log('token balance:',value.toString()) //单位wei
})

Q:以太币的单位及单位转换

  1. 发送0.01原生币到指定地址 1 ETH 等于 10^18 Wei

通过signer.sendtransaction 写入区块链

const sendToken = (toAddress:string)=>{
  signer.sendTranscation({
    to:toAddress,
    value:ethers.utils.parseEther('0.01')
  }).then(res=>{},reason=>{})
}

<button onClick={sendToken}>点击发送代币</button>

Q: ethers.utils.parseEther 方法 将人类读取的数据转为 机器的bigint类型数据

  1. 生成合约实例

合约可以简单理解为对象, 通过映射方式来编码和解码数据

const tokenContract = new ethers.Contract(
'address hash 合约的hash地址',
ABI,
provider
)
  1. 发送指定的代币到合约上

此时合约只连上了provider,而provider只能提供读取链上的数据的方法,如果我们想要向链上写入数据,我们需要将合约实例连接到signer,const signerContract = tokenContract.connect(signer)

const sendToken1 = (toAddress:string,amount:string)=>{
  const tx =  signerContract.transfer(toAddress,amount)
  tx.then(res=>{},reason=>{})
}
  1. 监听合约的Transfer事件
tokenContract.on('Transfer',(from,to,amount,event)=>{
  console.log(xx)
})

wagmi

官网使用文档: wagmi.sh/react/api/h…

相比于etherjs,wagmi是一个react的插件库,提供了很多的hooks,可以更加方便的连接钱包和合约进行交互

使用流程

  1. 安装
  2. 配置我们想要的链, 以及想要的providers
import { CHAIN_ENV } from 'gatsby-env-variables';
import { configureChains, mainnet } from '@wagmi/core'
import { publicProvider } from '@wagmi/core/providers/public'

export const targetChain = CHAIN_ENV === 'testnet' ? sepolia : mainnet;
const { chains, publicClient, webSocketPublicClient } = configureChains(
  [targetChain], //配置了主链
  [publicProvider()],
)
  1. 创建配置对象

/components/common/WagmiProvider.tsx

import { CHAIN_ENV } from 'gatsby-env-variables';
import {
  createConfig,
  configureChains,
  mainnet,
} from '@wagmi/core'
import { publicProvider } from '@wagmi/core/providers/public'

export const targetChain = CHAIN_ENV === 'testnet' ? sepolia : mainnet;
const { chains, publicClient, webSocketPublicClient } = configureChains(
  [targetChain],
  [publicProvider()],
)

const config = createConfig({
  autoConnect: true,
  publicClient,
  webSocketPublicClient,
})

至此通过config 配置对象,可以访问链的信息了。

  1. 使用WagmiConfig组件包裹入口,并传入config属性,以便在整个项目中都能使用wagmi提供的hooks
export function WagmiProvider(props: IWagmiProviderProps) {
  const { children } = props;
  return <WagmiConfig config={config }>{children}</WagmiConfig>;
}
<WagmiProvider>
 //我们的入口组件内容
</WagmiProvider>
  1. 交互操作前先连接钱包
import { targetChain } from '@/components/common/WagmiProvider';
export function ConnectWallet(){
    //useConnect hooks连接钱包  输入chainId
    // 设置chainId之后,connect会自动添加和切换chain
    //connectors连接器。
    const { connectors, isLoading, pendingConnector, connect } = useConnect({
    chainId: targetChain.id,
    onError: (e) => {
      console.error(e);
      disconnect();
    }
  });
  const { disconnect } = useDisconnect()
  
  const onConnectWallet = useCallback(
    // 连钱包
    async () => {
      if (isLoading) { 
        return;
      }
      // connector是一种协议, 钱包和dapp之间的通信协议
      console.log('connectors', connectors);
      const connectorId ='io.metamask';
      const walletConnector = connectors.find(
        (item) => item.id === connectorId
      );
      if (!walletConnector) {
        return;
      }
      connect({
        connector: walletConnector
      });
    },
    [connect, connectors, isLoading]
  );
  
  return (<button onClick={onConnectWallet}> 点击连接钱包</button>)
}
  1. 读取合约
import {
  useAccount,//获取地址 和连接状态
  useContractRead,
} from 'wagmi';


//调用合约 
  const {
    isFetching: isFetchingBatchMintQuota,
    refetch: refetchBatchMintQuota
  } = useContractRead({
    abi: [
      {
        inputs: [],
        name: 'queryBatchMintQuota', 函数名 查询batchMint剩余额度
        outputs: [
          {
            internalType: 'uint32',
            name: '',
            type: 'uint32'
          }
        ],
        stateMutability: 'view',
        type: 'function'
      }
    ],
    functionName: 'queryBatchMintQuota',
    address: currentContractConfig.contractAddress as any,
    enabled: false
  });
  附加: 当调用refetch的时候才会真正的调用这个合约
  enable是一个触发条件, enable为true的时候组件加载的时候就会触发执行这个合约
  //调用合约并获取执行后的结果 
  try {
          const batchMintQuota = (await refetchBatchMintQuota()).data as number;
          console.log('batchMintQuota', batchMintQuota);
          if (batchMintQuota < mintAmount) {
            toast.error(`Insufficient supply! Please lower the batch size.`);
            return;
          }
        } catch (e) {
          console.error(e);
        }
  1. 发送交易 、发送交易后结果的处理
import {
  useAccount,
  useContractWrite,
  usePrepareContractWrite,
  useWaitForTransaction
} from 'wagmi';

  // enable是一个触发条件,enable为true的时候就会执行这个hooks
  // gas和gasPrice有值就会执行
  //发送交易之前的一些校验和准备操作
  const { config, error: prepareError } = usePrepareContractWrite({
    address: currentContractConfig.contractAddress as `0x${string}`,
    abi,
    functionName: abi[0].name,
    args: mintArgs,
    chainId: targetChain.id,
    enabled: !!gas && !!gasPrice,
    value: parseEther((price * mintAmount).toString(), 'wei'),
    gas,
    gasPrice,
    onError(e) {
      console.error(e);
    }
  });
  
    // write发送一个交易 当config有值的时候 才能生成write才能发送交易
    //发送交易
  const {
    data: writeResult,
    write,
    error,
    isLoading: isWriting
  } = useContractWrite(config); //上面获得的config
  
  
  //等待交易的结果
    const {
    isLoading: isWaitingHash,
    data: txResult,
    error: waitError
  } = useWaitForTransaction({
    hash: writeResult?.hash,
    enabled: !!writeResult?.hash
  });
  
  
    const mintedTokenIds: number[] = useMemo(() => {
    // polygon链的logs可能会有多条,需根据合约地址做filter
    const data = txResult?.logs.find(
      (item) =>
        item.address.toLowerCase() ===
          currentContractConfig.contractAddress.toLowerCase() &&
        item.topics[0]?.toLowerCase() ===
          '0x9aaed8bbdadec7577562f58a5615a8002b05c126e88a83a4852d7c69e0a9168d'
    )?.data;
    if (data) {
      const result = AbiCoder.defaultAbiCoder().decode(['uint32[]'], data)[0];
      if (result) {
        return result.map((item: any) => Number(item));
      } else {
        return [];
      }
    } else {
      return [];
    }
  }, [txResult?.logs]);

json-rpc调用

在服务端调用 JSON-RPC(Remote Procedure Call)通常涉及到向远程节点发送 HTTP 请求,并包含 JSON-RPC 格式的数据。以下是一个简单的 Node.js 示例,使用 axios 库向以太坊节点发起 JSON-RPC 请求:

首先,确保你的项目中安装了 axios:

bashCopy code
npm install axios

然后,你可以使用以下代码在服务端调用 JSON-RPC:

javascriptCopy code
const axios = require('axios');

async function callJsonRpc() {
    const rpcUrl = 'YOUR_JSON_RPC_ENDPOINT'; //通常为节点的地址
    const method = 'eth_getBalance';
    const params = ['0x1234567890123456789012345678901234567890', 'latest'];

    try {
        const response = await axios.post(rpcUrl, {
            jsonrpc: '2.0', //版本
            method: method, //方法名称
            params: params, //参数的数组
            id: 1,
        });

        console.log(response.data.result);
    } catch (error) {
        console.error('Error:', error.message);
    }
}

callJsonRpc();

在上述代码中:

  • rpcUrl 是 JSON-RPC 节点的地址。
  • method 是要调用的 JSON-RPC 方法,例如 eth_getBalance 用于获取账户余额。
  • params 是方法的参数数组,根据具体的 JSON-RPC 方法而定。

请注意,具体的 JSON-RPC 方法和参数会根据你的需求而变化,上述代码只是一个简单的示例。在实际应用中,你需要查看相关区块链或服务提供商的文档以了解可用的 JSON-RPC 方法和参数。

ChainIDE前端工程

内容学习

学习ChainIDE-一键切换的云端多链智能合约IDE 文档, 了解ChainIDE的定位和基本功能。

代码学习

前置说明: 我们的项目最好使用科学上网方式,推荐clash

vscode配置

我们的代码风格的vscode配置文件,仅供参考

{
  "editor.tabSize": 2,
  "search.followSymlinks": true,
  "files.autoSave": "off",
  "workbench.colorTheme": "SynthWave '84",
  "svn.path": "C://Program Files//TortoiseSVN//bin",
  "eslint.codeAction.showDocumentation": {
    "enable": true
  },
  "editor.formatOnPaste": false,
  "editor.formatOnSave": false,
  "prettier.configPath": ".prettierrc.js",
  "breadcrumbs.enabled": true, // 开启 vscode 文件路径导航
  "prettier.singleQuote": true, // prettier 设置强制单引号
  // "editor.defaultFormatter": "esbenp.prettier-vscode",*
  "editor.suggestSelection": "first",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit",
    "source.fixAll.tslint": "explicit",
    "source.fixAll.stylelint": "explicit"
  },
  // "typescript.validate.enable": false,
  // "javascript.validate.enable": false,
  "git.ignoreLimitWarning": true,

  "explorer.confirmDragAndDrop": false,
  "explorer.confirmDelete": false,

  "vetur.format.defaultFormatter.html": "js-beautify-html",
  "vetur.format.defaultFormatterOptions": {
    "js-beautify-html": {
      "wrap_attributes": "force-aligned"
    }
  },
  "vetur.validation.template": false,

  "eslint.options": {
    "extensions": [".js", ".jsx", ".vue", ".ts", ".tsx"]
  },

  "search.exclude": {
    "**/node_modules": true,
    "**/bower_components": true,
    "**/dist": true
  },

  "files.trimTrailingWhitespace": true,
  "files.associations": {
    "*.vue": "vue",
    "*.cjson": "jsonc",
    "*.wxss": "css",
    "*.wxs": "javascript"
  },
  "emmet.includeLanguages": {
    "wxml": "html"
  },
  "javascript.updateImportsOnFileMove.enabled": "always",

  "editor.rulers": [],
  "search.useGlobalIgnoreFiles": true,
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[json]": {
    "editor.defaultFormatter": "vscode.json-language-features"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "vscode.typescript-language-features"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "vscode.typescript-language-features"
  },
  "terminal.integrated.shell.windows": "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",
  "prettier.printWidth": 800,
  // LF/CRLF 换行符问题
  "files.eol": "\n",
  "cSpell.userWords": [
    "antd",
    "Aptos",
    "Authed",
    "authz",
    "bignumber",
    "Bootcamp",
    "borderless",
    "buaa",
    "bytecode",
    "cadut",
    "Callout",
    "canarynet",
    "chainbaas",
    "chaincode",
    "chainid",
    "ciphertext",
    "CKBADDR",
    "CKBADDRESS",
    "classname",
    "cmkmdkfd",
    "Coachmark",
    "Collateralized",
    "compilecontract",
    "confluxrpc",
    "defi",
    "demoday",
    "devkit",
    "Devnet",
    "Dfinity",
    "didchannel",
    "echarts",
    "ETHADDR",
    "ethersproject",
    "FILETREE",
    "fluentui",
    "formkit",
    "Gensis",
    "getrandomvalues",
    "Godwoken",
    "GODWOKENADDR",
    "Graphin",
    "Hackathon",
    "Hackthon",
    "Hyperledger",
    "IBSN",
    "immer",
    "introjs",
    "IPFS",
    "IRPC",
    "Jyanme",
    "keycloak",
    "konva",
    "LINKREFERENCE",
    "meditrust",
    "Mfetch",
    "motoko",
    "myinfo",
    "nanhang",
    "Nervos",
    "Offcanvas",
    "onflow",
    "onigasm",
    "Oper",
    "Pkgs",
    "polyjuice",
    "Polyman",
    "precommit",
    "prettierrc",
    "prevbutton",
    "pwcore",
    "qrcode",
    "rbac",
    "reduxjs",
    "REESTIMATE",
    "Reimagining",
    "Shannons",
    "SHORTADDRESS",
    "Sider",
    "soljson",
    "stylelint",
    "succ",
    "tailwindcss",
    "tyname",
    "uifabric",
    "unauthenticate",
    "VITE",
    "vspark",
    "WASM",
    "WEBFILE",
    "welcomeheader",
    "whitematrix",
    "xform",
    "Yokai",
    "yokaiswap",
    "yuanyuzhou",
    "yzjadmin"
  ],
  "blueprint.templatesPath": [
    "D:\blueprint-templates"
],
  "git.ignoreRebaseWarning": true,
  "editor.fontSize": 16,
  "editor.unicodeHighlight.allowedCharacters": {
    ":": true
  },
  "editor.inlineSuggest.enabled": true,
  "[javascriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[less]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[css]": {
    "editor.defaultFormatter": "vscode.css-language-features"
  },
  "[scss]": {
    "editor.defaultFormatter": "vscode.css-language-features"
  },
  "github.copilot.enable": {
    "*": true,
    "yaml": true,
    "plaintext": false,
    "markdown": false
},
  "terminal.integrated.defaultProfile.windows": "Git Bash",
  "editor.wordWrap": "on",
  "security.workspace.trust.untrustedFiles": "open",
  "editor.unicodeHighlight.allowedLocales": {
    "es": true,
    "zh-hans": true
  },
  "git.enabled": true,
  "git.path": "/usr/bin/git",
  "settingsSync.ignoredSettings": [
    "files.eol"
  ],
  "terminal.integrated.tabs.enabled": false,
  "window.commandCenter": false
}

仓库

简单的钱包连接

hanyanmer/walletDemo: demo of connecting to Ethereum via wallet (github.com)