第一个智能合约程序Faucet.sol

先上代码

pragma solidity 0.6.4;

contract Faucet {
    // Accept any incoming amount
    receive() external payable {}

    // 这个函数的名称是withdraw,它接收一个名为withdraw_amount、类型为无符号整型(uint)的参数
    function withdraw(uint withdraw_amount) public {
        //设定提币的上限,它使用内置的Solidity函数require来测试一个前提条件,
        //即withdraw_amount小于或等于100000000000000000 wei
        //如果使用大于该数量的withdraw_amount调用withdraw函数,
        //则此处的require函数将导致合约执行停止并因异常而失败
        require(withdraw_amount <= 100000000000000000);

        //msg对象是一个所有合约都可以访问的输入,它代表触发这个合约执行的交易。
        //sender属性就是发起这个交易的发起方地址。
        //transfer函数是一个内置的函数,用来把以太币从合约转账到调用这个合约的交易地址
        //将以太币转给触发这个合约执行的交易消息的发送地址。
        //transfer函数只接收一个数额参数。
        //把之前定义的withdraw_amount这个变量的值作为参数传递给withdraw函数。
        msg.sender.transfer(withdraw_amount);
    }
}

编译Faucet合约

我们已经完成了第一个合约,现在需要使用Solidity编译器把Solidity代码转化为EVM字节码,这样它才能够被区块链上的EVM所执行。
Solidity的编译器是一个独立的可执行程序,通常包含在各类编程框架之中,也会集成在一些IDE中。为了简单起见,我们使用Remix这个流行的IDE。
1、打开安装了MetaMask插件的Chrome浏览器,访问Remix IDE中文版的网址http://remix.app.hubwiz.com/
2、我们通过点击工具栏左侧的加号按钮添加一个新的文件,把新的文件命名为Faucet.sol。
第一个智能合约程序Faucet.sol_第1张图片
3、复制代码,编译程序;注意编译器的版本要跟代码中声明的一致
第一个智能合约程序Faucet.sol_第2张图片
4、编译成功,会出现一个Faucet的合约名称
第一个智能合约程序Faucet.sol_第3张图片

部署Faucet合约

我们已经有了一个合约,并且把它编译成了字节码。现在需要把这个合约“注册”到以太坊区块链上。我们还是使用Ropsten测试网络来测试合约,因此Ropsten就是我们需要注册合约的目标。
1、首先,切换到“Run”标签页,在“环境”下拉菜单中,选择“注入的 Web3”。这会建立起Remix IDE和MetaMask钱包之间的连接,并且进而通过MetaMask连接到Ropsten测试网络。在完成这个设定之后,你会在“环境”一栏中看到Ropsten字样。同样,在账户选择的输入框中出现了你的MetaMask钱包地址
第一个智能合约程序Faucet.sol_第4张图片
2、Remix IDE会构建一个特殊的“creation”交易,然后MetaMask会请求你的批准。如你在MetaMask中看到的,这个合约创建的交易并没有包含以太币,它只有258字节(经过编译后的合约),这个交易的gas需要10 gwei。点击“SUBMIT”来批准这个交易(在区块链上注册合约)。
3、请注意,Faucet合约现在有一个属于它自己的地址,Remix中显示为“Faucet at 0x72e…c7829”(由于地址的不同,这些随机字母和数字也会不同)。右侧的小剪贴板图标允许你把合约地址复制到剪贴板,我们稍后就会用到这个合约地址
第一个智能合约程序Faucet.sol_第5张图片
现在我们已经有一个记录在区块链上的合约了,可以通过地址来查看它。我们在https://ropsten.etherscan.io
这个区块浏览器上可以看到。点击剪贴板的图标来复制合约地址,在搜索框复制合约的地址。你会看到合约的历史
第一个智能合约程序Faucet.sol_第6张图片
目前为止,这个合约只有一笔交易历史:它自己的合约创建交易。如你所见,这个合约也没有任何以太币(余额为零)。这是因为我们没有在创建合约的交易中包含任何以太币。

向合约充值

我们可以向这个合约发送一些以太币。你的剪贴板中应该仍旧保留着合约地址(如果没有,就从Remix再复制一遍)。打开MetaMask
跟其他的转账操作一样,发送1 ether到合约地址。
很快,如果你刷新Etherscan区块浏览器,会在合约地址下看到一条新的交易,并且账户余额更新为1 ether了。

当你发给合约地址一个交易时,如果没有指明具体调用合约的哪一个函数,它就会调用默认函数。因为我们在声明函数时添加了payable属性,这个函数就可以接收以太币并且把币存入合约余额。这个交易触发合约在EVM上被执行,并更新余额。这样我们就完成了充值!

从合约提币

接着,我们试试从合约中提取以太币。为了提币,我们需要构建一个调用withdraw函数的交易,并且传递withdraw_amount作为参数。为了简单起见,可以使用Remix构建这个交易,然后用MetaMask发送并取得我们的批准。
返回Remix界面,在Run标签页找到合约。点击打开已部署的合约,标示为withdraw并带有字段输入标记uint256 withdraw_amount。
第一个智能合约程序Faucet.sol_第7张图片

这是合约在Remix中的界面。它允许我们构建一个交易,用来调用合约中定义的函数。我们输入一个withdraw_amount值,然后点击“withdraw”按钮来生成这笔交易。
1、首先,我们来看看withdraw_amount这个参数。我们尝试从合约提取0.1 ETH,这是合约所允许提取的最大限额。还记得以太坊内部所有的币值单位都应该使用wei来表示吧?因此,withdraw_amount参数也必须使用wei的格式。这里的0.1 ETH,对应的就是100000000000000000 wei。
2、在Remix中点击“withdraw”创建一个提币交易MetaMask会弹出一个交易窗口请求你的确认,点击“SUBMIT”就可以对合约发出提币的调用了
3、Etherscan显示交易调用了合约的withdraw函数
我们可以看到这笔交易是以合约作为地址,并且没有包含任何以太币。支出0.1 ETH之后,合约的余额已经变为0.9 ETH。但是很奇怪,我们没有看到一个“对外支付”的交易显示在合约地址历史记录中。
第一个智能合约程序Faucet.sol_第8张图片
4、这个对外支付的交易在哪里?合约地址历史记录页面中会出现一个新的区域,名为“Internal Txns”。因为这0.1 ETH的转账是由合约发起的,所以这类交易被称为内部交易(也称为消息)。点击“Internal Txns”标签可看到内部交易
第一个智能合约程序Faucet.sol_第9张图片

总结

我们使用Solidity编写了一个Faucet合约,并使用Remix IDE把合约编译为EVM字节码。我们使用Remix构建一个交易,然后把这个合约注册到Ropsten测试区块链网络。在注册完成后,这个合约就拥有了一个以太坊地址,我们可以向这个地址发送以太币。最终,我们构建了一个针对withdraw函数的调用,并且成功地提取了0.1 ETH。合约在检查了我们的请求后,使用内部交易向我们的调用地址发回了0.1 ETH。
这看上去似乎挺简单,我们刚才所做的就是在一个去中心化的世界计算机上用软件成功地实现数字货币的转账操作。

你可能感兴趣的:(区块链,智能合约,区块链,以太坊)