1

很高兴看到 Stack Overflow 上的区块链开发支持现在资源非常稀缺。

我是一个试图学习这个生态系统的新手。

如何将图像徽标添加到已在 remix.ethereum.org 上创建和部署的令牌?

我应该在部署之前这样做吗?

新手问题:一旦部署相同的代码就永远不能修改?

我目前正在与 BSC 上的代币进行交互——似乎所有 BSC 代币都是作为 Solidity 和 ETH ERC20 范式的分叉创建的。(?)

这是我的代码

pragma solidity ^0.8.0;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";

contract Foobar is ERC20 {
    constructor(uint256 initialSupply) public ERC20("Foobar", "FOO") {
        _mint(msg.sender, initialSupply);
    }
}
4

1 回答 1

0

简短回答:不,一旦您将合约部署到主网,您就无法修改或删除它,它将永远在区块链中(除非您使用测试网或私有区块链网络来测试合约)。

长答案:一旦部署了合约,就永远无法修改或删除它,您唯一可以通过调用其定义的函数来修改它的存储(合约使用的变量),但您无法修改其背后的逻辑。如果你搞砸了,你需要修复你的合同,然后重新部署。

请记住,在您将合约部署到主网并将应用程序投入生产之前,建议进行大量测试和深思熟虑的检查(如果您的合约将处理敏感值,则更是如此),主要是因为即使您搞砸并重新 -部署,如果你说生产中的合同工作,它极难修复。

例如:您创建了自己的小型银行,合约接收 eth,并将其存储为一个变量,一个地址与一个变量的映射,该变量记录合约持有的总 eth 中每个 eth 的数量用户。

contract Bank {
    
    // mapping of address with current money value.
    mapping (address user => uint money) balance;

    constructor(){}

    function withdraw(uint memory money) public {
        // Require money parameter is not empty.
        require(money != 0, "Can't withdraw 0 eth");


        // Big issue here, if we send the money, and then update the balance,
        //    the user will be able to withdraw money even if hi's balance turns 
        //    to 0 if he spams the withdraw function before he runs out of money. 
        //    The good way would be the other way around, first update balance, and then send.

        // Check if the user has enough money.
        if (balance[msg.sender].money >= money) {
            // Send money
            address(msg.sender).transfer(money);

            // Update balance.
            balance[msg.sender].money -= money;
        }

    
    }

    ...
}

现在这有一个关键问题,如果有人以非常快的速度提款两次,它会跳过检查用户余额中是否有足够的钱来提取的检查迭代。

现在要解决这个问题,您需要快速提取合约拥有的所有资金及其mapping(address user => uint money) ...映射数据,修复并重新部署合约,手动将所有资金发送到新合约,并设置之前的数据有,如果这还不够,您需要更改前端应用程序以连接新合同。

我知道这是一个很长的例子,但是当你从 0 开始编写合约时,你必须明白测试和修改合约是必须的。

一旦部署了合约,它就不能被修改或删除,它永远存在,至少在 mainned 中,这就是你使用私有区块链(如 Ganache)或使用公共测试网(Ropsten、Kovan、Rinkeby、Goerli)的原因。

另外关于标志,大多数代币在他们的合同中没有他们的“标志”(除非你正在制作 NFT [ERC721]),但是,如果你仍然想添加一个任何人都可以从你的合同中访问的标志,我'd 建议创建一个状态变量来保存其值(主要是字符串)。

该值可以是 IPFS 哈希(IPFS 是一个分散的文件系统,允许您上传任何类型的文件,上传后它将返回一个哈希,您可以通过 访问您的文件https://HASHTOKEN.ipfs.infura-ipfs.io/,例如:

https://bafybeibctnxu7zpatp3caj2gevofs2oirdvdyo6yulxk2hfyaewxib3pj4.ipfs.infura-ipfs.io/

在您的情况下,您可以在那里上传徽标,获取哈希并将其存储在您的合同中,然后在您的前端应用程序中,您只需将哈希添加到 url。

添加徽标的第二种方法是将您的图像转换为 base64 并将整个内容粘贴到您的合同中,这样您就可以在合同中获得真正的图像,但是,我不推荐最后一个解决方案,因为 base64 字符串可能会变得非常大,具体取决于文件的重量,而且您的合同越重,部署时使用的 gas 就越多,而用户尝试使用它时的成本也会更高。

但是,如果您的意思是在 BscScan 等网站上添加徽标,您可以在此处找到指南。

于 2021-07-25T22:55:31.323 回答