日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CTF中智能合约部署交互基础

發(fā)布時間:2024/9/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CTF中智能合约部署交互基础 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0x01 前言

  • Solidity在以太坊中是編寫智能合約最受歡迎的語言,一般的CTF競賽中的智能合約方向的題目都是以solidity語言編寫的智能合約。
  • 為什么寫這一篇文章,主要是因為在接觸智能合約類題目的時候,題目是以提前編寫好的代碼邏輯存在缺陷或者合約本身存在的問題為考點的,其實題目對于新手而言,難點主要在于solidity語法的陌生,以及完全無法著手智能合約,無法與之交互。所以在接下來的文章中,著重介紹如何進(jìn)行智能合約的交互。

0x02 Solidity語言&CTF中基礎(chǔ)Solidity合約分析

  • 在線編譯器 http://remix.ethereum.org/
  • Solidity它的語法與Javascript相似,是一種面向?qū)ο蟮恼Z言。文件后綴名為.sol
  • 基礎(chǔ)代碼結(jié)構(gòu)
pragma solidity ^0.4.23;contract Test {??mapping (address => uint) balances;constructor() public {balances[tx.origin] = 0;}event FLAG(string b64email, string slogan);function getbalance() public constant returns (uint){return balances[tx.origin];}function AddBalance(uint f) public {if(f==1){balances[tx.origin]++;}}function CaptureTheFlag(string b64email) public{require (balances[tx.origin]>0);emit FLAG(b64email, "you will get flag!");}}

分析如下

  • 明確solidity語言的版本號
pragma?solidity ^0.4.23;
  • 定義一個合約,內(nèi)部有不同的方法和屬性
contract?Test {……………… }
  • 更新我們的 balances映射,這是一個余額變量,該變量里面存儲了所有擁有代幣的地址的余額
mapping (address?=> uint)?balances;
  • 這是一個構(gòu)造函數(shù),其中tx.origin是Solidity的一個全局變量,它遍歷整個調(diào)用棧并返回最初發(fā)送調(diào)用(或事務(wù))的帳戶的地址,實現(xiàn)給賬戶余額賦初始值為0
constructor() public {balances[tx.origin] = 0;}
  • 發(fā)送flag的合約,郵件發(fā)送腳本需部署在服務(wù)器
event FLAG(string b64email, string?slogan);

其中郵箱發(fā)送腳本編寫建議參考博客https://www.cnblogs.com/KRDecad3/p/10798383.html

  • 獲取賬戶當(dāng)前余額
function getbalance() public constant returns (uint){return balances[tx.origin];}
  • 為賬戶增加余額
function AddBalance(uint f) public {if(f==1){balances[tx.origin]++;}}

一般CTF中智能合約題目,都是當(dāng)發(fā)送調(diào)用(或事務(wù))的帳戶的地址滿足一定條件時,然后允許發(fā)送flag到指定郵箱。這邊就是進(jìn)行一個簡單的為賬戶余額+1的方法,實現(xiàn)交互,傳入f為1即可為余額+1。

  • 判斷余額是否大于0,若大于0則調(diào)用FLAG方法發(fā)送flag
function CaptureTheFlag(string b64email) public{require (balances[tx.origin]>0);emit FLAG(b64email, "you will get flag!");}
  • 更多solidity語法推薦博客https://www.jianshu.com/p/70aecda3212e

0x03 使用Remix IDE進(jìn)行合約部署和交互

  • 在線編譯器?http://remix.ethereum.org/

合約部署

  • 新建.sol文件

  • 編譯.sol文件

編譯成功后會顯示綠色的勾表示編譯成功,如果編譯失敗可以看編譯詳細(xì),查看錯誤原因

  • 部署合約

Environment 選擇Injected Web3

Account如果沒有的話需要安裝MetaMask錢包插件

如果已安裝并且登陸的話,在選擇Injected Web3時會自動請求連接到你的MetaMask錢包里的賬號。

點擊Deploy部署合約

  • 部署成功

在MetaMask錢包里面可以看到歷史紀(jì)錄中合約部署成功

合約地址可以在Remix IDE中的Deployed Contracts找到我們成功部署的合約,點擊Copy就可以復(fù)制合約地址,地址為0x3eCC14397D0413e29b83653691d8614519eA3394。

查詢合約地址詳細(xì)信息的網(wǎng)址為 https://ropsten.etherscan.io/

可以通過該網(wǎng)址查到我們已部署的合約地址產(chǎn)生的記錄,當(dāng)前為部署合約時產(chǎn)生的記錄。

合約交互

  • 要和一個已有合約進(jìn)行交互,必須至少在合約的.sol文件的聲明函數(shù)原型,然后成功編譯。當(dāng)然一般題目都會給.sol文件,只需要直接編譯即可
  • 加載合約

在At Address中填入目的合約的地址,點擊At Address加載合約

  • 進(jìn)行交互

點擊getbalance可以看到當(dāng)前余額為0

調(diào)用AddBalance傳入1后,等待合約交互成功,然后getbalance發(fā)現(xiàn)我們的余額已經(jīng)實現(xiàn)+1了。

最后將我們的郵箱的base64編碼后的值輸入,調(diào)用合約中CaptureTheFlag方法,等待合約交互成功。

通過查合約地址記錄,成功調(diào)用到發(fā)送flag的合約方法了。到郵箱中查最新的郵件即可。

總結(jié)

以上是生活随笔為你收集整理的CTF中智能合约部署交互基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。