WEB3-Day5—Solidity基础[part4]

WEB3-Day5—Solidity基础[part4]
SoniaChenWEB3-Day5—Solidity基础[part4]
通过函数发送ETH
新建合约 FundMe.sol
,在本合约中会通过fund()
函数向智能合约转移以太币。该函数将要求最低数量的ETH确保交易正常。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract FundMe{
function fund() public {
}
}
我们还需要一个Withdraw函数,这样合约的owner(拥有者)可以提取不同的funder 发送的资金。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract FundMe{
function fund() public {
}
function withDraw() public {
}
}
当交易被发送到区块链时,交易数据中始终包含一个value字段。该字段表示该交易中转账的原生加密货币数量。
要使fund函数可以接受ether,必须将其声明为payable。同时在remix界面中部署了可以看到,这个关键字会使函数显示为红色,表示它可以接受加密货币。
function fund() public payable {
}
msy.value 属性
在solidity中,交易的数值可以通过这个属性进行访问,是全局对象msg的一部分,表示当前交易中传输的Wei的数量。【Wei是ETH的最小单位】
function fund() public payable {
msg.value;
}
交易字段
以太坊上发送的每笔交易都包含一些必要字段,这些字段包括:
- Nonce:这是发送地址的交易计数器。它确保交易按顺序执行,并防止重播攻击。
- Gas Price:这是发送者愿意支付的 gas 单价,以太坊网络会根据 gas price 和 gas limit 来计算手续费。
- Gas Limit:这是交易执行所需的最大 gas 数量。它决定了交易的复杂程度和成本。
- To:这是接收以太币或者调用智能合约的目标地址。
- Value:这是发送的以太币数量。
- Data:这是可选字段,用于向智能合约发送数据。
- v、r、s:这些字段用于交易的签名验证,确保交易的安全性和完整性。
在转账的时候,我们可以填充其中一些字段,例如,gas limit中填充的21,000,data是空的,然后to是我们想要将交易发送到的地址,在函数调用的交易中,仍然可以以这种方式填写to,我们可以调用一个函数,并同时进行转账。
Value
每当我们在任何一个兼容EVM的区块链上创建一笔交易时,这个value的值,代表我们将通过这笔交易发送多少ETH,当我们在不同账户间转移ETH时,实际上就是在value中填充不同的ETH数量。
撤销交易[Reverting Transactions]
我们可以使用requires
关键字作为检查器,强制要求函数接收至少value
个完整的以太币, 不满足就会回滚。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract FundMe{
function fund() public payable {
require(msg.value > 1 ether, "Didn't send enough ETH"); //if the condition is false, revert with the error message }
}
function withDraw() public {
}
}
msg.value > 1 ether
等同于 msg.value > 1e18
👀❗提示
1 Ether = 1e9 Gwei = 1e18 WeiGwei是Gas费用的单位。
在线转换单位的工具 :Ethconverter
回滚操作会撤销之前的所有操作,并将剩余gas费返还给交易者,我们在fund函数中添加一些逻辑:
myvalue += 2;
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract FundMe{
uint256 public myvalue = 1;
function fund() public payable {
myvalue += 2;
require(msg.value > 1 ether, "Didn't send enough ETH"); //if the condition is false, revert with the error message }
}
function withDraw() public {
}
}
部署合约,点击fund函数,报错信息成功返回:
⚠️ 回滚以后交易消耗的gas费不会返回的