气体估计失败:"无效操作码:无效"。此事务可能会还原。如果您想广播,您必须手动设置气体限制



我根据自己的需要改编了本教程中的代码。它在rinkeby网络上运行良好,但当我试图在孟买网络上运行它时,我遇到了一个错误。

AdvancedCollection.sol>gt;

pragma solidity 0.6.6;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";

contract AdvancedCollectible is ERC721 {
bytes32 internal keyHash;
uint256 public fee;
event requestedCollectible(address indexed senderAdd);
uint256 public tokenCounter;
struct Remedio { 
string nome_medicamento;
uint256 dosagem;
string farmaceutica;
string posologia;
}   

enum Breed{PUG, SHIBA_INU, ST_BERNARD}
mapping(uint256 => address) public requestIdToSender;
mapping(uint256 => Breed) public tokenIdToBreed;
mapping(uint256 => Remedio) public tokenIdToRemedio;
mapping(uint256 => uint256) public requestIdToTokenId;

constructor() public
ERC721("GeradorReceitasMedicas", "Receita")
{

tokenCounter = 0;
}

function createCollectible(string memory nomeMedicamento, uint256 dosagem, string memory farmaceutica, string memory posologia) 
public returns (bytes32) {

uint256 newItemId = tokenCounter;
tokenCounter = tokenCounter + 1;
Remedio memory newRemedio = Remedio({
nome_medicamento: nomeMedicamento,
dosagem: dosagem,
farmaceutica: farmaceutica,
posologia: 'posologia'
});
requestIdToSender[newItemId] = msg.sender;
address receitaOwner = requestIdToSender[newItemId];
_safeMint(receitaOwner, newItemId);
tokenIdToRemedio[newItemId] = newRemedio;
emit requestedCollectible(receitaOwner);
}


}

LinkTokenInterface.sol:

pragma solidity ^0.6.6;
interface LinkTokenInterface {
function allowance(address owner, address spender) external view returns (uint256 remaining);
function approve(address spender, uint256 value) external returns (bool success);
function balanceOf(address owner) external view returns (uint256 balance);
function decimals() external view returns (uint8 decimalPlaces);
function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);
function increaseApproval(address spender, uint256 subtractedValue) external;
function name() external view returns (string memory tokenName);
function symbol() external view returns (string memory tokenSymbol);
function totalSupply() external view returns (uint256 totalTokensIssued);
function transfer(address to, uint256 value) external returns (bool success);
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);
function transferFrom(address from, address to, uint256 value) external returns (bool success);
}

DeployAdvanced.py:

from brownie import AdvancedCollectible, accounts, network, config
from scripts.helpful_scripts import fund_advanced_collectible
def main():
print(config['wallets']['from_key'])
dev = accounts.add(config['wallets']['from_key'])
print(network.show_active())
#print(config['networks'][network.show_active()]['host'])
publish_source = False
print(config['wallets']['from_key'])
advanced_collectible = AdvancedCollectible.deploy(
{"from": dev},
publish_source=publish_source,
)
fund_advanced_collectible(advanced_collectible)
return advanced_collectible

helpful_scripts.py:

from brownie import AdvancedCollectible, accounts, config, interface, network

def fund_advanced_collectible(nft_contract):
dev = accounts.add(config['wallets']['from_key'])
link_token = interface.LinkTokenInterface(
config['networks'][network.show_active()]['link_token']
)
link_token.transfer(nft_contract, 1000000000000000000, {"from": dev})

布朗尼配置yaml:

计算测试覆盖率时排除SafeMath

https://eth-brownie.readthedocs.io/en/v1.10.3/config.html#exclude_paths

报告:exclude_conducts:-SafeMath依赖项:

  • smartcontractkit/chainlink-brownie-contracts@1.1.1
  • OpenZeppelin/openzeppelin-contracts@3.4.0编译器:solc:重新映射:
    • '@chainlink=smartcontractkit/chainlink-brownie-contracts@1.1.1'
    • '@openzeppelin=openzeppelin/openzeppelin-contracts@3.4.0'

自动从Etherscan autoetch_sources:True dotenv:.env获取合同源

为开发网络设置自定义助记符:默认值:development kovan:

vrf_coordinator: '0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9'
link_token: '0xa36085F69e2889c224210F603D836748e7dC0088'
keyhash: '0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4'
fee: 100000000000000000
oracle: '0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e'
jobId: '29fa9aa13bf1468788b7cc4a500a45b8'
eth_usd_price_feed: '0x9326BFA02ADD2366b30bacB125260Af641031331'   rinkeby:
vrf_coordinator: '0xb3dCcb4Cf7a26f6cf6B120Cf5A73875B7BBc655B'
link_token: '0x01be23585060835e02b77ef475b0cc51aa1e0709'
keyhash: '0x2ed0feb3e7fd2022120aa84fab1945545a9f2ffc9076fd6156fa96eaff4c1311'
fee: 100000000000000000
oracle: '0x7AFe1118Ea78C1eae84ca8feE5C65Bc76CcF879e'
jobId: '6d1bfe27e7034b1d87b5270556b17277'
eth_usd_price_feed: '0x8A753747A1Fa494EC906cE90E9f37563A8AF630e'
host: 'https://rinkeby.infura.io/v3/${WEB3_INFURA_PROJECT_ID}'   mumbai:
link_token: '0x326C977E6efc84E512bB9C30f76E30c160eD06FB'
eth_usd_price_feed: '0x0715A7794a1dc8e42615F059dD6e406A6594651A'   polygon-test:
link_token: '0x326C977E6efc84E512bB9C30f76E30c160eD06FB'
eth_usd_price_feed: '0x0715A7794a1dc8e42615F059dD6e406A6594651A'   binance:
# link_token: ??
eth_usd_price_feed: '0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2e'   binance-fork:
eth_usd_price_feed: '0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2e'   mainnet-fork:
eth_usd_price_feed: '0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419'   matic-fork:
eth_usd_price_feed: '0xF9680D99D6C9589e2a93a78A04A279e509205945' wallets:   from_key: ${PRIVATE_KEY}   from_mnemonic: ${MNEMONIC}

设置:gas_limit:"100000000000";

当我在Rinkeby上运行它时,我得到(运行命令brownierun.\scripts\advancedCollectable\deploy_advanced.py--network Rinkeby):

INFORMAÇâES:não foi possível localitar arquivos para o(s)padrão(õES)特别是。Brownie v1.18.1-Python开发框架以太坊

ContratoNftProject是活动项目。

正在运行"scripts\advancedCollectable\deploy_advanced.py::main"。。。溜冰场发送的交易:0xf3cbcf650ab9b4408f8e795469ffa60a61f5943ab485ec133e3650fece7545db
天然气价格:1.499999222 gwei天然气限额:2377218无:670x5D37fc76D54880F878a395755df5101B644B655a

C: \Users\p\AppData\Roaming\Python\Python39\site-packages\brownie\network\contract.py:1180:BrowneCompiler警告:0x5D37fc76D54880F878a395755df5101B644B655a:本地编译的字节码和链上字节码不匹配!warnings.warn(发送的交易:0x74a64ac1449a597584bbca8dc0947e80a6ad042ca68453da6e50a0dbbfe67da
天然气价格:1.499999221 gwei天然气限额:56992 Nonce:68
LinkToken。转账确认区块:10631644用气:51811(90.91%)

当我在孟买运行它时,我得到(运行命令brownie-run.\scripts\advancedCollectable\deploy_advanced.py--网络多边形测试):

INFORMAÇâES:não foi possível localitar arquivos para o(s)padrão(õES)特别是。Brownie v1.18.1-Python开发框架以太坊

ContratoNftProject是活动项目。

正在运行"scripts\advancedCollectable\deploy_advanced.py::main"。。。多边形测试发送的交易:0x6915605b9dfb985b8ef078e3268a6b6e6e2e0b95d3d25ce8e51912c7a71db84d7
天然气价格:1.759579396 gwei天然气限额:2377218无:13
AdvancedCollection.constructor确认区块:26234140天然气已使用:2161108(90.91%)AdvancedCollections部署于:0xdbae4544699a953f2b28AFfBA7708Fd9eb1B4Cf

文件"C: \Users\p\AppData\Roaming\Python\Python39\site packages\browne_cli\run.py",第51行,主return_value,frame=run(文件"C:\Users\p\AppData\Roaming\Python\Python39\site-packages\brownie\project\scripts.py";,线路103,运行中return_value=f_locates[方法名称](*args,**kwargs)文件"。\scripts\advancedCollectable\deploy_advanced.py";,第16行,主fund_advanced_collectible(advanced_collectible)文件";。\scripts\helpful_scripts.py";,第10行,在fund_advanced_collectable中link_token.transfer(nft_contract,1000000000000000000,{来自:dev})文件"C: \Users\p\AppData\Roaming\Python\Python39\site-packages\brownie\network\contract.py";,第1710行,在调用中返回self.transaction(*args)File";C: \Users\p\AppData\Roaming\Python\Python39\site-packages\brownie\network\contract.py";,1583行,交易中return tx["from"].transfer(文件"C:\Users\p\AppData\Roaming\Python\Python39\site-packages\brownie\network\account.py";,644行,正在传输收据,exc=自己_make_transaction(文件"C:\Users\p\AppData\Roaming\Python\Python39\site-packages\brownie\network\account.py";,在_make_transaction
raise VirtualMachineError(e)from None File中的第727行";C: \Users\p\AppData\Roaming\Python\Python39\site packages\brownie\exceptions.py",第93行,在init中,从None引发ValueError(str(exc)):气体估计失败:"无效操作码:invalid"。这笔交易很可能还原如果你想广播,你必须设置气体限制手动。

为什么我在孟买网络上收到这个错误?有可能修复上面的错误吗?

您的brownie-config.yaml在孟买测试网上定义了一个link_token地址。然后,fund_advanced_collectiblePython函数尝试从dev地址传输此令牌。

从你帖子的其他上下文中,我发现dev地址是0x7cc6FA028dffa310445af40C3abEea61F8534d97。

请注意,作为调试输出的一部分,您共享了私钥,但没有直接共享dev地址(我仍然可以从密钥中派生)。我不确定这是否是你故意的,但如果主网上的同一地址上有货币价值的加密货币,任何人都可以使用这个私钥窃取它。所以我建议你考虑这个地址被泄露了,永远不要在主网上使用它

无论如何,dev地址在孟买测试网上没有任何LINK令牌,这使得脚本的这一部分失败:

link_token.transfer(nft_contract, 1000000000000000000, {"from": dev})

您可以从Chainlink水龙头领取testnet LINK代币:https://faucets.chain.link/mumbai

相关内容