简短回答:不,一旦您将合约部署到主网,您就无法修改或删除它,它将永远在区块链中(除非您使用测试网或私有区块链网络来测试合约)。
长答案:一旦部署了合约,就永远无法修改或删除它,您唯一可以通过调用其定义的函数来修改它的存储(合约使用的变量),但您无法修改其背后的逻辑。如果你搞砸了,你需要修复你的合同,然后重新部署。
请记住,在您将合约部署到主网并将应用程序投入生产之前,建议进行大量测试和深思熟虑的检查(如果您的合约将处理敏感值,则更是如此),主要是因为即使您搞砸并重新 -部署,如果你说生产中的合同工作,它极难修复。
例如:您创建了自己的小型银行,合约接收 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 等网站上添加徽标,您可以在此处找到指南。