NFT鑄造交易丨Opensae交易平臺系統開發技術分析

Lyr96246466發表於2023-04-12

  去中心化應用,或者叫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;


  }


  }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70012429/viewspace-2945179/,如需轉載,請註明出處,否則將追究法律責任。

相關文章