首页 > 其他分享 >【web3.0】Web3 开发教程与代码资源:探索如何在Web3项目中开发应用

【web3.0】Web3 开发教程与代码资源:探索如何在Web3项目中开发应用

时间:2024-08-05 09:28:16浏览次数:10  
标签:const web3.0 proposals js Web3 开发 Voting 合约

引言

Web3,作为区块链技术和互联网融合的产物,正逐步重塑我们对数字世界的理解与交互方式。它不仅仅是一个技术概念,更是一个去中心化、用户主权的网络愿景,旨在通过智能合约、去信任的交易和加密货币等技术手段,为用户提供前所未有的数据安全性和经济自主权。本教程将引导你从零开始,了解Web3的基本概念,并通过实际代码示例探索如何在Web3项目中开发应用。

第一部分:Web3基础

1. 理解区块链

  • 定义:区块链是一种去中心化的、分布式的数据库,通过密码学算法保证数据的不可篡改和不可伪造。
  • 关键特性:去中心化、数据不可篡改、透明性、智能合约。
  • 主流平台:以太坊、比特币、波卡等。

2. 智能合约

  • 定义:智能合约是自动执行、控制或记录事件和动作的计算机程序,运行在区块链上。
  • 开发语言:Solidity(以太坊最常用的语言)、Vyper等。
  • 工作原理:通过触发条件自动执行预设操作,如转账、数据记录等。

3. 加密货币与钱包

  • 加密货币:如比特币、以太币,是区块链网络上的数字资产。
  • 钱包:用于存储、发送和接收加密货币的工具,分为热钱包和冷钱包。
  • 私钥与公钥:私钥用于签名交易,公钥用于验证签名和接收资产。

第二部分:开发环境搭建

1. 安装Node.js和npm

  • 访问Node.js官网下载并安装最新稳定版。
  • 通过命令行验证安装:node -v 和 npm -v

2. 设置以太坊开发环境

  • 安装Ganache:一个以太坊区块链模拟器和测试网络,用于开发和测试智能合约。
  • 安装Truffle:一个开发框架,支持智能合约的编译、部署和测试。
  • 初始化Truffle项目:truffle init

3. IDE和编辑器

  • 推荐使用Visual Studio Code或Remix IDE(在线IDE,专注于Solidity)。

第三部分:开发一个简单的去中心化应用(DApp)

我们将使用以太坊区块链作为示例平台,因为它是最成熟且广泛使用的公链之一。 

1.目标

  • 创建一个简单的投票 DApp。
  • 用户可以创建投票议题。
  • 用户可以参与投票。
  • 可以查看投票结果。

2.技术栈

  • Solidity:以太坊智能合约编程语言。
  • Truffle:以太坊项目管理框架。
  • Ganache:本地以太坊测试网络。
  • React.js:前端 JavaScript 库。
  • MetaMask:浏览器扩展钱包。

第一步:设置环境

  1. 安装 Node.js:确保你的机器上已经安装了最新版本的 Node.js。
  2. 安装 Truffle:通过 npm 安装 Truffle。
    npm install -g truffle

第二步:创建 Truffle 项目

  1. 初始化项目:创建一个新的 Truffle 项目。
truffle init my-voting-app
cd my-voting-app

第三步:编写智能合约

  1. 创建合约文件:在 contracts 文件夹下创建一个名为 Voting.sol 的文件。
  2. 编写智能合约
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Voting {
    struct Proposal {
        bytes32 name;
        uint voteCount;
    }

    address public chairperson;
    mapping(address => bool) voters;
    Proposal[] public proposals;

    constructor(bytes32[] memory proposalNames) {
        chairperson = msg.sender;
        voters[chairperson] = true;
        for (uint i = 0; i < proposalNames.length; i++) {
            proposals.push(Proposal({
                name: proposalNames[i],
                voteCount: 0
            }));
        }
    }

    function giveMeTheRightToVote() public {
        require(!voters[msg.sender]);
        voters[msg.sender] = true;
    }

    function vote(uint proposal) public {
        require(voters[msg.sender]);
        require(proposal < proposals.length);
        proposals[proposal].voteCount += 1;
    }

    function winningProposal() public view returns (uint winningProposal_) {
        uint winningVoteCount = 0;
        for (uint p = 0; p < proposals.length; p++) {
            if (proposals[p].voteCount > winningVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
        return winningProposal_;
    }
}

第四步:编译智能合约

  1. 添加合约到迁移文件:在 migrations 文件夹下创建一个新文件,例如 2_deploy_contracts.js
const Voting = artifacts.require("Voting");

module.exports = function(deployer) {
    deployer.deploy(Voting, ["Proposal 1", "Proposal 2"]);
};

     2.编译并部署合约

truffle compile
truffle migrate

第五步:启动本地测试网络

  1. 安装 Ganache:下载并安装 Ganache。
  2. 运行 Ganache:启动 Ganache,获取测试网络的地址和端口。

第六步:创建前端应用

  1. 创建 React 应用:使用 Create React App 创建一个新项目。

npx create-react-app frontend
cd frontend

    2.安装 Web3.js 和 Truffle 合约

npm install web3 truffle-contract

    3.编写 React 组件:在 src 文件夹下创建 App.js

import React, { useState, useEffect } from 'react';
import Web3 from 'web3';
import Voting from '../truffle/build/contracts/Voting.json';

const web3 = new Web3(Web3.givenProvider || 'http://localhost:7545');

function App() {
    const [account, setAccount] = useState('');
    const [contract, setContract] = useState(null);
    const [proposals, setProposals] = useState([]);
    const [selectedProposal, setSelectedProposal] = useState(0);

    useEffect(() => {
        async function loadBlockchainData() {
            const accounts = await web3.eth.getAccounts();
            setAccount(accounts[0]);

            const networkId = await web3.eth.net.getId();
            const deployedNetwork = Voting.networks[networkId];
            const instance = new web3.eth.Contract(
                Voting.abi,
                deployedNetwork && deployedNetwork.address
            );
            setContract(instance);

            const proposalNames = await Promise.all(
                instance.methods.proposals().call().map(async (proposal, index) => {
                    const name = await instance.methods.proposals(index).call();
                    return name.name;
                })
            );
            setProposals(proposalNames);
        }
        loadBlockchainData();
    }, []);

    async function vote() {
        if (!contract) return;
        await contract.methods.vote(selectedProposal).send({ from: account });
    }

    return (
        <div>
            <h1>Voting DApp</h1>
            <p>Account: {account}</p>
            <ul>
                {proposals.map((proposal, index) => (
                    <li key={index}>{proposal}</li>
                ))}
            </ul>
            <select value={selectedProposal} onChange={(e) => setSelectedProposal(e.target.value)}>
                {proposals.map((proposal, index) => (
                    <option key={index} value={index}>{proposal}</option>
                ))}
            </select>
            <button onClick={vote}>Vote</button>
        </div>
    );
}

export default App;

    4.修改 public/index.html:将 MetaMask 的链接加入 HTML 中。

<link rel="stylesheet" href="https://unpkg.com/metamask-button/dist/metamask-button.css" />
<script src="https://unpkg.com/metamask-button/dist/metamask-button.js"></script>

    5.运行 React 应用

npm start

第七步:使用 MetaMask

  1. 安装 MetaMask:在浏览器中安装 MetaMask 扩展。
  2. 连接 MetaMask:确保 MetaMask 连接到 Ganache 提供的测试网络。
  3. 使用 DApp:打开 React 应用,与智能合约交互。

总结

以上步骤介绍了如何构建一个简单的基于以太坊的投票 DApp。你可以在此基础上扩展功能,比如增加用户认证、更复杂的权限控制等。如果你有任何问题或遇到困难,请随时提问!

附加资源

标签:const,web3.0,proposals,js,Web3,开发,Voting,合约
From: https://blog.csdn.net/weixin_51306394/article/details/140914309

相关文章

  • Git 开发规范
    文章目录Git开发规范分支管理策略gitflowgithubflowgitlabflowtrunk-baseddevelopment总结CommitMessageGit开发规范分支管理策略gitflowVincentDriessen于2010年提出的分支模型,可以说是最早、最全面的分支管理策略了,后续出现的分支管理策略基本都是......
  • 前端开发中最炙手可热的当红辣子鸡 Vue 3 简介及入门实例
    前言之前已经学习过来HTML、CSS以及JavaScript的相关知识,也算是基本了解了关于这前端三件套的一些基本用法。今天就来了解下,当前前端开发中最炙手可热的当红辣子鸡-Vue。本文主要介绍Vue的一些入门知识和最经典的Vue入门HelloWorld程序,如果你想了解的是更高......
  • 【Unity】3D功能开发入门系列(四)
    Unity3D功能开发入门系列(四)一、组件的访问(一)组件的调用(二)组件的参数(三)引用别的组件(四)引用脚本组件(五)消息调用二、物体的访问(一)获取物体(二)父子物体(三)物体的操作(四)练习:俄罗斯方块三、资源的访问(一)资源的使用(二)资源数组(三)练习:三色球四、定时调用(一)定时调用(二)定时与线程(三......
  • 学生管理系统之数据库设计与开发
    学生管理系统之数据库设计与开发使用SQL创建表格QT上写逻辑创建一个类<......
  • 英语.Net多语言开发中的问题
    问题与现象多语言开发是一件成本很高的事情。很多公司会退而求其次选择只开发英文版本的软件分发到不同国家,但这里仍存在不同问题。我们就遇到了这样的问题,参考下面的代码。CultureInfo culture;double number =1.5;culture = CultureInfo.CreateSpecificCulture(......
  • 【ESP01开发实例】-ESP-01驱动DS1307/DS1321实时时钟模块
    ESP-01驱动DS1307/DS1321实时时钟模块文章目录ESP-01驱动DS1307/DS1321实时时钟模块1、DS1307/DS1321介绍2、硬件准备与接线3、代码实现本文将介绍如何使用ESP8266(ESP-01)模块、DS3231RTC或DS1307RTC和16×2LCD构建实时时钟。时间和日期显示在......
  • 【ESP01开发实例】-ESP-01驱动DHT11和DH22传感器
    ESP-01驱动DHT11和DH22传感器文章目录ESP-01驱动DHT11和DH22传感器1、DHT11/DHT22传感器介绍2、LCD1602介绍3、硬件准备与接线4、代码实现本主题介绍如何使用DHT11和DHT22相对湿度和温度传感器与ESP8266ESP-01Wi-Fi模块,将相对湿度和温度的测量值显......
  • 【ESP01开发实例】-ESP-01驱动LCD1602 I2C
    ESP-01驱动LCD1602I2C文章目录ESP-01驱动LCD1602I2C1、LCD1602介绍2、硬件准备与接线3、代码实现ESP8266ESP-01模块只有8个引脚,其中4个可用作I/O(输入/输出)引脚(GPIO0、GPIO2、RX和TX),这个I/O引脚数量不足以运行16个引脚。×2LCD屏,至少需要......
  • 陀螺仪LSM6DSOW开发(7)----融合磁力计进行姿态解算
    陀螺仪LSM6DSOW开发.7--融合磁力计进行姿态解算概述视频教学样品申请源码下载硬件准备DataLogFusion磁力计校准过程初始化磁力计MFX_Arithmetic_Init卡尔曼滤波算法演示概述MotionFX库包含用于校准陀螺仪、加速度计和磁力计传感器的例程。将磁力计的数据与加速度计......
  • 2--Web前端开发-JavaScript
    引入方式1、内部脚本:将JS代码定义在HTML页面中JavaScript代码必须位于<script></script>标签之间在HTML文档中,可以在任意地方,放置任意数量的<script>一般会把脚本置于<body>元素的底部,可以改善显示速度<script>alert("hellojavascript");</script>可放在代码中任意位......