将交易发送到已部署的智能合约需要很长时间。 (Nethereum + Unity)

It takes too long to send transaction to the smart contract which is already deployed. (Nethereum + Unity)

我正在使用 Unity 和 Nethereum 制作一些 dApp。

我使用 Remix 将一份合约部署到 Ropsten 测试网。我有它的 abi 和字节码,所以我使用 VS Code 的 solodity 包制作了定义和服务 C# 代码。

我想铸造新的 NFT,下面是我试过的代码。

string url = "my infura - ropsten url";
string privateKey = "private Key of my MetaMask account";
string userAddress = "public address of my MetaMask account";
string contractAddress = "address of deployed contract";
var account = new Account(privateKey);
var web3 = new Web3(account, url);

var service = new MyNFTService(web3, contractAddress);
var mintReceipt = await service.MintRequestAndWaitForReceiptAsync(userAddress, "address of metadata");

但是隔了很久还是收不到...这是为什么?我得不到任何答案,我只能等待。

我已经尝试了所有我能做的事情,比如 SendTransactionAndWaitForReceiptAsnyc()、SignAndSendTransaction() 等等。

Nethereum版本为4.1.1,Unity版本为2019.4.21f1

下面是部分定义代码。 (薄荷)

public partial class MintFunction : MintFunctionBase { }

[Function("mint", "uint256")]
public class MintFunctionBase : FunctionMessage
{
    [Parameter("address", "user", 1)]
    public virtual string User { get; set; }
    [Parameter("string", "tokenURI", 2)]
    public virtual string TokenURI { get; set; }
}

以下是部分服务代码。 (薄荷)

public Task<string> MintRequestAsync(MintFunction mintFunction)
{
     return ContractHandler.SendRequestAsync(mintFunction);
}

public Task<TransactionReceipt> MintRequestAndWaitForReceiptAsync(MintFunction mintFunction, CancellationTokenSource cancellationToken = null)
{
     return ContractHandler.SendRequestAndWaitForReceiptAsync(mintFunction, cancellationToken);
}

public Task<string> MintRequestAsync(string user, string tokenURI)
{
     var mintFunction = new MintFunction();
     mintFunction.User = user;
     mintFunction.TokenURI = tokenURI;
            
     return ContractHandler.SendRequestAsync(mintFunction);
}

public Task<TransactionReceipt> MintRequestAndWaitForReceiptAsync(string user, string tokenURI, CancellationTokenSource cancellationToken = null)
{
     var mintFunction = new MintFunction();
     mintFunction.User = user;
     mintFunction.TokenURI = tokenURI;
            
     return ContractHandler.SendRequestAndWaitForReceiptAsync(mintFunction, cancellationToken);
}

我被这个问题困扰了五天...请帮助我..

我今天解决了! (但我没有使用我的服务代码)

在我看来,交易不成功的原因是矿工无法开采我的交易。 (没错,他们可以挖矿,但他们没有,因为挖其他交易会给他们更多的钱。)

在Netherum的文档中,他们说nethereum可以将gas price设置为平均值,但我认为它不起作用。在我添加代码来估算和设置汽油价格后,SendRequestAndWaitForReceiptAsync() 运行良好。 (而且我可以收到交易哈希。)

下面是我用来解决这个问题的代码。

var mintHandler = web3.Eth.GetContractTransactionHandler<MintFunction>();
var mint = new MintFunction()
{
    User = userAddress,
    TokenURI = "Token URI"
};

mint.GasPrice = Web3.Convert.ToWei(25, UnitConversion.EthUnit.Gwei);
var estimate = await mintHandler.EstimateGasAsync(contractAddress, mint);
mint.Gas = estimate.Value;

var mintReceipt = await mintHandler.SendRequestAndWaitForReceiptAsync(contractAddress, mint);
Debug.Log(mintReceipt.TransactionHash);