Solidity - 添加令牌标志

问题描述

很高兴看到 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);
    }
}

解决方法

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

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

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

例如:您创建了自己的小银行,合约接收 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 开始编写合约时,你必须明白测试和修改合约是必须的。

合约一旦部署,就不能修改或删除,它永远存在,在主链中,这就是为什么你使用私有区块链,如 Ganache,或使用公共测试网(Ropsten、Kovan、Rinkeby、Goerli)。

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

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

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

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...