怎么使用Web3.js开发一个简单的Dapp

2023-11-12

通过这篇文章,我们将学习 Dapps 和 Web3js 的基础知识。

让我们了解一下基本术语——区块链、去中心化应用程序、以太坊、智能合约、web3js。

区块链

区块链是一个可审计且不可逆的数据库,其中数据只能添加。在区块链中,数据可以作为块添加,其中每个块都有前一个块的地址,因此称为区块链。

以太坊

以太坊是一个基于区块链的开源去中心化平台,用于运行我们的智能合约。它不仅是一种加密货币,还是一种复杂的应用程序,可以在区块链上执行智能合约,以避免交易中出现任何欺诈企图。我们使用以太坊虚拟机 (EVM) 作为运行智能合约的运行时。

智能合约

智能合约是由 EVM 编译和执行并存储在区块链上的程序片段。当满足预定义的条件时,它会自动执行。它可以帮助您在没有第三方参与的情况下进行安全交易。基于智能合约的交易的好处在于,这些交易是不可逆转的,但可以追踪。

Solidity 是使用最广泛的编程语言来创建和编写智能合约,尽管市场上还有其他语言,如 Mutan、Serpent 和 LLL。

去中心化应用程序(Dapps)

Dapp 是在区块链或去中心化网络上执行的程序。Dapp 是 Decentralized application 的缩写。它不受单个组织的控制,并在不受中央控制的区块链网络上运行。

去中心化应用程序包含三个主要组件:

  • frontend:接受用户的输入并将请求发送到智能合约。
  • wallet:验证交易并连接到相应的区块链。
  • Smart contracts(智能合约):一个自动执行的程序,包含 dapp 的业务逻辑。

一些 Dapp 的功能是,

  • No downtime ——Dapp 在计算机的点对点网络上运行,因此不会有停机时间或限制,因为它不依赖于单点故障,这与托管服务器不同。
  • Transparency(透明度) ——来自去中心化应用程序的数据存储在公共分类账上,以安全透明的方式跟踪所有内容,任何人都无法篡改。

Web3.js

Web3.js 是使用 HTTP、IPC 或 WebSocket 与以太坊节点交互的库的集合。它内部提供了 JSON-RPC 等 JavaScript API 来与 geth 通信。它可以与任何支持 JSON-RPC 的以太坊节点通信,并将所有 JSON-RPC API 公开为 JavaScript API。

怎么运行的

 

Web3.js 使用 JSON RPC 与以太坊区块链通信,JSON RPC 代表远程过程调用协议。以太坊是一个点对点节点网络,在区块链上存储所有数据和代码的副本。Web3.js 通过向以太坊节点发出 JSON RPC 请求来读取和写入网络数据,类似于将 jQuery 与 JSON API 一起使用。

为了将 JavaScript 代码转换为 json-rpc 请求,web3.js 提供给使用者进行以太坊 RPC 方法调用的请求方法。Web3.js 有自己的上述规范的实现,并在 web3.providers、HttpProvider、WebsocketProvider 和 IpcProvider 下可用。

Web3.js 包

web3.js 自带五个主要包

  • web3.eth:与以太坊区块链和智能合约交互。
  • web3.bzz:与 Swarm 等去中心化文件存储交互。
  • web3.shh:与 Whisper 协议交互以进行广播。
  • web3.utils:包含实用函数,例如将字符串转换为十六进制文字,将以太值转换为 Wei。
  • web3.*.net:与以太坊节点的网络属性交互,例如网络 ID 或对等点数。

第一个 Dapp

我们已经了解了基本概念。现在,让我们深入了解第一个 dApp。

1.设置环境

基本上,dApp 需要在您的系统上安装 nodejs、truffle 和 ganache。

  • Node.js  - 一种开源 JavaScript 运行时环境,用于在 Web 浏览器外部执行 JavaScript 代码。
  • Truffle  - 以太坊最受欢迎的开发框架。
  • Ganache  - 提供一个本地网络,在 IDE/控制台上显示不同的测试/真实区块链账户和交易。它是 Truffle 套件的一部分。
  • Solc  - 用于 Solidity 编译器的 JavaScript 绑定。下载并安装 node.js。
  • 全局安装 Truffle。
 npm install -g truffle

 

 


软件安装完成。现在,我们可以设置项目了。
让我们通过创建一个名为 dapp-demo 的项目文件夹来开始构建我们自己的 dapp。切换到文件夹并使用 truffle 进行初始化。

 
  mkdir dapp-demo
  cd dapp-demo
  truffle init


truffle init创建必要的项目文件,其中包括Migrations.sol,1_initial_migration.jstruffle-config.js
初始项目结构将如下所示,

 

2. 编写合约

现在,我们可以创建一个hello智能合约。创建一个名为的文件Greeting.sol并将其放在contracts文件夹下,并向其中添加以下代码。

  // SPDX-License-Identifier: MIT
  pragma solidity >=0.4.22 <0.9.0;
  contract Greeting {
    string public greeting = "hello";  
    function sayHello() external view returns (string memory) {
        return greeting;
    }  
    function updateGreeting(string calldata _greeting) external {
        greeting = _greeting;
    }
  }

3.设置迁移

在 migrations 文件夹中新建一个前缀大于 1 的文件,例如 2_greeting_migartion.js 来部署 HelloWorld.sol 合约。

  const Greeting = artifacts.require("Greeting");
  module.exports = function (deployer) {
      deployer.deploy(Greeting);
  };

4.编译部署

使用以下命令编译您的项目

 truffle compile


build编译成功后在项目文件夹中创建 该文件夹。

现在,我们需要使用 Turffle 和 Ganache 来部署和测试合约。为此,打开 Ganache,选择“QuickStart”。

truffle-config.js通过取消注释开发部分来修改网络详细信息, 提及您希望在其上部署智能合约的网络。

确保来自 Ganache 的 RPC 服务器端口映射到该networks.port值。 使用以下命令部署合约。
 

 truffle deploy --network development

部署成功后,您将获得一些合约详细信息,例如合约地址和区块信息。

 

5.连接前端与智能合约

5.1 设置环境

在根目录下新建文件夹client,使用npm初始化。
安装 web3.js 和 lite-server 依赖项:

  mkdir client
  cd client
  npm init
  npm install web3
  npm install lite-server --save-dev
  npm install jquery






创建一个名为 src 的新文件夹并添加两个脚本:index.jsutils.js. 您还需要在根文件夹(客户端文件夹)下创建index.html文件并向其中添加以下代码。

 

  <!DOCTYPE html>
  <html lang="en">
  <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Dapp Demo</title>
  </head>
  <body>
      <h1>Dapp Demo</h1>
      <br/>
      <h2></h2>
      <form id="form">
          <input id="input" type="text"/>
          <input type="submit" value="submit"/>
      </form>
      <script type="text/javascript" 
 src="node_modules/jquery/dist/jquery.min.js"></script>
      <script type="text/javascript" src="node_modules/web3/dist/web3.min.js"></script>
      <script type="text/javascript" src="src/utils.js"></script>
      <script type="text/javascript" src ="src/index.js"></script>
  </body>
  </html>

5.2 获取一个web3实例

一旦将 web3.js 作为项目的依赖项,您需要做的就是使用提供程序的实例实例化 web3 对象。在此演示中,我们将学习使用其 RPC 服务器地址与 ganache 连接。

打开 util.js 文件以getWeb3()创建使用 Ganache RPC 服务器地址创建 web3js 实例。

  const getWeb3 = () => {
    return new Promise((resolve, reject) => {
      window.addEventListener("load", async () => {
          try {
            const web3 = new Web3("http://127.0.0.1:7545");
            resolve(web3);
          } catch (error) {
            reject(error);
          }
      });
    });
  };

5.3 创建合约实例

为了创建合约实例,我们需要合约 ABI 及其地址。如果查看构建目录中的工件,您会发现一个名为Greeting.json. 打开后会发现很多关于合约的信息,包括合约名称,ABI等。

在 client 文件夹下创建一个名为 contracts 的新文件夹,然后复制粘贴该Greeting.json文件。

首先,我们需要使用 获取 Ganache 连接到的网络的 ID web3.eth.net.getId()。使用返回的 ID 从文件中获取合约的地址Greeting.json,这也将为我们提供合约 ABI 并将使用创建合约的实例web3.eth.Contract

在文件中创建一个getContract()方法util.js并向其中添加以下代码。

  const getContract = async (web3) => {
    const data = await $.getJSON("./contracts/Greeting.json");
    const netId = await web3.eth.net.getId();
    const deployedNetwork = data.networks[netId];
    const greeting = new web3.eth.Contract(
      data.abi,
      deployedNetwork && deployedNetwork.address
    );
    return greeting;
  };

5.4 智能合约

创建合约实例后,我们可以开始调用方法,

myContract.methods.myMethod([arguments]).

如果该函数是纯函数或只读函数,您可以使用以下方式调用它,

 myContract.methods.myMethod([arguments]).call()

如果函数可以修改状态,你可以调用它,

myContract.methods.myMethod([arguments]).send()

最后,将以下内容添加到文件中index.js

const displayGreeting = async (greeting, contract) => {
    greeting = await contract.methods.sayHello().call();
    $("h2").html(greeting);
  };
  const updateGreeting = (greeting, contract, accounts) => {
    let input;
    $("#input").on("change", (e) => {
      input = e.target.value;
    });
    $("#form").on("submit", async (e) => {
      e.preventDefault();
      await contract.methods
        .updateGreeting(input)
        .send({ from: accounts[0], gas: 40000 });
      displayGreeting(greeting, contract);
    });
  };
  async function greetingApp() {
    const web3 = await getWeb3();
    const accounts = await web3.eth.getAccounts();
    const contract = await getContract(web3);
    let greeting;
    displayGreeting(greeting, contract);
    updateGreeting(greeting, contract, accounts);
  }
  greetingApp();

最终的项目结构将如下所示,

 

5.5 运行应用

开发完成。现在,我们可以在将启动脚本添加到文件后运行项目package.json

  "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1",
      "start": "lite-server"
   },

使用以下命令运行项目。

  npm start


就这样,就创建好您的第一个Dapp啦!​​​​​​​

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

怎么使用Web3.js开发一个简单的Dapp 的相关文章

  • tp5循环插入百万数据模块不存在:error

    话不多说 直接进正题 今天清洗数据过程中 发现每次插入到700多条就会出现这个错误 刚开始以为是请求时间有限制 修改了apipost的请求时间也不行 修改了apache的最大请求时间还是不行 1 修改php最大运行时间 修改php ini文
  • Redis分布式锁----乐观锁的实现,以秒杀系统为例

    摘要 本文使用redis来实现乐观锁 并以秒杀系统为实例来讲解整个过程 本文源码请在这里下载 https github com appleappleapple DistributeLearning 乐观锁 大多数是基于数据版本 versio

随机推荐

  • 微信小程序实现跳转到另外一个小程序的方法

    微信小程序实现跳转到另外一个小程序的方法 1 首先需要在当前小程序app json中定义 需要跳转的小程序的app id app josn navigateToMiniProgramAppIdList appid 第一种方法 wx navi
  • teamviewer quicksupport 插件(下载)

    teamviewer是一款远程控制软件 免费 比较好的 teamviewer quicksupport是一款支持手机可以被远程控制软件 需要下载插件 有对应手机品牌的插件 例如有HUAWEI LG等 电脑下载 teamviewer quic
  • 基于图像深度学习的无线电信号识别

    利用图像深度学习解决无线电信号识别问题的技术思路 首先把无线电信号具象化为一张二维图片 将无线电信号识别问题转化为图像识别领域的目标检测问题 进而充分利用人工智能在图像识别领域的先进成果 提高无线电信号识别的智能化水平和复杂电磁环境下的识别
  • C++的函数重载详解

    函数名相同 提高函数复用性 同一个作用域 下 函数名相同 参数的个数或类型或顺序不同 都可以作函数重载 注意 返回值类型不同不能作为函数重载 两个特殊情况 1 函数重载遇上引用与常量引用 void func int a void func
  • #pragma once和#ifndef的作用和区别

    两者共同的作用 防止库文件重复包含 ifndef define endif 方法一 在 h头文件开头加上 pragma once add h pragma once int ADD x y 方法二 在 h头文件加上预定义指令 add h i
  • Python-Anaconda最新安装图文教程

    Anaconda简介 Anaconda是一种数据科学和机器学习的开发环境 它包含了大量的Python包 工具和库 以及可视化界面和集成开发环境 Anaconda可以方便地管理Python环境和安装第三方软件包 同时也支持多个操作系统和平台
  • vue 组件通信方式你知道几种,这6种一定得掌握

    第一种props 适用于的场景 父子组件通信 注意事项 如果父组件给子组件传递数据 函数 本质其实是子组件给父组件传递数据 如果父组件给子组件传递的数据 非函数 本质就是父组件给子组件传递数据 书写方式 3种 todos type Arra
  • PTP(Precision Time Protocol)高精度时间同步协议+CS模式测试代码

    Precision Time Protocol PTP 一 什么是PTP PTP 是一种高精度时间同步协议 可以到达亚微秒级精度 有资料说可达到30纳秒左右的偏差精度 但需要网络的节点 交换机 支持PTP协议 才能实现纳秒量级的同步 一般在
  • 深入浅出 redux中间件

    redux中间件是什么 理解redux中间件首先我们需要理解redux是什么 Redux是JavaScript应 的状态容器 它保证程序 为 致性且易于测试 当业务足够复杂时 我们就需要使用redux来存储我们的多页面共同数据 redux的
  • 现行安全存储策略-密码加盐

    本文描述了本人 对于数据库中如何保存密码的认识过程 从最简单的明文保存到密码加盐保存 下面与大家分享下 第一阶段 最开始接触web开发时 对于用户表的密码基本是明文保存 如 username password zp1996 123456 z
  • 利用js实现简单抽奖功能

    其实这种抽奖的功能和选人是一样的 在点击开始按钮之后 标题上方的名字可以实现一个不停的变化 在点击停止之后抽出获奖的名字 在写之我们必须明确一点的是需要用到哪些方法 并且将基础的框架搭建出来 下面是功能实现的视频展示 如下 抽奖 基本的样式
  • OpenCv案例(四): 基于OpenCvSharp对图像轮廓提取与面积和周长计算

    1 需求 提取图像中物体的轮廓以及计算该面积和周长 2 详细代码如下 public static void GetOutline try region 加载图像 Mat src Cv2 ImRead srcImg bmp if src Em
  • python连接Oracle数据库代码

    import cx Oracle as oracle db oracle connect 用户名 密码 IP 端口号 SERVICE NAME db oracle connect admin password IP 1521 DataBas
  • 微信小程序把页面做成图片分享【原创】

    开发微信小程序的时候 经常要遇到如上图这样的 保存小程序二维码图片的分享功能 网上找了很多都没有具体的写法 于是自己看官方文档写了一个 分享一下 首先 需要在 wxml 中 创建一个 画板 canvas wxml
  • Matlab 绘制虚数和复数数据图

    Matlab 绘制虚数和复数数据图 在 Matlab 中 我们可以使用 plot 函数来绘制实数数据图 但是当数据包含虚部时 我们需要使用另一种方式来绘制 Matlab 中的虚数和复数数据可以用两种方式表示 一种是把虚数表示为 i 即 j
  • 6.3-训练DNN的技巧

    文章目录 一 新的激活函数 New activation function 1 1 校正线性单元 Rectified Linear Unit 1 2 Maxout 二 自适应学习率 Adaptive Learning Rate 2 1 Mo
  • 红帽子Linux6.5 X86_64 自动重启解决办法

    机器重启前的15分钟 都会有一个报错 usr sbin bmc watchdog fiid obj get present countdown value data not available redhat对此有说明https access
  • qt中的tableView中的排序

    一 第三列的排序方式 1 第3列是按照升序来排列 ui gt tableView gt sortByColumn 3 Qt AscendingOrder 第3列是按照升序来排列 ui gt tableView gt setSortingEn
  • 弱网测试—Network-Emulator-Toolkit

    弱网测试 属于健壮性测试 怎么样去做弱网测试呢 一 安装弱网测试工具 Network Emulator Toolkit 推荐一个工具 Network Emulator Toolkit 这个工具的作用主要是设置丢包率和延时 1 安装与卸载 下
  • 怎么使用Web3.js开发一个简单的Dapp

    通过这篇文章 我们将学习 Dapps 和 Web3js 的基础知识 让我们了解一下基本术语 区块链 去中心化应用程序 以太坊 智能合约 web3js 区块链 区块链是一个可审计且不可逆的数据库 其中数据只能添加 在区块链中 数据可以作为块添