我正在尝试使用 Solidity 0.4.4 创建智能合约。
我想知道是否有一种方法可以将已经输入的某些值的映射设置为空值?
例如:
这初始化了一个新的映射
mapping (uint => uint) map;
在这里我添加一些值
map[0] = 1;
map[1] = 2;
如何在不遍历所有键的情况下将地图设置回空?
我试过删除,但我的合同没有编译
我正在为进行投标的以太坊智能合约设计解决方案。用例包括保留一个名称,例如。“myName”并分配给一个地址。然后,人们可以竞标该名称(在本例中为 myName)。对于多个名称,可能会发生多个这样的出价。
struct Bid {
address bidOwner;
uint bidAmount;
bytes32 nameEntity;
}
mapping(bytes32 => Bid[]) highestBidder;
Run Code Online (Sandbox Code Playgroud)
因此,正如您在上面看到的,Bid 结构保存一个投标人的数据,类似地,映射最高投标人中的键(例如 myName)指向一组此类投标人。
现在,当我尝试返回诸如 highBidder[myName] 之类的内容时,我遇到了问题。
显然,solidity 不支持返回结构数组(动态数据)。我要么需要重新构建我的解决方案,要么找到一些解决方法来使其工作。
如果你们对这个问题有任何疑问,请告诉我,我会尽量说清楚。
我被困在这里任何帮助将不胜感激。
目前正在阅读 Solidity 文档: https://solidity.readthedocs.io/en/develop/types.html#function-types
默认情况下,函数类型是内部的,因此可以省略内部关键字。相比之下,合约函数本身默认是公共的,只有当用作类型名称时,默认是内部的。
这对我来说没有意义。一个函数如何同时是内部函数和公共函数?
我知道internal意味着函数只能在合约内调用,也external可以在合约外调用。所以对我来说,内部是私有的,外部是公共的,但文档听起来好像它可以同时是公共和内部的?
internal/external那么,函数之间和public/private函数方面有什么区别(如果有的话) ?
我已经使用geth. 我还有一个合约,其中有一个函数调用另一个函数,它是第三个合约来设置地址。我可以在本地区块链上调用这个函数,比如 testRPC 和 Ganache 区块链,即使它在 TestNet 中也能工作。但是一旦我使用 ( geth)设置了私有区块链。我收到此错误:
气体估计错误并显示以下消息(见下文)。事务执行可能会失败。您要强制发送吗?
所需的gas超过限额或总是失败的交易
我在来电者帐户中有足够的 ETH,而且
Run Code Online (Sandbox Code Playgroud)// in contract 1 function func(address addr) public returns (bool result) { Cantract2 c = Cantract2(addr); if (!c.setAddress(..)) { return false; } ..... return true; }
我正在使用 golang 来监听智能合约事件。我将我的合约部署到 ganache ui 和 ganache-cli 端口。但我收到以下错误:
? sc_events go run main.go
2019/04/17 14:25:04 write tcp 127.0.0.1:54917->127.0.0.1:8545: i/o timeout
exit status 1
Run Code Online (Sandbox Code Playgroud)
我尝试使用 ganache ui(侦听端口 7545)和 ganache-cli(8545)。他们两个似乎都产生了相同的错误。但是如果我听 infura URL,我想我不会收到这个错误,
package main
import (
"context"
"fmt"
"log"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
client, err := ethclient.Dial("ws://127.0.0.1:8545")
// client, err := ethclient.Dial("wss://rinkeby.infura.io/ws/v3/010590bb415e4664835a05a53b18a293")
if err != nil {
log.Fatal(err)
}
contractAddress := common.HexToAddress("0x82726c7c1202565f1fef63fa8d4caca6366d4749")
query := ethereum.FilterQuery{
Addresses: []common.Address{contractAddress},
}
logs := make(chan types.Log)
sub, err := client.SubscribeFilterLogs(context.Background(), query, logs) …Run Code Online (Sandbox Code Playgroud) 我们正在运行一个 RSK 节点,一些智能合约交易显示内部错误,但与失败require条件相关的消息没有出现在这些错误消息中......
我们只能看到“内部错误”,而无法查看发生了哪个特定错误。
我有两个不同的文件,即 Project1.sol 和 Project2.sol
Project2.sol 就像:
import "./Project1.sol";
contract Project2{
address newProject1Address =address(new Project1());
}
Run Code Online (Sandbox Code Playgroud)
Project1.sol 类似于:
import "./Project2.sol";
contract Project1 is Project2{
}
Run Code Online (Sandbox Code Playgroud)
我已在 Project2.sol 文件中部署了 Project1。而且我一直在使用 Project1.sol 文件中 Project2 中的结构。
我收到一个错误,即“基础的定义必须先于派生合同的定义。 ”对于这一行:contract Project1 is Project2{
网上查了一下错误,有两份合同一份文件的解决方案。但是,我有两个文件。
我将这两个合同合并在一个文件中。
这就是我所做的:
pragma solidity >=0.7.0 <0.9.0;
contract Project2{
Apple[] public applepies;
struct Apple{
string name;
mapping (address => bool) applepie;
}
function createProject() external{
address newProject1Address =address(new Project1(msg.sender));
uint idx = applepies.length;
applepies.push();
Apple storage newProject = applepies[idx];
}
} …Run Code Online (Sandbox Code Playgroud) 我需要将我的智能合约部署到 BSC 测试网
我总是得到这个:
Error: PollingBlockTracker - encountered an error while attempting to update latest block:
Error: ETIMEDOUT
Run Code Online (Sandbox Code Playgroud)
我尝试更改此处指定的 RPC https://docs.binance.org/smart-chain/developer/rpc.html#rate-limit
所有这些,却还是一样。
一件事是,我尝试将其部署到 ropsten 只是为了好玩。这就是成功。现在BSC Testnet RPC有什么问题吗?
这是我的 truffle-config.js 片段
testnet: {
provider: () => new HDWalletProvider(mnemonic, `https://data-seed-prebsc-1-s2.binance.org:8545`),
network_id: 97, // 3 for ropsten, 97 for bsc test
confirmations: 2,
timeoutBlocks: 2000,
skipDryRun: true,
networkCheckTimeout: 1000000
},
Run Code Online (Sandbox Code Playgroud)
我搜索了一下,有些人使用websocket(wss),有些人更改RPC Url,有些人添加networkCheckTimeout。我尝试了所有这些(除了 wss,因为我没有看到它是由 BSC Testnet 提供的)。但没有任何作用。
有什么建议吗?谢谢
我试图通过在下面的代码中uint timeStamp键入来进行打印:return timeStamp;return price;
pragma solidity ^0.6.7;
import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";
contract PriceConsumerV3 {
AggregatorV3Interface internal priceFeed;
/**
* Network: Kovan
* Aggregator: BTC/USD
* Address: 0x6135b13325bfC4B00278B4abC5e20bbce2D6580e
*/
constructor() public {
priceFeed = AggregatorV3Interface(0x6135b13325bfC4B00278B4abC5e20bbce2D6580e);
}
/**
* Returns the latest price
*/
function getThePrice() public view returns (int) {
(
uint80 roundID,
int price,
uint startedAt,
uint timeStamp,
uint80 answeredInRound
) = priceFeed.latestRoundData();
return price;
return timeStamp;
}
}
Run Code Online (Sandbox Code Playgroud)
当我在 Remix Compiler 上编译上面的代码时,它回复:
类型错误:返回参数类型 uint256 无法隐式转换为预期类型(第一个返回变量的类型)int256。返回时间戳;^--------^
我倾向于认为我只需要输入int256 …
我是 Solidity 的新手,我有一个关于多重继承的问题。
因此,如果我有一些合同,例如:
contract A {
function foo() public virtual {
console.log("A");
}
}
contract B is A {
function foo() public virtual override {
console.log("B");
}
}
contract C is A, B {
function foo() public override(A, B) {
super.foo();
}
}
Run Code Online (Sandbox Code Playgroud)
合约C的功能foo必须是override(A, B)insdeadoverride(B)
或者它会抛出一个错误,比如Function needs to specify overridden contract "A".
那么问题来了,该函数必须指定完整的继承父级。
为什么它不能知道信息contract C is A, B,
我的意思是,有什么意义?该overrider(A,B)部分是不必要的。
还是有什么我不知道的技巧?
请给我一个答案,我很好奇,无法通过文档找到一些有用的信息。
smartcontracts ×10
ethereum ×7
solidity ×7
blockchain ×4
geth ×2
inheritance ×2
algorithm ×1
chainlink ×1
contract ×1
debugging ×1
ganache ×1
go-ethereum ×1
rsk ×1