全面掌握Solidity智能合约开发

2024年11月25日更新 208 人订阅
原价: ¥ 26 限时优惠
专栏简介 比特币区块结构Merkle树及简单支付验证分析 非对称加密技术- RSA算法数学原理分析 智能合约语言 Solidity 教程系列2 - 地址类型介绍 剖析非同质化代币ERC721-全面解析ERC721标准 搞懂 Solidity 事件Event - 如何在DApp中使用 以太坊扩容 之 分片(Sharding) 智能合约语言 Solidity 教程系列12 - 库的使用 深入理解Plasma(四)Plasma Cash 技术工坊42期 - 区块链子链技术及墨客链的实现方案 脱颖而出 | 成都链安入选『腾讯区块链加速器全球32强』 参与Eth2 Staking系列(2) - 激励篇 应用案例之黄金资产证券化Digix白皮书和DGD解读 全面理解智能合约升级 测试文章123456 简析主流匿名币:Dash、门罗币、Zcash、SERO 以太坊ERC1155协议分析及代码测试 Hyperledger Fabric 1.4 Kafka分布式环境搭建 跟我学 Solidity :开发环境 跟我学 Solidity:关于变量 跟我学 Solidity : 变量的存储 跟我学 Solidity :引用变量 跟我学 Solidity :函数 跟我学 Solidity :合约的创建和继承 跟我学 Solidity :工厂模式 用Web3.js构建第一个Dapp 跟我学Solidity:事件 Solidity 中 immutable (不可变量)与constant(常量) [译] Solidity 0.6.x更新:继承 解析 Solidity 0.6 新引入的 try/catch 特性 探究新的 Solidity 0.8 版本 探索以太坊合约委托调用(DelegateCall) 停止使用Solidity的transfer() 使用工厂提高智能合约安全性 Solidity 怎样写出最节省Gas的智能合约[译] Solidity 优化 - 编写 O(1) 复杂度的可迭代映射 Solidity 优化 - 控制 gas 成本 Solidity 优化 - 减少智能合约的 gas 消耗的8种方法 Solidity 优化 - 如何维护排序列表 Solidity 优化:打包变量优化 gas 在 Solidity中使用值数组以降低 gas 消耗 Solidity 技巧:如何减少字节码大小及节省 gas 计算Solidity 函数的Gas 消耗 "Stack Too Deep(堆栈太深)" 解决方案 合约实践:避免区块Gas限制导致问题 如何缩减合约以规避合约大小限制 Solidity 类特性 安全的处理 ERC20 转账(解决非标准 ERC20 问题) Solidity 十大常见安全问题 [译]更好Solidity合约调试工具: console.log 智能合约开发的最佳实践 - 强烈推荐

用Web3.js构建第一个Dapp

Web3.js 使用的实用介绍

欢迎订阅《Solidity 智能合约专栏》系列文章。 在上一篇中,我们看到了如何实现工厂模式。 如果你一直在跟着这个系列学习,那么你已经掌握了编写自己的智能合约。

因此,今天给大家介绍一下构建去中心化应用的全貌,并向大家介绍一下web3.js,这是构建dapp不可缺失部分。

在深入了解web3.js是什么以及它的工作原理之前,我想先回答一个简单的问题 - 为什么选择web3.js? 来开启这个话题:

dapp的结构

图片来源: GitHub上的ethereumbook

去中心化应用有三个主要组成部分。

  • 前端。 从用户那里获取输入,并建立发送到智能合约的请求。
  • 钱包。 签署交易并将其发送到网络。
  • 智能合约。 这里编写dapp的业务逻辑的地方。

现在的问题是如何用JavaScript 在前端与智能合约交互。

在web3.js出现之前,我们与智能合约交互的唯一方式是通过以太坊节点提供的json-rpc API, API 由节点提供,节点作为json-rpc服务器。 使用 json-rpc 可不是一件容易的事。

但由于web3.js,你不必再担心JSON-RPC调用的低层细节,因为它提供了以太坊 json-rpc接口的抽象。 因此,你可以使用纯JavaScript开始与以太坊节点进行交互。 简单地说,web3.js 就是用JavaScript把 JSON-RPC API 封装了。

web3.js是如何工作

正如我们之前所说的,为了与以太坊网络进行交互,我们需要向以太坊节点发送json-rpc调用,这就是web3.js的底层工作。 那么它是如何做到的呢?

为了将JavaScript代码翻译成json-rpc请求,web3.js使用了称之为provider(提供者),它是一个符合EIP 1193规范的JavaScript对象,负责实现以太坊 RPC方法调用的request方法。 Web3.js对上述规范有自己的实现,并将其放在web3.provider下,你可以访问web3文档中提到的以下三个provider:HttpProviderWebsocketProviderIpcProvider

其他项目也实现了这一规范,如MetaMask,它在浏览器中注入了window.ethereum下的提供者对象。

一旦我们有了一个提供者,我们就可以使用new关键字获得web3的实例。

let web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546');

在这里你应该记住的是,web3.js需要一个provider对象,配置好钱包的信息,它将签署交易并将其发送到网络。 如果你在前端使用web3,这个提供者将被注入到浏览器中,或者你使用websocketproviderIpcProvider自己建立一个提供者对象。

注:MetaMask使用Infura作为节点提供者。 这就是为什么你不需要在电脑上安装以太坊客户端就能与以太坊网络进行交互的原因

快速查看Web3 API

web3.js不仅可以与以太坊节点进行通信,还可以与Whisper和Swarm节点进行通信。 它有五个主要包 :

  • web3.eth。 允许与以太坊区块链和以太坊智能合约进行交互。
  • web3.bzz: 允许与去中心化文件存储Swarm进行交互。
  • web3.shh: 允许与Whisper协议进行互动广播。
  • web3.utils。 为以太坊 dapp提供实用功能,比如将字符串转换为十六进制,将以太币转换为Wei。
  • web3.*.net: 允许与以太坊节点的网络属性进行交互,如网络ID或对连接节点数量。

用web3.js构建第一个Dapp

现在我们已经把理论讲完了,让我们动手去构建我们的第一个dapp。 在这个例子中,我们将建立一个问候语dapp,存储一个默认的问候语字符串,并允许用户更新它。 对于钱包,我们将使用MetaMask。 你可以点击MetaMask 官网主页上的下载链接来添加扩展。

1. 创建合约并部署到网络上

首先在你的工作区创建一个名为 greeting的空项目,并使用 truffle init初始化它。


>...

剩余50%的内容订阅专栏后可查看

点赞 5
收藏 3
分享

0 条评论

请先 登录 后评论