这篇文章将概述著名错误的最常见来源"Exceeded the prepaid gas."以及如何尝试和调试该问题。话虽如此,我很快就会概述一些关于 GAS 的常见误解以及一些您可能不知道的事情。
--gas=如果您未在 NEAR-CLI 上指定标志 ( ),则将附加的默认 GAS为 30 TGas。--gas=300000000000000解决这个问题后,让我们深入探讨问题最常见的根源:跨合约调用。在这种情况下,您通常会看到您附加的 GAS 数量多于您使用的数量,如下所示:
这可能会令人困惑,因为如果您使用的 GAS 少于您附加的 GAS,您怎么会超过您的预付费 GAS?这是一个非常好的指标,表明您正在处理跨合约调用。场景如下:
我们有一个A带有函数的智能合约foo。该函数将对智能合约执行跨合约调用,并在附加 40 个 TGas 的同时B调用该函数。bar
foo签订合同A并附上 10 份 TGas。我们现在有 10 个 TGas 可用。如果 NEAR 协议上的 TestNet 账户上的代币用完,可以在哪里增加代币数量?
在这篇文章中,我将详细介绍导致神秘错误消息的原因"Smart contract panicked: panicked at 'Cannot deserialize the contract state.: Custom { kind: InvalidData, error: "Not all bytes read" }"。
当您部署智能合约并存储信息时,状态将被序列化并存储在磁盘上。当您将另一个智能合约部署到您的帐户并且您更改了重要信息时,就会出现问题。NEAR 运行时将尝试从磁盘读取序列化状态,并使用部署到您帐户的任何智能合约代码加载它。如果它无法弄清楚如何执行此操作,则会输出错误消息Not all bytes read。
有关何时可能发生这种情况的示例,请参阅我们的 DevDocs 中的 NFT 从零到英雄教程的升级合约部分。
要了解最佳实践以及如何避免此类情况,请参阅这篇详细文章。
我想知道为什么有些块存在而有些不存在?似乎他们被跳过了,我不确定为什么。例如:
87868936存在, 87868938也存在,但 87868938不存在。谢谢!
如果您在构建 Rust 应用程序时遇到此问题
error[E0463]: can't find crate for core| = note: the "wasm32-unknown-unknown" target may not be installed
要解决此错误,请运行
rustup target add wasm32-unknown-unknown
在文件中,这应该可以解决问题
在这篇文章中,我将介绍如何仅使用您的私钥将帐户导入 NEAR 钱包。当您使用 CLI 或近 api-js 创建帐户(或子帐户)并且只能访问私钥时,这非常有用。
要导入帐户,只需单击此 URL 并替换YOUR_ACCOUNT_ID和YOUR_PRIVATE_KEY。
https://wallet.testnet.near.org/auto-import-secret-key#YOUR_ACCOUNT_ID/YOUR_PRIVATE_KEY
https://wallet.near.org/auto-import-secret-key#YOUR_ACCOUNT_ID/YOUR_PRIVATE_KEY
我知道一堆加密钱包可以在网络浏览器中使用 IFRAME 和类似技术,而无需安装任何插件:
但是他们是否受到网络钓鱼 Dapp 攻击的保护?如果 Dapp 想要欺骗你并隐藏实际发送的 ETH 数量或以任何其他方式,在网络浏览器中修改钱包 UI?
我已经能够near dev-deploy使用近壳运行Rust 合约,然后调用一个函数“new”near call my-account new '{"param1": "foo"}'
但是,当我将相同的合同部署到我使用NEAR Wallet创建的首选帐户时,这不起作用。
错误是:
Smart contract panicked: panicked at 'Cannot deserialize the contract state.: Custom { kind: InvalidInput, error: "Unexpected length of input" }',
Run Code Online (Sandbox Code Playgroud) 我正在使用命令创建子帐户:near create-account 123.xyz.testnet --masterAccount xyz.testnet
但它只生成公钥和私钥,如何获取帐户的种子短语,以便我可以使用近网络钱包登录。
近网络钱包似乎不支持子账户,如“。” 不允许。
我已使用 ed25519 签署了该消息
const msg = Buffer.from("hi");
const signerKeyPair = await keyStore.getKey(config.networkId, signerAccount);
const { signature } = signerKeyPair.sign(msg);
Run Code Online (Sandbox Code Playgroud)
如果我有签名和签名者公钥,如何验证智能合约中的签名?
我发现近核心使用近加密箱来做到这一点,但我不确定我是否可以将它用于智能合约。
使用近核心的示例
use near_crypto::{PublicKey, Signature, KeyType};
...
pub fn verify(&self, data: &[u8], public_key: String) -> bool {
let public_key = PublicKey::from_str(&public_key).unwrap();
let signature = Signature::empty(KeyType::SECP256K1);
signature.verify(data, &public_key)
}
...
Run Code Online (Sandbox Code Playgroud)