合约代码:
// SPDX-License-Identifier: CC-BY-SA-4.0
// Version of Solidity compiler this program was written for
pragma solidity 0.6.4;
contract Faucet {
//Purpose:receive ETH coin
receive() external payable {}
// Give out ether to anyone who asks
function withdraw(uint withdraw_amount) public {
// Limit withdrawal amount 0.1eth => 100000000000000000 wei
require(withdraw_amount <= 100000000000000000);
// Send the amount to the address that requested it
msg.sender.transfer(withdraw_amount);
}
}
编译合约:
使用RemixIDE将合约编译成EVM字节码
注册合约:
将合约注册到区块链网络上需要一个特殊的交易,这个交易的目标地址是0x00000000000000000,也被称为零地址,这是一个特殊的地址,用来告诉以太坊,区块链用户希望通过这样的交易来注册合约,RemixIDE会自动处理这些细节,并且把生成的交易发送给MetaMask。
切换到DEPLOY&RUN TRANSCATIONS标签页,ENVIRONMENT选择Injected Web3,建立MetaMask钱包和RemixIDE之间的连接,并且进而通过MetaMask连接到Ropsten测试网络。
向合约地址充值ETH
充值ETH过程过于简单不再赘述(详情查看MetaMask使用教程)
从合约地址中提取0.1eth(以太坊内部所有币值单位都是用wei,0.1ETH = 100000000000000000wei)
合约地址交易账单:
合约地址:0x3CfFb89465d0eC6ed9a94D3c3D73a6Bf41f49Bed
使用测试交互的钱包地址:0x4ea691c9400dCfA6B2e3eECF22B088a6CF3822C5
三次交易分别解释如下:
- 44mins ago 注册合约地址到区块链测试网上 可以看到接收方是Contract Creation 这步是RemixIDE帮我们做的
- 41mins ago 从我的钱包地址发送给合约地址4个ETH(为什么显示的是3.99986,因为eth交易需要收取手续费)
- 18 mins ago 从合约地址提取0.1个eth到我的钱包账户,但是这里的value显示的是0,这是因为这0.1ETH的转账是由合约发起的,所以这类交易称为内部交易(也称为消息)
总结:
- 使用RemixIDE编写简单合约
- 注册合约到区块链网络中
- 钱包地址 ->转账-> 合约地址
- 操作合约代码->转账->钱包地址
对知识的幻想:
修改合约代码后,需要重新部署到区块链上
- 旧合约代码对应旧的合约地址
- 新合约代码对应新的合约地址
我在新合约代码中去除了提款限制,并重新发布在链上,旧合约代码中是限制在0.1eth
后续我从钱包中向新合约地址转了1eth,用于后续测试提取
测试一次性提取1个eth,0.1ETH = 100000000000000000wei 1eth=1000000000000000000wei(此处增加了一个0,搞不懂以太坊作者为什么要用那么小的单位,数0都半天)
OK,失败了, 不知道为什么后续测试了提取0.2~0.9数额的ETH都无法成功,一次性只能提取0.1eth,我明明去除了限制数额的代码呀,我还是继续往后读书吧~不折腾了