Ethereum(以太坊)里的那些事之第三篇

风险提示

根据银保监会等五部门于 2018 年 8月发布《关于防范以「虚拟货币」「区块链」名义进行非法集资的风险提示》的文件, 请广大公众理性看待区块链,不要盲目相信天花乱坠的承诺,树立正确的货币观念和投资理念,切实提高风险意识;对发现的违法犯罪线索,可积极向有关部门举报反映。

前情提示

上一篇文章大致讲了下权限控制及通过合约创建合约。因为文章是由浅入深,所以跨度不会太大,希望大家可以理解。话不多说,咱们直奔主题。

主题:我就是主题

合于代码如下:

solidity 复制代码
// SPDX-License-Identifier: MIT

pragma solidity  ^0.8.20;

contract SimpleTransfer {
    address public owner;

    event LogCallWithValue(address sender, uint amount);

    constructor() payable {
        owner = msg.sender;
    }

    function callWithValue() public payable {
        emit LogCallWithValue(msg.sender, msg.value);
    }

    function getBalance() public view returns(uint) {
        return address(this).balance;
    }

    function getTargetAddressBalance(address _target) public view returns(uint) {
        return address(_target).balance;
    }

    function transferEth(address _target, uint _amount) public {
        require(msg.sender == owner, "no permission");

        (bool success,) = _target.call{value: _amount}("");
        require(success, "transfer failed.");
    }

    receive() external payable {}

    fallback() external payable {}
}

Try on Remix

从代码我们可以看到,constructor函数和上篇文章里的constructor函数有点不太一样。这篇文章的constructor是这样的

ini 复制代码
constructor() payable {
        owner = msg.sender;
    }

而上篇文章的constructor却是这样的

ini 复制代码
constructor() {
    owner = msg.sender;
}

差别就是多了一个payable修饰符。带有这个修饰符的函数都可以在其他地方调用该函数的时候携带一定数额的Ether(当然不带也是可以的),而我们创建合约其实就会调用constructor,所以我们可以在部署合约的时候就发送一些Ether给合约。如下所示

可以看到我们在value这一栏里传了10 Wei给我们要部署的合约,那我们来看下部署之后,合约里有多少Ether,细心的同学可能发现了这个函数

csharp 复制代码
function getBalance() public view returns(uint) {
        return address(this).balance;
}

没错,我们就是通过这个函数来查当前合约有多少Ether的。至于这个用法,请大家自行在Solidity官方文档里查找,毕竟这样可以加深大家的印象。查询结果如下

返回的数值和我们在部署时传入的数值是一致的。接下来让我们试试通过调用callWithValue函数试试给合约发送Ether。请大家记住,截止目前合约里的Ether是10Wei。

首先我们要在这个输入框里输入我们要发送Ether的数量(当前测试发送的是20Wei),然后再点击callWithValue函数按钮

最后我们发现合约输出了LogCalWithValue日志,日志分别记录了函数调用者以及发送的Ether数量,如下图所示

然后我们再来查查当前合约的Ether余额

没错,合约的余额已经变成30Wei了,和我们预期的是一致的👏。

接下来让我们继续测试给其他地址发送Ether。没错,我们就是要调用transferEth 函数,让我们试试给随机地址0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db发送Ether,让我们先查查该地址还剩多少余额。结果如下图所示

该地址目前的余额是100000000000000000000Wei。接下来我们试试从和合约里给他转点,操作如下所示

最后我们来查查自己合约的余额以及0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db的余额

我们惊讶的发现,自己合约的余额少了20Wei,0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db地址余额多了20Wei😱,其实一点都不惊讶好吧,这是应该的😊。

号外

可能有细心的小伙伴发现了奇怪的地方,那就是下面这两个看起来古怪的函数

scss 复制代码
receive() external payable {}

fallback() external payable {}

他们为什么特别呢,因为他们没有function 关键字作为前缀,而且可见性都是external 且被payable 修饰,大家可能猜到了,这两个函数都可以使的智能合约直接接收Ether,而不是调用callWithValue这种被payable修饰的函数。那么什么时候receive会被调用,什么时候fallback会被调用呢?一张图送给你们

下集预告

既然发送和接收Ether都知道了,不得实战一波吗?下一篇就来试试用合约实现"英式拍卖",大家可以提前了解下英式拍卖的规则。友情提示,实现的合约里会有一个小小的坑

相关推荐
Richown18 小时前
AI + Web3 融合架构:大模型驱动的智能合约自动生成与审计
区块链·react
磐链科技21 小时前
交易所开发新范式:从社交钱包隐私保护中汲取的五大架构启示
架构·区块链
MartinYeung52 天前
当“捕食者”沦为“猎物”:Jaredfromsubway MEV机器人被黑750万美元的技术拆解与代码修复方案
机器人·区块链
MartinYeung52 天前
Aztec Connect 黑客攻击深度剖析:结算边界绕过漏洞
安全·区块链
ZDGJ60992 天前
恒指期货交易策略适合新手吗
区块链
baopixiaoz3 天前
AI量化策略师|Web3 量化交易研究员
大数据·人工智能·python·区块链
Jiamiren4 天前
WEEX:长鑫科技上市大涨,宇树科技合约同步走高,传统资产交易迎来新路径
人工智能·科技·区块链
黄焖鸡能干四碗4 天前
信息安全保障方案(Word文件)
大数据·网络·人工智能·架构·区块链
Web3李李5 天前
链游想要获得市场认可,核心从来不是极致去中心化
web3·去中心化·区块链·软件开发·链游开发
mykj15515 天前
稳定的DOO算力质押系统DAPP合约底层逻辑
web3·区块链·dapp·rwa·质押挖矿