广州

点击搜索

发布

BSC链DAPP智能合约系统开发搭建

区域:
广州 > 天河 > 珠江新城/跑马场
类别:
软件开发
地址:
广州天河区
  去中心化应用,或者叫dApp,【18I链上合约-259l开发系统3365】是一种不依赖于中心化服务器的应用。相反,dApp使用像是区块链和预言机这些Web3技术,来实现自己的逻辑和后台功能,具备不可篡改和安全的特性。

  在这个技术教程中,你会学习到怎样开发一个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<block.timestamp,"Error:Wait 15 Minutes please");

  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事件,前端可以订阅并捕捉到

  }

  //返回当前所有wave的数组

  function getAllWaves()public view returns(Wave[]memory){

  return waves;

  }

  //返回wave计数

  function getTotalWaves()public view returns(uint256){

  console.log("We have%d total waves!",totalWaves);

  return totalWaves;

  }

  }
查看更多广州网站/软件服务信息

免责声明:此信息系发布者(UID:739123)自行发布,本站是服务平台,仅提供信息存储空间服务,该信息内容的真实性及合法性由该发布者完全负责。

© lieju.com 联系我们