如何使用 python/solidity 生成钱包和转移/铸造代币给他们?

Posted

技术标签:

【中文标题】如何使用 python/solidity 生成钱包和转移/铸造代币给他们?【英文标题】:How do I generate wallets and transfer/mint tokens to them using python/solidity? 【发布时间】:2021-08-28 07:36:37 【问题描述】:

我制作了一个简单的 bep 20 代币,我正在尝试铸造我的钱包地址 50% 的代币供应,并将剩余 50% 的供应平均分配给我想用代码生成的 10 个不同的钱包。我不确定这是否可以在合同本身内完成,还是必须在部署合同后通过 python 单独完成。

这里是solidity代码:


contract Token 
    mapping(address => uint) public balances;
    mapping(address => mapping(address => uint)) public allowance;
    uint public totalSupply = 10000000000;
    string public name = 'TestToken';
    string public symbol = 'TEST';
    uint public decimals = 9;
    
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owener, address indexed spender, uint value);
    
    constructor() 
        balances[msg.sender] = totalSupply;
    

    function balanceOf(address owner) public view returns(uint) 
        return balances[owner];
    
    
    function transfer(address to, uint value) public returns(bool) 
        require(balanceOf(msg.sender)>= value, 'You are broke lol');
        balances[to] += value;
        balances[msg.sender] -= value;
        emit Transfer(msg.sender, to, value);
        return true;
        
    
    function transferFrom(address from, address to, uint value) public returns(bool) 
        require(balanceOf(from) >= value, 'You broke');
        require(allowance[from][msg.sender] >= value, 'allowance too low');
        balances[to] += value;
        balances[from] -= value;
        emit Transfer(from, to, value);
        return true;
    
    
    function approve(address spender, uint value) public returns(bool) 
        allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    
```

【问题讨论】:

【参考方案1】:

您可以实现 mint() 函数,将前 50% 分配给 msg.sender(或硬编码地址),将其他 50% 分配给函数参数中传递的 10 个地址。

您的 python 脚本(或任何其他客户端、钱包软件、JS 脚本等)生成 10 个地址并将它们传递到参数中。 JS 中使用web3 库的示例:

const Web3 = require('web3');

const web3 = new Web3(providerUrl); // TODO fill your value
const contract = new web3.eth.Contract(abiJson, contractAddress); // TODO fill your values

const mintTokens = async () 
    const amount = web3.utils.toWei('1', 'ether');
    const addresses = await getRandomAddresses();

    await contract.methods.mint(amount, addresses).send();


const getRandomAddresses = async () 
    let addresses = [];

    for (let i = 0; i < 10; i++) 
        const account = web3.eth.accounts.create();
        addresses.push(account.address);
    

    return addresses;


mintTokens();

请注意,此示例要求 _amount 可以被 20 整除。否则,会导致结果稍有不正确(最多 5%)。

另外,我的示例中没有授权,因此任何人都可以执行此功能。您可能还想实现授权(例如使用ownable 模式),或将函数标记为internal(这样任何人都不能执行它)并仅从constructor() 调用它。

pragma solidity ^0.8.4;

contract Token 
    mapping(address => uint) public balances;
    event Transfer(address indexed from, address indexed to, uint value);
    
    function mint(uint256 _amount, address[10] memory _receivers) external 
        // mint 50% of the _amount to one address
        balances[msg.sender] += _amount / 2;
        emit Transfer(address(0x0), msg.sender, _amount / 2);
        
        // mint the rest (another 50%) evenly to each receiver
        // i.e. each gets 5%
        for (uint i = 0; i < 10; i++) 
            balances[_receivers[i]] += _amount / 20;
            emit Transfer(address(0x0), _receivers[i], _amount / 20);
        
    

【讨论】:

感谢您的帮助!我该怎么做这部分'你的 python 脚本(或任何其他客户端、钱包软件、JS 脚本等)然后生成 10 个地址并在参数中传递它们。此外,这只是我很好奇的一项小任务,因此安全性不应该是一个大问题。 @Reece 我已经添加了一个 JS 示例(因为我在 JS 中比在 Python 中更好),希望它有所帮助。 欣赏它,我会尝试将它改编为python,看看我能用它做什么 我无法让 web3.eth.accounts.create() 工作,所以我改用 from eth_account import Account 和以下代码 addresses = []; i = 0 while i &lt; 10: acct = Account.create('KEYSMASH FJAFJKLDSKF7JKFDJ 1530') address = acct.address i += 1 contract.functions.mint(10000000000, addresses).call() 但是我不知道如何为令牌提供输入号码和地址并不断收到错误Function invocation failed due to no matching argument types。你知道如何解决这个问题吗?

以上是关于如何使用 python/solidity 生成钱包和转移/铸造代币给他们?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 web3 将以太坊从一个钱包转移到另一个钱包?

如何使用我的私钥文件加载我的 Solana 钱包?

门罗币(MONERO)钱包生成教程

门罗币(MONERO)钱包生成教程

门罗币(MONERO)钱包生成教程

门罗币(MONERO)钱包生成教程