区块链之智能合约入门

2019-09-18 约 301 字 预计阅读 2 分钟

声明:本文 【区块链之智能合约入门】 由作者 看到请叫我滚去学习 于 2019-09-18 09:20:00 首发 先知社区 曾经 浏览数 36 次

感谢 看到请叫我滚去学习 的辛苦付出!

区块链之智能合约入门

第一步 安装环境

首先这里写的合约是指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

然后访问即可

环境部署成功

第二步 编写第一个HelloWorld

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函数实现了和合约的交互

关键词:[‘安全技术’, ‘区块链安全’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now