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

news2024/11/25 19:50:59

文章目录

  • 前言
  • 一、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.coloradmin.cn/o/1600297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《自动机理论、语言和计算导论》阅读笔记:p225-p260

《自动机理论、语言和计算导论》学习第 9 天&#xff0c;p225-p260总结&#xff0c;总计 26 页。 一、技术总结 1.pushdown automation(PDA&#xff0c;下推自动机) 2.DPDA Deterministic PDA(确定性下推自动机)。 二、英语总结 1.instantaneous (1)instant: adj. happi…

普发Pfeiffer TPG252 TPG256A SingleGaugeTPG261-262使用说明手侧

普发Pfeiffer TPG252 TPG256A SingleGaugeTPG261-262使用说明手侧

【产品经理修炼之道】- 厂商银业务之保兑仓

保兑仓 保兑仓是指供应商、购货商、银行签订三方协议&#xff0c;以银行信用为载体&#xff0c;以银行承兑汇票为结算工具&#xff0c;由银行控制货权&#xff0c;供应商受托保管货物并对银行承兑汇票保证金以外部分以货物回购为担保措施&#xff0c;购货商随缴保证金随提货而设…

实验一: 分析ARP解析过程

1.实验环境 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连 2.需求描述 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连主机A和主机B设置为同一网段&#xff0c;网关设置为路由接口地址查看ARP相关信息&#xff0c;熟悉在PC和Cisco设备上的常用命令 3.推…

9K star!利用 AI 大模型,一键生成高清短视频。效果还可以

原文链接: 9K star!利用 AI 大模型,一键生成高清短视频。效果还可以 现在失业三件套就是滴滴,外卖和自媒体,而且视频赛道也越来越卷了。 每一个搞自媒体的同学肯定都希望能有一个自动生成视频,或者剪辑的工具。 今天给大家介绍一个开源项目,就是可以根据一个主题或者…

Nginx内存池相关源码剖析(四)大块内存分配和释放逻辑

与小块内存不同&#xff0c;大块内存通常指的是那些大小较大、分配和释放频率相对较低的内存块。 ngx_palloc_large函数 当Nginx需要分配一块大块内存时&#xff0c;它通常会直接调用操作系统的内存分配函数&#xff08;如malloc、calloc或posix_memalign等&#xff09;。这些…

linux学习:进程(新建+运行某文件+退出处理函数+等待)

目录 api 创建新进程 注意 运行某文件 例子 注意 例子&#xff0c;等待进程 进程是由进程控制块、程序段、数据段三部分组成 进程有都有一个父进程&#xff0c;除了init&#xff0c;父进程可以创建子进程 每个进程都有一个PID&#xff0c;可以用ps来查看&#xff0c;等…

CC工具箱使用指南:【连接道路线(肖四成)】

一、简介 群友定制功能。 应用场景如下&#xff1a;有一组道路线&#xff0c;在交点处是打断的状态。线段有两个关键字段&#xff0c;分别为首尾编号&#xff1a; 这里要实现的是&#xff0c;将首尾编号交错相等的线段两两合并。比如这一组&#xff1a; 目的简单明了。因为是…

Console口和Telnet功能配置实验

一、基础配置 <Huawei>system-view //进入系统视图 Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable //关闭接口提示 Info: Information center is disabled. [Huawei]sysname AR1 //配置设备名为 R1 [AR1]interface GigabitEthern…

高通 Android 12 源码编译aidl接口

最近在封装系统sdk接口 于是每次需要更新aidl接口 &#xff0c;传统方式一般使用make update-api或者修改Android.mk文件&#xff0c;今天我尝试使用Android.bp修改 &#xff0c;Android 10之前在Android.mk文件修改&#xff0c;这里不做赘述。下面开始尝试修改&#xff0c;其实…

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…

5种方法,教你如何清理接口测试后的测试数据

在接口测试之后&#xff0c;清理测试数据是一个很重要的步骤&#xff0c;以确保下一次测试的准确性和一致性。以下是一些常见的测试数据清理方法&#xff1a; 1. 手动清理&#xff1a; 这是最基本的方法&#xff0c;即手动删除或重置测试数据。您可以通过访问数据库、控制台或…

Hyperledger Fabric

一.Hyperledger Fabric介绍 Hyperledger区块链全家桶 Hyperledger Fabric技术特性 资产 — 资产定义使得几乎任何具有货币价值的东西都可以在网络上交 换&#xff0c;包括从食品到古董汽车再到货币期货。链码 — 链码执行与交易排序的分离&#xff0c;限制了跨节点类型所需的…

HDLbits 刷题 --Mux2to1v

Create a 100-bit wide, 2-to-1 multiplexer. When sel0, choose a. When sel1, choose b. 译&#xff1a; 创建一个100位宽的2对1多路复用器。当sel0时&#xff0c;选择a。当sel1时&#xff0c;选择b。 module top_module( input [99:0] a, b,input sel,output [99:0] out …

DataGrip2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 DataGrip是由JetBrains公司开发的一款强大的关系数据库集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为数据库开发人员和数据库管理员设计。它提供了一个统一的界面&#xff0c;用于管理和开发各种关系型数据库&#x…

个人微信API开发,API接口核心

API接口的核心 对于小白而言&#xff0c;初看API文档可能是一头雾水的——从哪里看&#xff0c;怎么看&#xff0c;看什么是摆在面前的问题。 其实对于产品经理而言&#xff0c;我们应该更关注这个公司可以提供什么样的API接口服务&#xff0c;比如我知道高德可以提供地图API&…

数据结构OJ:设计循环队列

题目介绍 本题为LeetCode上的经典题目&#xff0c;题目要求我们设计一种循环队列&#xff0c;满足FIFO原则且队尾被连接在队首之后。 思路讲解 题目中介绍循环队列的好处是可以重复利用空间&#xff0c;所以我们很容易想到在初始化时即开辟指定大小的空间&#xff0c;之后便不…

家居网购项目(手写分页)

文章目录 1.后台管理—分页显示1.程序框架图2.编写数据模型Page.java 3.编写dao层1.修改FurnDao增加方法 2.修改FurnDaoImpl增加方法 3.单元测试FurnDaoTest 4.编写service层1.修改FurnService增加方法 2.修改FurnServiceImpl增加方法3.单元测试FurnServiceTest 5.编写DataUtil…

【高录用-快速见刊】2024年数字化经济与金融创新国际学术会议(ICDEFI 2024)

会议简介 2024年数字经济与金融创新国际学术会议即将召开。此次会议旨在汇集全球数字经济与金融创新领域的专家学者&#xff0c;共同探讨数字经济的发展趋势以及金融创新的路径。与会者将分享前沿研究成果&#xff0c;讨论数字技术在金融领域的应用与创新&#xff0c;并推动数…

HDLbits 刷题 --Mux2to1

Create a one-bit wide, 2-to-1 multiplexer. When sel0, choose a. When sel1, choose b. 译&#xff1a; 创建一个1位宽的2对1多路复用器。当sel0时&#xff0c;选择a。当sel1时&#xff0c;选择b。 个人解法&#xff1a; module top_module( input a, b, sel,output out …