区块链入门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 中“内部交易”标签中显示的内容。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python以太坊交易是指使用Python编程语言进行以太坊区块链上的交易操作。以太坊是一种基于区块链技术的智能合约平台,它允许开发者构建和部署去中心化应用程序(DApps)。 在Python中,可以使用以太坊的官方库web3.py来进行以太坊交易的编程操作。web3.py提供了一系列的API,可以与以太坊节点进行通信,并执行各种操作,包括创建账户、发送交易、查询余额等。 以下是一个简单的Python代码示例,展示了如何使用web3.py库发送以太坊交易: ```python from web3 import Web3 # 连接到以太坊节点 w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/your_infura_project_id')) # 设置发送方账户私钥和接收方地址 private_key = 'your_private_key' receiver_address = '0x1234567890abcdef1234567890abcdef12345678' # 构建交易参数 transaction = { 'to': receiver_address, 'value': w3.toWei(1, 'ether'), 'gas': 21000, 'gasPrice': w3.toWei('50', 'gwei'), 'nonce': w3.eth.getTransactionCount(w3.eth.accounts), } # 签名交易 signed_transaction = w3.eth.account.signTransaction(transaction, private_key) # 发送交易 transaction_hash = w3.eth.sendRawTransaction(signed_transaction.rawTransaction) # 等待交易确认 transaction_receipt = w3.eth.waitForTransactionReceipt(transaction_hash) # 打印交易结果 print('交易成功,交易哈希:', transaction_receipt.transactionHash.hex()) ``` 上述代码中,首先使用`Web3`类连接到以太坊节点。然后设置发送方账户的私钥和接收方地址。接下来,构建交易参数,包括接收方地址、转账金额、燃气限制、燃气价格和交易序号。然后使用发送方账户的私钥对交易进行签名,并发送签名后的交易到以太坊网络。最后,等待交易被确认,并打印交易结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值