首先这里写的合约是指solidity合约,使用Remix IDE。所以我们第一步就是安装Remix IDE。remix ide是开发以太坊智能合约的神器,支持网页在线编写、部署和测试智能合约。网址http://remix.ethereum.org
可以选择先跳过安装环境这一步,直接使用在线的http://remix.ethereum.org
我这边的测试环境是kali-linux
安装的指令为
git clone https://github.com/ethereum/remix-ide.git cd remix-ide sudo npm install npm run build && npm run serve
注意:一定要sudo npm install,一定要sudo npm install,一定要sudo npm install,重要的事情说三遍,本人在这里踩了一次坑了
一般kali是不会自带npm这个东西的,所以我们需要先安装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/ // 进入解压目录
./bin/node -v // 执行node命令 查看版本
解压文件的 bin 目录底下包含了 node、npm 等命令,我们可以使用 ln 命令来设置软连接:
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/
这边前一个路径是你node.js下载到本地的路径
这样表示成功建立软连接,可以使用npm了。
当然,不建立软连接也可以直接使用,只要进入到npm所在的目录下即可
然后开始执行我们一开始的安装Remix IDE的命令
这边如果运行报错可能是因为在执行到npm run build的时候提示错误,没有找到模块fast-async模块,一般不会,如果前面你是sudo install的话,因为没有加sudo的话会出现下面的错误
npm ERR! Error: EACCES: permission denied, access
如果出现cannot find module 'xxx',说明你缺xxx模块,你需要做的就是输入命令sudo npm install xxx.之后将会自动下载安装,如果提示不成功,再来一遍
接下来如果一切正常的话就可以npm run build
npm run serve
然后访问即可
环境部署成功
Solidity是以太坊智能合约编程语言,所以在这之前需要对Solidity一些基本的语法进行一些了解,我是通过http://www.tryblockchain.org/这个网站进行初步简单的学习的
这边在网上找了个log函数,方便等会看是否成功调用
pragma solidity ^0.5.11; //通过log函数重载,对不同类型的变量trigger不同的event,实现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); } }
这边就是通过读取参数输入的新值,如果amout大于100,那么就打印出flag
项目结构
编译合约时有些蒙,后来发现应该用火狐浏览器,安装MetaMask,可以在火狐浏览器的插件中直接搜索安装,如果不行的话可以自行百度一下另外的安装方法。
在这边添加这个模块
选择Environment为Injected Web3,然后Remix IDE会请求连接到你的MetaMask钱包里的账号
然后添加Solidity compiler模块
对我们的HelloWorld进行编译
编译成功后这边会有绿色箭头,如果编译失败可以看编译详细,查看错误原因
然后回到这边就可以看到这边出现了我们编译好的HellloWorld。
如果之前没有部署过这个合约就点击下方橙色框Deploy,此时会跳出支付gas的弹窗,点击确定即可
等待几秒合约就会部署完成,最下方就会显示已部署的合约(及其地址);如果之前部署过相同合约,那么可以将合约地址复制到At Address并点击蓝色按钮加载合约,效果相同。
这边这个橙色getFlag就是合约里的函数,输入一个金额,并点击橙色按钮就可以调用此函数了只要大于100就会打印flag,通过ropsten.etherscan.io可以查到此合约的交易和事件。
输入101,点击getFlag,然后确认即可
这边会自动转成16进制打印出来。
首先我们部署好的合约地址是可以在这边看到
如果是我们自己要加载我们自己的合约的话,可以直接通过第二步说的At Address加载
点击At Address即可
以上都是在remix下测试的,如果我们要加载他人的合约就需要在geth下测试
这边首先获得一个我们部署好的合约地址,记录下来
在这边声明函数原型
编译完成后这边会出现我们编译好的test.sol
在At Address中填入我们之前记录下来的合约地址,点击蓝色的At Address
这边就已经实现交互了
这边可以看到我们成功和合约进行了交易,点进去查看具体事件
发现成功打印了flag,证明我们成功调用了合约中的getFlag函数实现了和合约的交互