问题描述
很高兴看到 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。