区块链入门2 初识以太坊 一个simple test ether faucet

添加mumbai测试网

由于参考资料中的若干测试网已经停运,参考文章:Ropsten, Rinkeby & Kiln Deprecation Announcement | Ethereum Foundation Blog

浏览器打开Chainlist,根据下图红框添加Mumbai币测试环境。

查看自己的Matemask钱包里是不是已经添加了Mumbai币测试网,成功的话如下图所示,同时选中Mumbai测试网络。

 

Mumbai币的申请步骤和GoerliETH一样(申请地址:Mumbai Faucet

一个简单的合约:一个test ether faucet 

以太坊有许多不同的高级语言,所有这些语言都可用于编写合约并生成EVM字节码。一种智能合约编程的主要高级语言:Solidity。我们将使用Solidity编写我们的第一份合约。

作为我们的第一个例子,我们将编写一个控制_faucet_的合约。我们已经使用了faucent在Ropsten测试网络上获得测试ether。faucet是一件相对简单的事情:它给任何地址发放ether,可以定期补充。你可以将faucet实现为由人类(或网络服务器)控制的钱包,但我们将编写一个实现faucet的Solidity合约:

pragma solidity ^0.4.19;

contract faucet{
    function withdraw(uint withdraw_amount) public {
        require(withdraw_amount <= 100000000000000000);
        msg.sender.transfer(withdraw_amount);
    }

    function () public payable {}
}

编译faucet合约

Solidity编译器是独立的可执行文件,作为不同框架的一部分,也捆绑在一个_Integrated Development Environment(IDE)_中。为了简单起见,我们将使用一种更流行的IDE,称为Remix。

使用你的Chrome浏览器(使用我们之前安装的MetaMask钱包)导航到以下位置的Remix IDE:

Remix - Ethereum IDE

在区块链上创建合约

在区块链上注册合约涉及创建一个特殊交易,其目标是地址0x0000000000000000000000000000000000000000,也称为_zero address_。零地址是一个特殊的地址,告诉以太坊区块链你想注册一个合约。幸运的是,Remix IDE将为你处理所有这些交易并将交易发送给MetaMask。

各项配置如下:

 点击“Create”或“Deploy“按钮:

Remix IDE将构建特殊的“creation“交易,MetaMask会要求你批准它。

现在,等待:合约在Ropsten上开采需要大约15到30秒的时间。Remix IDE似乎不会做太多,耐心等待。

 合约创建后,它会显示在“运行”选项卡的底部:

 与合约交互

 让我们回顾一下我们迄今为止学到的东西:以太坊合约是控制货币的程序,运行在名为EVM的虚拟机内。它们是由一个特殊的交易创建的,该交易提交它们的字节码以记录在区块链中。一旦他们在区块链上创建,他们就拥有一个以太坊地址,就像钱包一样。只要有人将交易发送到合约地址,它就会导致合约在EVM中运行,并将交易作为其输入。发送到合约地址的交易可能包含以太网或数据或两者都有。如果它们含有ether,则将其“存入”合约余额。如果它们包含数据,则数据可以在合约中指定一个命名函数并调用它,并将参数传递给该函数。

现在,将浏览器导航至https://mumbai.polygonscan.com/address/ +你的合约地址(我这里是0xf0a6b7b113caadbe89cbaabda55254dd9b322d0e)并将地址粘贴到搜索框中。你应该看到合约的以太坊地址记录:

 上面的交易是怎样完成的呢?

为合约提供资金

现在,合约其历史上只有一笔交易:合约创建交易。如你所见,合约也没有ether(零余额)。这是因为我们没有在创建交易中向合约发送任何提示,尽管我们可以提供。

让我们向合约发一些ether!你仍然应该在剪贴板中拥有合约的地址(如果没有,请从Remix再次复制)。打开MetaMask,然后向它发送0.01个ether,就像任何其他以太坊地址一样。

一分钟后,如果你刷新etherscan区块浏览器,它会向合约地址显示另一个交易,并更新0.01 ether的余额。

还记得我们的 Faucet.sol 代码中的未命名默认公共付费功能?它看起来像这样:

function () public payable {}

当你将交易发送到合约地址时,没有指定要调用哪个函数的数据,它将调用默认函数。由于我们将它声明为+payable+,因此它接受0.01 ether并存入合约账户余额中。你的交易导致合约在EVM中运行,更新其余额。我们资助了我们的faucet!

从我们的合约中提取

接下来,让我们从faucet中提取一些资金。要提取,我们必须构造一个调用 withdraw 函数并将 withdraw_amount 参数传递给它的交易。为了保持现在简单,Remix将为我们构建该交易,并且MetaMask将提交它以供我们批准。

返回到Remix选项卡并在“Run”选项卡下查看合约。你应该看到一个标记为 withdraw 的红色框,其中带有一个标记为 uint256 withdraw_amount:

首先,我们来看看 withdraw_amount。我们要试着提取0.001 ether,这是我们合约允许的最高金额。请记住,以太坊中的所有货币值都以 wei + 计价,而我们的 +withdraw 函数预期 withdraw_amount 也以 wei 计价。我们想要的数量是0.001 ether,这是 1000000000000000 wei(1后面跟着15个零)。 

MetaMask将弹出一个交易窗口供你批准。

我们现在看到一个新的交易,其中合约地址是目标地址,0 ether。合约余额已经改变,现在是0.009 ether,因为它按要求给了我们0.1 ether。但是我们在合约地址历史记录中看不到“OUT”交易。

提款的交易在哪里?合约的地址历史记录页面中出现了一个名为“内部交易”的新选项卡。由于0.001 ether传输源于合约代码,因此它是一个内部交易(也称为_message_)。点击“内部交易”标签查看:

这个“内部交易”是由合约在这行代码中发送的(Faucet.sol 的 withdraw 方法)

msg.sender.transfer(withdraw_amount);

回顾一下:我们从MetaMask钱包发送了一个包含数据指令的交易,以 0.001 ether 的+withdraw_amount+ 参数调用 withdraw 函数。该交易导致合约在EVM内部运行。当EVM运行faucet合约的 withdraw 功能时,首先它调用+require+函数并验证我们的金额小于或等于最大允许提款0.1 ether。然后它调用 transfer 函数向我们发送ether。运行 transfer 函数生成一个内部交易,从合约的余额中将0.001以太币存入我们的钱包地址。这就是 etherscan 中“内部交易”标签中显示的内容。

猜你喜欢

转载自blog.csdn.net/ljh1528207303/article/details/130556180