1

I have implemented a contract where a set of ERC721 tokens should be generated with a function call in private net. Code as follows :

function mint(
    address _owner,
    uint256[] _id
)
    onlyOwner
    external
    returns (uint256)
{
    for(uint i = 0; i<_id.length; i++){
        super._mint(_owner, _id[i]);
    }
}

It creates up to 33 ERC721 Tokens, then the gas hits the gasLimit and loop ends. I am running it on my private net with genesis file as follows:

{
  "config": {
  "chainId": PrivateNetworkID,
 "homesteadBlock": 0,
  "eip155Block": 0,
  "eip158Block": 0
},
"alloc": {
"0x0000000000000000000000000000000000000001": {"balance": "111111111"},
"0x0000000000000000000000000000000000000002": {"balance": "222222222"}
},
"coinbase"   : "0x0000000000000000000000000000000000000001",
"difficulty" : "0x20000",
"extraData"  : "",
"gasLimit"   : "0x8880000",
"nonce"      : "0x0000000000000042",
"mixhash"    : 
"0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : 
"0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp"  : "0x00"
}

JS :

MyNFToken.deployed().then(function (instance) {

 //randomtoken - Array containing 33 tokenID
  return instance.mint(account, randomtoken, { from: account, gas: 4600000 }).then(function (result) {

    console.log('Result = ' + JSON.stringify(result));

  })
});

In js if I change the gas:4600000 to a higher value, gaslimit exceeds error occurs.

How can I resolve this?Is it possible to create at least 1000 tokens in a function call? Help will be appreciated :)

  • Please explain your use case. Will you be doing this one time or periodically? – William Entriken Jan 25 at 15:05
  • Need more information: How much gas is each create token loop call consuming and what is the gas limit on the network you are on? Assuming you're on Ethereum mainnet the gas limit is 8000000. That would mean your 33 calls are using roughly 240K in gas each. You would hit the gas limit and get the out of gas error message. – Michael Quale Jan 25 at 15:37
  • Thanks...I have added the genesis file above.I tried --targetgaslimit '9000000000000' on the command initiating private net node, but still I'm getting exceeds gaslimit error – angelmaria Jan 28 at 7:21
1

As of today 2019-01-25 in mainnet the block gas limit is 8M. If minting a single token consumes 50K gas then you can at most create 160 tokens.

 8000000 / 50000 = 160

If you have to mint 1000 tokens I'd suggest to try a different approach. For example you can store only the root of the merkle tree of the new tokens. If someone wants to redeem tokens they submit the path of the token in the merkle tree, and after validation the tokens is added to their account.

1

This technique was presented on stage at NFT.nft by yours truly using a combination of ERC-721, ERC-998 (ish) and ERC-1167.

Also the technique is explained in Su Squares at https://github.com/su-squares/ethereum-contract

It is surely too much code to paste in this answer so I'll summarize:

  • You can only create N tokens at once efficiently during contract creation
  • Don't be afraid of creating contracts to create tokens
  • Contracts can be created efficiently using the proxy standard

The presentation is available at http://nft.life

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.