简体   繁体   English

如何部署具有链上 NFT 和复杂/长 svg 的智能合约?

[英]How to deploy a smart contract with on-chain NFTs and complex/long svgs?

I want to deploy a smart contract that creates NFTs on-chain, it means that the data of the image/svg, in my case, lives on the blockchain and it will be drawable thanks to Base64 encryption.我想部署一个在链上创建 NFT 的智能合约,这意味着图像/svg 的数据,在我的例子中,存在于区块链上,并且由于 Base64 加密,它可以被提取。 I studied the topic, but I don't know how to make the smart contract deployable if the svg is bigger enough to cause the "Contract code size exceeds 24576 bytes" error.我研究了这个主题,但我不知道如果 svg 大到足以导致“合约代码大小超过 24576 字节”错误,如何使智能合约可部署。

In my specific case I need a font to use in my SVG and the only way to import it is this:在我的具体情况下,我需要在我的 SVG 中使用一种字体,导入它的唯一方法是:

@font-face {
  font-family: "Titan One";
  src: url(data:application/octet-stream;base64,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);
}

I already reduce the font chars by taking just the ones I need, but only this line cause the error mentioned before.我已经通过只取我需要的字符来减少字体字符,但只有这一行会导致前面提到的错误。

Does anyone know how to handle this problem?有谁知道如何处理这个问题? Some reference to follow?一些参考遵循? Anything!任何事物!

I know it's possible because of this on-chain NFTs project Edwom that mints SVGs logger than mine (even with the same long line font).我知道这是可能的,因为这个链上 NFT 项目Edwom 生成的 SVG 记录器比我的要多(即使使用相同的长行字体)。 They use some kind of byte16 sequence assembly that I don't understand it and I don't know if it is the best way to do it.他们使用某种我不理解的 byte16 序列汇编,我不知道这是否是最好的方法。 Thanks for the help.谢谢您的帮助。

If the problem is the contract size, one option is to deploy the contract without the SVG part, then you just need a function to store that SVG after the contract is deployed , for example:如果问题是合约大小,一种选择是在没有 SVG 部分的情况下部署合约,那么你只需要一个 function 来存储合约部署后的SVG ,例如:

contract MyContract {
  // ...

  string public svg; // could be a map or whatever depending on ur needs

  function setSvg(string calldata svg_) external {
      // Make sure only you can call this function...
      svg = _svg;
  }
}

Then u can use the svg variable to render the tokenURI然后你可以使用svg变量来呈现tokenURI

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM