WEB3-Day5—Solidity基础[part4]

WEB3-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数量。

image-20250702172430218

撤销交易[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 Wei

Gwei是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函数,报错信息成功返回:

image-20250702171556647

⚠️ 回滚以后交易消耗的gas费不会返回的