区块链之智能合约入门
區(qū)塊鏈之智能合約入門
第一步 安裝環(huán)境
首先這里寫的合約是指solidity合約,使用Remix IDE。所以我們第一步就是安裝Remix IDE。remix ide是開發(fā)以太坊智能合約的神器,支持網(wǎng)頁在線編寫、部署和測試智能合約。網(wǎng)址http://remix.ethereum.org
可以選擇先跳過安裝環(huán)境這一步,直接使用在線的http://remix.ethereum.org
我這邊的測試環(huán)境是kali-linux
安裝的指令為
注意:一定要sudo npm install,一定要sudo npm install,一定要sudo npm install,重要的事情說三遍,本人在這里踩了一次坑了
一般kali是不會自帶npm這個(gè)東西的,所以我們需要先安裝npm
NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題
Linux安裝NPM指令(如果是非Linux建議查看Node.js的菜鳥教程,鏈接為 https://www.runoob.com/nodejs/nodejs-install-setup.html)
wget https://nodejs.org/dist/v10.9.0/node-v10.9.0-linux-x64.tar.xz // 下載 tar xf node-v10.9.0-linux-x64.tar.xz // 解壓 cd node-v10.9.0-linux-x64/ // 進(jìn)入解壓目錄 ./bin/node -v // 執(zhí)行node命令 查看版本解壓文件的 bin 目錄底下包含了 node、npm 等命令,我們可以使用 ln 命令來設(shè)置軟連接:
ln -s /root/node-v10.9.0-linux-x64/bin/npm /usr/local/bin/ ln -s /root/node-v10.9.0-linux-x64/bin/node /usr/local/bin/ ln -s /root/node-v10.9.0-linux-x64/bin/npx /usr/local/bin/這邊前一個(gè)路徑是你node.js下載到本地的路徑
這樣表示成功建立軟連接,可以使用npm了。
當(dāng)然,不建立軟連接也可以直接使用,只要進(jìn)入到npm所在的目錄下即可
然后開始執(zhí)行我們一開始的安裝Remix IDE的命令
這邊如果運(yùn)行報(bào)錯(cuò)可能是因?yàn)樵趫?zhí)行到npm run build的時(shí)候提示錯(cuò)誤,沒有找到模塊fast-async模塊,一般不會,如果前面你是sudo install的話,因?yàn)闆]有加sudo的話會出現(xiàn)下面的錯(cuò)誤
如果出現(xiàn)cannot find module ‘xxx’,說明你缺xxx模塊,你需要做的就是輸入命令sudo npm install xxx.之后將會自動下載安裝,如果提示不成功,再來一遍
接下來如果一切正常的話就可以npm run build
npm run serve
然后訪問即可
環(huán)境部署成功
第二步 編寫第一個(gè)HelloWorld
Solidity是以太坊智能合約編程語言,所以在這之前需要對Solidity一些基本的語法進(jìn)行一些了解,我是通過http://www.tryblockchain.org/這個(gè)網(wǎng)站進(jìn)行初步簡單的學(xué)習(xí)的
這邊在網(wǎng)上找了個(gè)log函數(shù),方便等會看是否成功調(diào)用
pragma solidity ^0.5.11;//通過log函數(shù)重載,對不同類型的變量trigger不同的event,實(shí)現(xiàn)solidity打印效果,使用方法為:log(string name, var value)contract Console {event LogUint(string, uint);function log(string memory s , uint x) internal {emit LogUint(s, x);}event LogInt(string, int);function log(string memory s , int x) internal {emit LogInt(s, x);}event LogBytes(string, bytes);function log(string memory s , bytes memory x) internal {emit LogBytes(s, x);}event LogBytes32(string, bytes32);function log(string memory s , bytes32 x) internal {emit LogBytes32(s, x);}event LogAddress(string, address);function log(string memory s , address x) internal {emit LogAddress(s, x);}event LogBool(string, bool);function log(string memory s , bool x) internal {emit LogBool(s, x);} } pragma solidity ^0.5.11; import "browser/Console.sol";contract HelloWorld is Console{function getFlag(uint amount) public returns (string memory){bytes memory flag="flag{asf54654v98x7v}";if(amount>100){log("give you flag!",flag);}uint state=0;log("no flag!",state);} }這邊就是通過讀取參數(shù)輸入的新值,如果amout大于100,那么就打印出flag
項(xiàng)目結(jié)構(gòu)
編譯合約時(shí)有些蒙,后來發(fā)現(xiàn)應(yīng)該用火狐瀏覽器,安裝MetaMask,可以在火狐瀏覽器的插件中直接搜索安裝,如果不行的話可以自行百度一下另外的安裝方法。
在這邊添加這個(gè)模塊
選擇Environment為Injected Web3,然后Remix IDE會請求連接到你的MetaMask錢包里的賬號
然后添加Solidity compiler模塊
對我們的HelloWorld進(jìn)行編譯
編譯成功后這邊會有綠色箭頭,如果編譯失敗可以看編譯詳細(xì),查看錯(cuò)誤原因
然后回到這邊就可以看到這邊出現(xiàn)了我們編譯好的HellloWorld。
如果之前沒有部署過這個(gè)合約就點(diǎn)擊下方橙色框Deploy,此時(shí)會跳出支付gas的彈窗,點(diǎn)擊確定即可
等待幾秒合約就會部署完成,最下方就會顯示已部署的合約(及其地址);如果之前部署過相同合約,那么可以將合約地址復(fù)制到At Address并點(diǎn)擊藍(lán)色按鈕加載合約,效果相同。
這邊這個(gè)橙色getFlag就是合約里的函數(shù),輸入一個(gè)金額,并點(diǎn)擊橙色按鈕就可以調(diào)用此函數(shù)了只要大于100就會打印flag,通過ropsten.etherscan.io可以查到此合約的交易和事件。
輸入101,點(diǎn)擊getFlag,然后確認(rèn)即可
這邊會自動轉(zhuǎn)成16進(jìn)制打印出來。
第三步 加載已部署合約
首先我們部署好的合約地址是可以在這邊看到
如果是我們自己要加載我們自己的合約的話,可以直接通過第二步說的At Address加載
點(diǎn)擊At Address即可
以上都是在remix下測試的,如果我們要加載他人的合約就需要在geth下測試
第四步 和已知合約地址交互
這邊首先獲得一個(gè)我們部署好的合約地址,記錄下來
在這邊聲明函數(shù)原型
編譯完成后這邊會出現(xiàn)我們編譯好的test.sol
在At Address中填入我們之前記錄下來的合約地址,點(diǎn)擊藍(lán)色的At Address
這邊就已經(jīng)實(shí)現(xiàn)交互了
這邊可以看到我們成功和合約進(jìn)行了交易,點(diǎn)進(jìn)去查看具體事件
發(fā)現(xiàn)成功打印了flag,證明我們成功調(diào)用了合約中的getFlag函數(shù)實(shí)現(xiàn)了和合約的交互
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的区块链之智能合约入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019浙江省大学生网络与信息安全竞赛决
- 下一篇: Docker配置CTF中的靶机环境