区块链安全

区块链安全第 1 课——自己编写合约:向合约充值

@snowming

0x01 本课导言

这个系列想先从区块链基础开始介绍,逐步介绍到区块链安全。不会单纯假大空的叙述概念和名次,因为个人认为只有自己不懂装懂的人才会向别人那样介绍。话不多说,开始第一课。

在本课中,我们将自己编写一个合约,编译、运行它,然后向合约发送以太测试币。

0x02 准备工作

  • MetaMask 钱包

MetaMask 钱包是 chrome 浏览器的扩展程序。

选择「正版」此插件请核对以下一些特征:

  • 切换至 「Ropsten 测试网络」

测试网络中的以太币==空气,但是使用测试网络是便于实验。

title
  • 向「水龙头」网络乞讨一些以太币。

「购买」-> 测试水管 -> 「获取 Ether」-> 两次「request 1 ether from Faucet」。乞讨完之后记得稍微等待一下转账完成。

什么是 Faucet(水龙头)?之后会介绍。

乞讨之后注意核对一下自己的钱包余额。

title

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 中被执行。这个交易本身,就是程序执行的输入参数。这个原理是不是很像事件触发了一个脚本的一次运行?

而发送给合约的交易可以包括以太币或数据,也可以同时包括这两者。在本节课中,仅仅是发送给合约以太币,下次课来看看发送给合约数据来调用它。