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

发布于 2025-01-24 19:58:22 字数 2287 浏览 2 评论 0原文

我正在使用Unity进行一些DAPP&内雷姆。

我使用混音部署了一份合同到Ropsten测试网。我有Abi&它的字体代码,所以我进行了定义&服务C#使用vs代码的跨度软件包。

我想铸造新的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。

以下是定义代码的一部分。 (MINT)

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);
}

我为这个问题挣扎了五天...请帮助我。

I'm making some dApp using Unity & Nethereum.

I deployed one contract to the Ropsten Test Net using Remix. And I had abi & bytecode of that, so I made Definition & Service C# code using solodity package of VS Code.

I wanted to mint new NFT, and below is the code that I tried.

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");

But I can't get receipt even after a long time... Why is this happening? I can't get any answer about that, and I just have to wait.

I have tried everything that I can do, like SendTransactionAndWaitForReceiptAsnyc(), SignAndSendTransaction(), and so on.

The version of Nethereum is 4.1.1, and the version of Unity is 2019.4.21f1.

Below is the part of definition code. (mint)

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; }
}

And below is the part of service code. (mint)

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);
}

I am struggle with this problem for five days... Please help me..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泛泛之交 2025-01-31 19:58:22

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

,我认为交易不起作用的原因是矿工无法开采我的交易。 (确切地说,他们可以挖掘,但不是因为开采其他交易会给他们更多的钱。)

在Netherum的文件中,他们说的是nethereum可以将汽油价格定为平均水平,但我虽然不起作用。在我添加了代码估算并设置汽油价格之后,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);

I solved it today! (But I didn't use my service code)

In my opinion, the reason why the transaction didn't work is that the miner can't mine my transaction. (Exactly, they can mine, but they didn't because mining other transaction will give them more money.)

In the document of Netherum, they speak nethereum can set the gas price as the average, but I though it didn't work. After I added a code to estimate and set the gas price, SendRequestAndWaitForReceiptAsync() worked very well. (And I could receive transaction hash.)

Below is the code that I used to solve this problem.

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文