掀起区块链开发狂潮!Scaffold-eth带你一键打造震撼DApp

文章目录

  • 前言
  • 一、Scaffold-eth是什么?
  • 二、安装和配置
    • 1.准备工作
    • 2.安装
    • 3.配置开发环境
  • 三、进阶使用
    • 1.放入自己的合约
    • 2.部署运行
  • 总结


前言

前面的文章传送🚪:hardhat入门 与 hardhat进阶

在之前的文章中,我们已经探讨了使用Hardhat框架来开发以太坊智能合约的方法。本文将介绍另一个强大的工具——Scaffold-eth,它更加注重全栈式的开发体验,提供了一个集成了Hardhat、React和其他工具的开发环境。帮助我们更轻松地构建完整的以太坊去中心化应用(DApp)

在这里插入图片描述

一、Scaffold-eth是什么?

官网点击此处
doc文档指南点击此处
Scaffold-eth是一个基于以太坊的开发框架,旨在简化以太坊智能合约和前端应用程序的开发过程。它提供了一个集成了Hardhat、React和其他工具的开发环境,帮助开发者更轻松地构建以太坊去中心化应用(DApp)。

具体来说,Scaffold-eth的特点包括:

  • 全栈式开发环境:Scaffold-eth提供了一个完整的开发环境,包括智能合约的编写、部署和交互,以及前端应用程序的开发和测试。

  • 集成了HardhatReact:Hardhat是一个强大的以太坊智能合约开发框架,而React是一个流行的前端框架。Scaffold-eth将它们集成在一起,使得智能合约和前端应用程序之间的交互变得更加简单。

  • 自动化工具:Scaffold-eth提供了许多自动化工具,如自动部署合约、自动连接以太坊网络等,帮助开发者提高开发效率。

  • 示例项目和模板:Scaffold-eth提供了许多示例项目和模板,包括简单的交易应用、去中心化交易所(DEX)等,帮助开发者快速上手并快速构建原型。

总的来说,Scaffold-eth是一个强大而灵活的工具,适用于初学者和资深开发者,帮助他们更轻松地构建以太坊DApp,并加速区块链应用的开发过程。

二、安装和配置

1.准备工作

在开始之前,您需要确保电脑已安装以下工具:
Node (>= v18.17) 节点 (>= v18.17)
Yarn (v1)or Yarn (v2+)PS:这里推荐安装v2+版本
Git

安装完成后可以输入下面命令查看是否安装成功

node --version
yarn --version
git --version

在这里插入图片描述

2.安装

在github上下载scaffold-eth,并且下载所需依赖

git clone https://github.com/scaffold-eth/scaffold-eth-2.git
cd scaffold-eth-2
yarn install

在这里插入图片描述
在这里插入图片描述

3.配置开发环境

初始化本地区块链
在新开的一个终端里输入yarn chain,这条链与我前面讲的hardhat入门里的链是一样的,都可以连到MetaMask钱包
在这里插入图片描述
部署智能合约
刚才的终端不要关闭,再开第二个终端输入yarn deploy
在这里插入图片描述
启动NextJS
前面的两个都不要关掉,再开第三个终端输入yarn start

在这里插入图片描述
启动项目
打开浏览器输入http://localhost:3000/就可以进到项目主页面
在这里插入图片描述

三、进阶使用

1.放入自己的合约

上面我们安装完成后就可以把自己的一个合约放到里面去,我们在项目的packages/hardhat/contracts/目录下放入EthVoting.sol文件,再到packages/hardhat/deploy/目录下创建一个01_deploy_ethvoting.ts文件,把前面00的文件复制改一下即可,如下图所示:
在这里插入图片描述
在这里插入图片描述

EthVoting.sol

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

contract EthVoting {

    //附议人信息
    struct Voter {
        uint voteTimeStamp; //投票时的区块时间
        bool initialized;   //判断是否投过票的标志
    }

    //提案内容
    struct  Proposal {
        string pName;        //提案标题
        string pCtx;         //提案内容
        address chairperson; //提案主持人
        uint voteCount;      //附议人数
        bool initialized;    //判断提案是否存在的标志
        uint limitTime;      //附议限制时间
        mapping(address => Voter) voters; //附议列表
    }




    //所有提案列表
    mapping(uint => Proposal) public proposals;

    //附议事件
    event VoteEvt(string indexed eventType, address _voter, uint timestamp);

    //提案事件
    event ProposeEvt(string indexed eventType, uint _proposalId, uint _limitTime);

    //创建新提案
    function createProposal(uint _pid,string  memory _pName, string memory  _pCtx, uint _limitTime) public returns (uint){

        uint pId = _pid;
        Proposal storage _proposal = proposals[pId];
        _proposal.pName = _pName;
        _proposal.pCtx = _pCtx;
        _proposal.chairperson = msg.sender;
        _proposal.initialized = true;
        _proposal.limitTime= _limitTime;
        _proposal.voteCount = 0;

        emit ProposeEvt("propose", pId, _limitTime);

        return pId;


    }

    //进行附议
    function doVoting(uint pId) public {
        //提案是否存在
        if (proposals[pId].initialized == false)
            revert("proposal not exist");

        uint currentTime = block.timestamp;

        //是否已超过提案时限
        if (proposals[pId].limitTime < currentTime)
            revert("exceed voting time");

        //是否已经投过票
        if (proposals[pId].voters[msg.sender].initialized == true)
            revert("already vote");

        //新投票信息
        Voter memory voter = Voter({
            voteTimeStamp: block.timestamp,
            initialized: true
        });

        //记录投票信息
        proposals[pId].voters[msg.sender] = voter;
        proposals[pId].voteCount+=1;

        emit VoteEvt("vote", msg.sender, block.timestamp);
    }

    //查询是否附议
    function queryVoting(uint pId, address voterAddr) public view returns (uint){
        //提案是否存在
        if (proposals[pId].initialized == false)
            revert("proposal not exist");

        //返回投票时间
        return proposals[pId].voters[voterAddr].voteTimeStamp;
    }

    //获取区块链时间
    function getBlockTime() public view returns (uint t) {
        t = block.timestamp;
    }

    //查询提案标题
    function getProposalName(uint pId) public view returns (string memory s) {
        s = proposals[pId].pName;
    }

    //查询提案内容
    function getProposalCtx(uint pId) public view returns (string memory s) {
        s = proposals[pId].pCtx;
    }

    //查询提案内容
    function getProposalVCnt(uint pId) public view returns (uint v) {
        v = proposals[pId].voteCount;
    }

    //查询提案期限
    function getProposalLimit(uint pId) public view returns (uint t) {
        t = proposals[pId].limitTime;
    }
}

2.部署运行

保证区块本地链与NextJS两个端口的启动,然后再次打开一个端口输入yarn deploy,再次打开http://localhost:3000/debug界面,可以发现多了一个合约,并且自动对应到了合约里的读(read)和写(write)的方法
在这里插入图片描述
在这里插入图片描述


总结

通过使用Scaffold-eth,你可以快速搭建一个完整的以太坊开发环境,并进行智能合约的开发、部署和交互。它让你不用为前端调用而烦恼,会自动生成读和写的方法,让开发者更加专注与智能合约逻辑的编写,提供了一套完整的工具和模板,帮助你更轻松地构建以太坊应用程序。祝你在使用Scaffold-eth时取得成功!
希望本文能够帮助读者更好地了解Scaffold-eth,如果有任何疑问或者建议,欢迎留言讨论🌹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/549340.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++-----继承

01&#xff1a;继承是什么 定义 继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段&#xff0c;它允许程序员在 保 持原有类特性的基础上进行扩展 &#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承 呈现了面向对象 程序设计…

【C语言】带你完全理解指针(六)指针笔试题

目录 1. 2. 3. 4. 5. 6. 7. 8. 1. int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } 【答案】 2&#xff0c;5 【解析】 定义了一个指向整数的指针ptr&#xff0c;并将其初始化为&…

FactoryMethod工厂方法模式详解

目录 模式定义实现方式简单工厂工厂方法主要优点 应用场景源码中的应用 模式定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。 Factory Method 使得一个类的实例化延迟到子类。 实现方式 简单工厂 以下示例非设计模式&#xff0c;仅为编码的一种规…

在centos8.5上迁移深度学习环境的时候碰到的一下问题(需要运维人员解决的)

我负责的是将开发服务器上的深度学习环境进行打包并将该环境迁移到生产服务器上&#xff0c;这些操作可以在其他博客中搜到 本文主要介绍我把环境包上传至生产服务器中的anaconda/envs/路径下&#xff0c;解压之后&#xff0c;运行测试代码时遇到的问题 IT部门是如何处理的&am…

mfc 带有复选框的ListBox

mfc 带有复选框的 ListBox 效果&#xff1a; 添加 ListBox 控件 从工具箱拖拽 ListBox 控件到窗口上&#xff0c;并设置属性&#xff1a; 包含字符串&#xff1a;true所有者描述&#xff1a;Fixed 给ListBox添加控制变量 添加完后&#xff0c;将m_list_box的类型使用CC…

Rustdesk如何编译代码实现安装后,不会在右下角出现托盘图标

环境&#xff1a; Rustdesk1.1.9 问题描述&#xff1a; Rustdesk如何编译代码实现安装后&#xff0c;不会在右下角出现托盘图标 解决方案&#xff1a; 安装后只有自定义进程图标 详细方案&#xff0c;有需要私聊

L2-1 堆宝塔分数

本题链接&#xff1a;PTA | 程序设计类实验辅助教学平台 题目&#xff1a; 样例&#xff1a; 输入 11 10 8 9 5 12 11 4 3 1 9 15 输出 4 5 思路&#xff1a; 这是一道模拟题&#xff0c;需要有耐心读题&#xff0c;跟着题目走一遍&#xff0c;就可以了。 代码详解如下&…

中霖教育:没有计量相关工作经验可以考注册计量师吗?

不可以&#xff0c;报考注册计量师需要满足相关工作年限要求&#xff0c;如果没有相关工作经验是不能报考的。 具体要求如下&#xff1a; 一级计量师; 1.取得理学类或工学类专业大学专科学历&#xff0c;工作满6年&#xff0c;其中从事计量技术工作满4年; 2.取得理学类或工…

每日OJ题_完全背包②_力扣322. 零钱兑换

目录 力扣322. 零钱兑换 问题解析 解析代码 优化代码&#xff08;滚动数组&#xff09; 力扣322. 零钱兑换 322. 零钱兑换 难度 中等 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以…

外观模式:简化复杂系统的统一接口

在面向对象的软件开发中&#xff0c;外观模式是一种常用的结构型设计模式&#xff0c;旨在为复杂的系统提供一个简化的接口。通过创建一个统一的高级接口&#xff0c;这个模式帮助客户端通过一个简单的方式与复杂的子系统交互。本文将详细介绍外观模式的定义、实现、应用场景以…

链表拓展之双向链表

前言 在前面已经总结了单链表&#xff0c;有了单链表的基础会很好理解双链表的实现&#xff0c;忘记了可以跳转——>http://t.csdnimg.cn/GFPk9 接下来就由我带着各位看官来认识今天的主角吧~ 什么是双向链表 在单链表的基础上&#xff0c;它有两个方向的链接&#xff0c;一…

加强fou循环的坑

今天遇到了一个有趣的事情&#xff0c;使用加强fou循环操作list时&#xff0c;会报错并发操作异常。 直到看了编译类&#xff0c;才发现&#xff0c;加强fou循环其实就是通过迭代器操作&#xff1a; 这里就会出现一个问题&#xff0c;迭代器在取出值时&#xff0c;就回去检测这…

分析ARP解析过程

一、实验环境 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连&#xff0c;如图7.17所示&#xff0c;路由器充当网关。 图7.17 二、需求描述 查看 ARP 相关信息,熟悉在PC 和 Cisco 设备上的常用命令,设置主机A和主机B为同一个网段网关设置为路由接口地址。 三、推…

基于Python的景区票务人脸识别系统(V2.0)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

排列特征重要性(Permutation Feature Importance)

5个条件判断一件事情是否发生&#xff0c;每个条件可能性只有2种&#xff08;发生或者不发生&#xff09;&#xff0c;计算每个条件对这件事情发生的影响力。排列特征重要性模型的程序。 例一 在机器学习领域&#xff0c;排列特征重要性&#xff08;Permutation Feature Impor…

QT 串口助手 学习制作记录

QT 串口助手qt 学习制作记录 参考教程&#xff1a;​​​​​​QT初体验&#xff1a;手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客 Qt之串口编程&#xff08;添加QSerialPort模块&#xff09;_如何安装 qt串口模块教程-CSDN博客 串口调试助手&#xff1…

2.2 @SpringBootApplication

2.2 SpringBootApplication 在前文的介绍中&#xff0c;读者已经了解到SpringBootApplication注解是加在项目的启动类上的。 SpringBootApplication实际上是一个组合注解&#xff0c;定义如下&#xff1a; SpringBootConfiguration EnableAutoConfiguration ComponentScan(exc…

python-常用数据结构(2)

6、某企业为职工发放奖金:如果入职超过5年,且销售业绩超过15000元的员工,奖金比例为0.2;销售业绩超过10000元的员工,奖金比例为0.15:销售业绩超过5000元的员工,奖金比例为0.1;其他奖金比例为0.05。如果是人职不超过5年,且销售业绩超过4000的员工,奖金比例为0.045;否则为0.01。输…

使用Python模仿文件行为

在Python中&#xff0c;你可以通过文件操作函数&#xff08;如open()函数&#xff09;以及模拟输入输出流的库&#xff08;如io模块&#xff09;来模拟文件行为。下面是一些示例&#xff0c;展示了如何使用这些工具在Python中模拟文件行为。 1、问题背景 在编写一个脚本时&…

深度挖掘响应式模式的潜力,从而精准优化AI与机器学习项目的运行效能,引领技术革新潮流

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f525; 转载自热榜文章&#xff1a;探索设计模式的魅力&#xff1a;深度挖掘响应式模式的…
最新文章