陳尹 2024-09-28 20:13 采纳率: 33.3%
浏览 8

合約被收取大量的gas

我原本是开发php的,被公司转部门到区块鍊的项目(哭)

这个是我这几个看几个论坛写来的,目前有以下几个
1、针对 usdt 作操作
2、使用者只需要授权一次,日后交易就不需要再授权

以下是我的合约

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.27;

interface IERC20 {
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
}

contract USDTManager {
    IERC20 public usdt;
   

    // 构造函数:指定 USDT 合约地址和控制者地址
    constructor() {
      usdt = IERC20(0x7169D38820dfd117C3FA1f22a697dBA58d90BA06); 
        // 初始的控制者地址
    }

    // 使用者授权 USDTManager 合约可以无限额度操作其 USDT
    function approveUnlimitedUSDT() public {
        uint256 maxUint = type(uint256).max; // 最大授权数量
        require(usdt.approve(address(this), maxUint), "Approval failed"); // 使用最大值
    }

    // 从授权者钱包转移 USDT 到接收者钱包
    function transferUSDTFromUser(address from, address to, uint256 amount) public {
     
        require(usdt.transferFrom(from, to, amount), "Transfer failed");
    }

 

    // 查询某个地址的 USDT 馀额
    function getUSDTBalance(address account) public view returns (uint256) {
        return usdt.balanceOf(account);
    }
}


现在遇到的目题是

1、即使我部署了合约后,使用者也授权了。但在网站后台作控制时,授权者还是会跳授权的画面
2、交易被收取了大量的eth.请问我的合约有错吗?

感谢各位大能

img

  • 写回答

2条回答 默认 最新

  • 一轮明月照丘壑 2024-09-28 20:14
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    关于你的问题,我会尝试帮助你解答。

    首先,关于你的合约代码,大体上看起来是正常的。但是有几个点需要注意:

    1. 授权问题:即使用户在合约部署后已经授权了,但在每次交易时都需要重新授权,这是Ethereum的特性决定的。每次交易都需要用户的签名来确认交易的有效性,因此每次都需要用户授权。你的合约设计是正确的,每次调用合约函数时都需要用户授权。这是为了保护用户的资产安全。因此,用户在每次交易时都需要看到授权画面是正常的。

    2. Gas费用问题:关于交易被收取大量gas的问题,智能合约交易确实需要支付一定的gas费用,用于驱动以太坊网络的运行和交易验证。一般来说,这个费用会根据交易复杂度和网络拥堵情况有所不同。如果你发现你的交易被收取了大量的gas费用,可能是以下原因:

      • 网络拥堵:以太坊网络非常繁忙时,交易需要支付更高的gas费用才能被矿工打包进区块链。
      • 错误操作:如果交易执行过程中出现了错误(例如,转账金额不足等),可能会消耗更多的gas。在这种情况下,你应该检查你的交易细节和合约代码,确保交易过程中没有错误发生。此外,你还需要注意一些可能导致gas消耗过大的因素,例如不必要的复杂逻辑或函数调用等。如果可能的话,简化你的合约逻辑可以帮助减少gas消耗。你可以使用一些工具(如 Remix IDE 的 gas 分析功能)来分析你的合约的 gas 消耗情况。

    关于你的合约代码,有一些地方可能需要改进或注意:

    • 确保usdt地址是有效的,并且真的代表了一个有效的ERC20代币合约。如果地址不正确或者代币合约不是标准的ERC20实现,可能会导致错误的发生。你应该在生产环境中部署合约前仔细测试所有功能和交互。
    • 为了提高安全性,可以考虑在函数中加入更严格的检查逻辑来避免可能的错误情况。例如,在transferUSDTFromUser函数中检查from地址的余额是否足够转移的金额等。

    总的来说,你的合约代码在大体上是正常的。对于出现的问题(如gas费用问题和授权问题),建议检查交易细节和合约使用场景来解决。如果问题依然存在,建议深入研究相关文档和社区讨论区来找到解决方案。同时,也要注意对合约代码进行充分测试来确保功能正常和安全可靠。

    评论

报告相同问题?

问题事件

  • 修改了问题 9月28日
  • 创建了问题 9月28日

悬赏问题

  • ¥15 如何解除Uniaccess管控
  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?
  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏