#solidity #smartcontracts
Вопрос:
У меня проблема с solitidy >0.7.0, у меня есть структура в контракте под названием > Product
. В Product
, имеет свойство , называемое bids
, bids
является отображением. bids
используется для записи каждой ставки на этот продукт. Когда я звоню addProductToStore
, должен быть создан новый продукт. Однако, когда я вызываю «addProductToStore», появляется следующая ошибка.
contracts/Store.sol:52:38: TypeError: Struct containing a (nested) mapping cannot be constructed.
Product memory product = Product(
^ (Relevant source part starts here and spans across multiple lines).
Как я могу сохранить ставки Product
и назвать магазин AddProductToStore успешным?
uint public productIndex;
mapping (uint => address) productIdInStore;
mapping (address => mapping(uint => Product)) stores;
struct Product{
uint id;
string name;
string category;
string imgLink;
string descLink;
uint auctionStartTime;
uint auctionEndTime;
uint startPrice;
address highestBidder;
uint highestBid;
uint secondHighestBid;
uint totalBids;
ProductStatus status;
ProductCondition condition;
mapping (address => mapping(bytes32 => Bid)) bids;
}
struct Bid{
address bidder;
uint productId;
uint value;
bool revealed;
}
constructor() public{
productIndex = 0;
}
function addProductToStore(
string calldata _name,
string calldata _category,
string calldata _imgLink,
string calldata _descLink,
uint _auctionStartTime,
uint _auctionEndTime,
uint _startPrice,
uint _productCondition
) public{
require(_auctionStartTime < _auctionEndTime);
productIndex = 1;
Product memory product = Product(
productIndex,
_name,
_category,
_imgLink,
_descLink,
_auctionStartTime,
_auctionEndTime,
_startPrice,
address(0),
0,
0,
0,
ProductStatus.Open,
ProductCondition(_productCondition),
);
stores[msg.sender][productIndex]=product;
productIdInStore[productIndex] = msg.sender;
}
Ответ №1:
Вы можете назначить product
как storage
переменную, а затем назначить каждого из struct
участников по отдельности.
pragma solidity ^0.8;
contract MyContract {
uint public productIndex;
mapping (address => mapping(uint => Product)) stores;
struct Product {
uint id;
string name;
string category;
// ...
mapping (address => mapping(bytes32 => Bid)) bids;
}
struct Bid {
address bidder;
// ...
}
function addProductToStore(
string calldata _name,
string calldata _category
// ...
) external {
productIndex = 1;
Product storage product = stores[msg.sender][productIndex];
product.name = _name;
product.category = _category;
// ...
}
}