【问题标题】:Is it possible to reserve an address on Solidity smart contract creation for taxes collection?是否可以在创建 Solidity 智能合约时保留一个地址用于征税?
【发布时间】:2021-06-18 09:09:24
【问题描述】:

我正在使用solidity 编程语言并尝试实现一个合同,每笔交易都扣除税费,并且该税费应转移到正在创建的合同的某个特定地址。这可能吗?

【问题讨论】:

    标签: blockchain ethereum solidity


    【解决方案1】:

    是的,这是可能的。所有以太坊代币标准(ERC-20、ERC-721、...)只定义了一个接口和几个其他点(例如何时发出事件)。因此,您可以随意实现所需的方法。


    假设您有一个非常简单的transfer() 实现,没有任何费用。

    注意:这不符合 ERC-* 标准,并且在 Solidity integer overflow 的攻击。我已对其进行了简化以更好地显示计算结果。

    function transfer(address _to, uint256 _amount) external {
        balances[msg.sender] -= _amount;
        balances[_to] += _amount;
    }
    

    添加费用只是一个小计算:

    address admin = address(0x123);
    
    function transfer(address _to, uint256 _amount) external returns (bool) {
        uint256 fee = (_amount / 100) * 3; // Calculate 3% fee
    
        balances[msg.sender] -= _amount; // subtract the full amount
        balances[admin] += fee; // add the fee to the admin balance
        balances[_to] += (_amount - fee); // add the remainder to the recipient balance
    }
    

    注意:这是为了演示基础知识,并没有考虑到少数情况,例如 _amount 的值不能被 100 整除(在这种情况下,费用不会正好是 3%) .

    【讨论】:

    • ERC-20 标准转账假设发送金额已全部发送,且全部金额可供发送。它将打破所有去中心化和中心化的交易。除非您打算只为自己使用令牌,否则您修改后的 transfer() 令牌无法以任何方式连接到更大的 DeFi 生态系统。
    • @MikkoOhtamaa 没错。这也是我写下“易受整数溢出”的注释的原因之一。从 Solidity 0.8 开始,金额是否可用的验证是通过下溢/上溢检查自动完成的。但在早期版本中,应该通过require 实现自定义检查或使用SafeMath 等库。
    • @Saulius 您应该将admin 地址值定义为您持有私钥的地址。然后,您可以像转移任何其他令牌一样(从管理员地址)转移令牌 - 通过调用 transfer() 函数。
    • @Saulius 我不确定您所说的“钱包哈希”是什么意思。如果您指的是私钥,您可以使用例如 web3.js privateKeyToAccount() 函数或 Metamask 导入功能。如果您的意思是地址的 keccak256 哈希,那么不可能将其转换回地址...还要记住地址是 checkum 并且更高版本的 Solidity 不接受校验和不正确的地址。
    • @Saulius 所以我建议在一个单独的问题中更好地描述这个问题。
    猜你喜欢
    • 2022-01-03
    • 2022-09-25
    • 2021-01-21
    • 2022-08-18
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多