分投趣Fintoch系统开发案例智能合约搭建
  6B5gPfYrlnhc 2023年11月02日 38 0

在这个技术教程中,你会学习到怎样开发一个end-to-end的dApp。在dApp中,用户可以通过一个智能合约,获取和存储ETH的当前价格。这个教程demo代码存储在Github中。

 编译之后,就可以部署到区块链上。

 在migrations文件夹下已经有一个1_initial_migration.js部署脚本,用来部署Migrations.sol合约。

 Migrations.sol用来确保不会部署相同的合约。

 现在我们来创建一个自己的部署脚本2_deploy_contracts.js

 var Adoption=artifacts.require("Adoption");

 module.exports=function(deployer){

 deployer.deploy(Adoption);

 };

 在执行部署之前,需要确保有一个区块链运行,可以使用

 Ganache来开启一个私链来进行开发测试,默认会在7545端口上运行一个开发链。

 DAPP代码:

 //SPDX-License-Identifier:UNLICENSED

 pragma solidity^0.8.17;

 import"hardhat/console.sol";

 contract WavePortal{

 uint256 totalWaves;//wave次数计数器

 uint256 private seed;//随机种子

 //新的wave事件,调用wave()方法时emit

 event NewWave(address indexed from,uint256 timestamp,string message);

 //Wave结构体

 struct Wave{

 address waver;

 string message;

 uint256 timestamp;

 }

 Wave[]waves;//在合约里,存放所有wave数据的数组

 //存放每个wave的人最后一次执行合约交易的时间,每个人15分钟只能wave一次

 mapping(address=>uint256)public lastWavedAt;

 //合约的构造函数,payable表示合约可以支付ETH给其他地址

 constructor()payable{

 console.log("Hello,this a smart contract!");

 seed=(block.timestamp+block.difficulty)%100;//seed初始化

 }

 //核心方法

 function wave(string memory _message)public{

 //require前面的表达式必须为真,否则抛后面异常信息;这里是如果该地址距上次交易不到15分钟则不允许再次发起交易

 require(lastWavedAt[msg.sender]+15 minutes

 lastWavedAt[msg.sender]=block.timestamp;//更新mapping

 totalWaves+=1;

 console.log("%s has waved!",msg.sender);

 waves.push(Wave(msg.sender,_message,block.timestamp));//数组里新push一个Wave

 seed=(block.timestamp+block.difficulty+seed)%100;//计算seed

 console.log("Random#generated:d%",seed);

 if(seed<=50){//本次seed<=50则向发起wave交易的地址发放奖励0.0001 ETH

 console.log("%s won!",msg.sender);

 uint256 prizeAmount=0.0001 ether;

 require(prizeAmount<=address(this).balance,"Error:Trying to withdraw more money than the contract has.");//判断合约是否余额不足

 (bool success,)=(msg.sender).call{value:prizeAmount}("");//给msg.sender对应的地址转账prizeAmount

 require(success,"Failed to withdraw money from contract.");

 }

 emit NewWave(msg.sender,block.timestamp,_message);//发射NewWave事件,前端可以订阅并捕捉到

 }

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
6B5gPfYrlnhc