区块链安全第 1 课——自己编写合约:向合约充值
@snowming
0x01 本课导言
这个系列想先从区块链基础开始介绍,逐步介绍到区块链安全。不会单纯假大空的叙述概念和名次,因为个人认为只有自己不懂装懂的人才会向别人那样介绍。话不多说,开始第一课。
在本课中,我们将自己编写一个合约,编译、运行它,然后向合约发送以太测试币。
0x02 准备工作
- MetaMask 钱包
MetaMask 钱包是 chrome 浏览器的扩展程序。
选择「正版」此插件请核对以下一些特征:

- 切换至 「Ropsten 测试网络」
测试网络中的以太币==空气,但是使用测试网络是便于实验。
- 向「水龙头」网络乞讨一些以太币。
「购买」-> 测试水管 -> 「获取 Ether」-> 两次「request 1 ether from Faucet」。乞讨完之后记得稍微等待一下转账完成。
什么是 Faucet(水龙头)?之后会介绍。
乞讨之后注意核对一下自己的钱包余额。
- Solidity IDE:https://remix.etherrum.org

Solidity 是智能合约编程的流行高级语言。区别于 C++ 的流行编译器 Visual Studio,Solidity 的 IDE 有一个在线的,我们可以在线写 Solidity 文件(后缀名为 .sol)并且在线编译、运行、部署。
所以,为了使用这个 IDE,仅仅是打开上面这个网址就可以了!但是为了跟我们创建的合约进行交互,我们需要连接到我们的 METAMASK 钱包。如何连接不用着急,下文会讲到。
0x03 开始实验
什么是智能合约?和区块链有什么关系?
个人认为简单的论述区块链的概念非常空洞,所以会逐渐的去让读者感知什么是区块链。但是我们日常一定能接触到的就是币了。比如你钱包里面的以太币。
合约就是用来控制以太币的程序。向我们向水龙头网络乞讨,会将水龙头中的以太币转到你的地址,你给别人转钱需要将你的钱转到别人的地址。这些转入、转出的行为就是所谓的「控制」。
合约是创建在区块链上的。概念性的东西先说这么多。下面打开 Remix IDE,写下今天第一个合约文件。
- 第一步:编写 .sol 文件

注意:仅仅最后那个 Faucet.sol 是我写的文件,其他的都是 sample。
代码非常简单:
pragma solidity ^0.4.19; //指定版本
contract Faucet //合约名
{
function () public payable //默认函数
{
}
}
- 没有名称的函数是默认函数,当给合约地址发一个交易时,如果没有指明具体调用合约的哪一个函数,就会调用默认函数
payable
属性:此函数可以接收以太币并将币存入合约余额public
属性:公开函数,意味着可以被其他合约调用
- 第二步:编译

编译成为字节码。
- 第三步:在区块链上创建合约

Remix IDE 会构建一个特殊的「creation」交易,我们在 MetaMask 批准此交易之后就会在区块链上注册合约了。注册成功之后会出现黄色箭头指向的地址。是的,合约也有一个自己专属的地址。
然后在 MetaMask 上我们可以看到这个合约部署的交易:

0x04 与合约交互
要查看合约上的交易,很简单。我们在 https://ropsten.etherscan.io 这个测试网的区块链浏览器上搜索合约地址即可:
目前合约的历史只能看到这个合约创建的记录:

现在我们尝试向合约充值。因为 Faucet 合约的默认函数有 payable
属性(接收以太币并将币存入合约余额)。
通过 METAMSK 向刚刚的合约地址转 1 ether(要转1 ether,需要额外的 gas。所以网络乞讨的数量要大于 1 ether)。


然后再次查看合约历史,发现有一笔转入,并且合约余额变成了 1 ether。

0x05 总结
相信通过上面的实验,你已经可以感受到:
- 合约是一个操作币的程序,它运行在 EVM 虚拟机中。
- 合约由特殊的交易创建,这个「合约部署」的交易就是把合约的字节码(所以需要编译过程)保存到区块链上(运行、部署过程)。
- 如果有人向合约地址发送交易,就会触发合约在 EVM 中被执行。这个交易本身,就是程序执行的输入参数。这个原理是不是很像事件触发了一个脚本的一次运行?
而发送给合约的交易可以包括以太币或数据,也可以同时包括这两者。在本节课中,仅仅是发送给合约以太币,下次课来看看发送给合约数据来调用它。
hi,Snowming Your boyfriend is really handsome
yes sure
想和姐姐交流一下可以嘛?
可以啊
emm 可以加联系方式 学习一下嘛?
请问下有这方面的课程或者教程嘛
精通以太坊 书还不错
没有什么教程吧
有没有人想我一样,metamask自己的faucet报500 internal server error,收不到币;用https://faucet.ropsten.be/ 也收不到币?
官方的水龙头似乎是有问题的。可以自己搜点用
Remix IDE是在线的吧,怎么保存历史文件呢,尝试使用Home页的”Downloads all Files as a backup zip”,但是无法恢复,因为下载后的zip文件夹里面有一个.workspaces文件夹,默认这个文件夹是不导入的,有相关人提了issue。https://github.com/ethereum/remix-project/issues/1529