如何在订单合同中存储一系列产品合同

How to store in an orders contract an array of products contract

我是 solidity 和整个区块链概念的新手,我正在尝试做一个简单的电子商务网站,用户可以在其中 select 一些产品,将它们放入购物车并下订单.

问题是我不知道如何进行这项工作。我正在尝试使用包含一系列产品的模拟订单来初始化订单合同,但我收到如下类型错误:

“TypeError:成员“createProduct”在类型(合同产品)中进行参数相关查找后未找到或不可见。”

这是我的Products.sol

pragma solidity ^0.5.0;

contract Products {
    uint256 public productsCount = 0;

    struct Product {
        uint256 id;
        string name;
        string category;
        int256 price;
    }

    mapping(uint256 => Product) public products;

    event ProductCreated(
        uint256 id,
        string name,
        string category,
        int256 price
    );

    event ProductEdited(uint256 id, string name, string category, int256 price);

    event ProductDeleted(
        uint256 id,
        string name,
        string category,
        int256 price
    );

    constructor() public {
        createProduct("Test", "Test", 53);
    }

    function createProduct(
        string memory _name,
        string memory _category,
        int256 _price
    ) public {
        productsCount++;
        products[productsCount] = Product(
            productsCount,
            _name,
            _category,
            _price
        );

        emit ProductCreated(productsCount, _name, _category, _price);
    }

    function editProduct(
        uint256 _id,
        string memory _name,
        string memory _category,
        int256 _price
    ) public {
        Product memory _product = products[_id];
        _product.name = _name;
        _product.category = _category;
        _product.price = _price;
        products[_id] = _product;

        emit ProductEdited(_id, _name, _category, _price);
    }

    function deleteProduct(uint256 _id) public {
        Product memory _product = products[_id];

        delete products[_id];

        productsCount--;

        emit ProductDeleted(
            _id,
            _product.name,
            _product.category,
            _product.price
        );
    }
}

这是我的 Orders.sol

pragma solidity ^0.5.0;
import "./Products.sol";

contract Orders {
    uint256 public ordersCount = 0;

    struct Order {
        uint256 id;
        int256 totalPrice;
        string date;
        Products[] products;
    }

    mapping(uint256 => Order) public orders;

    constructor() public {
        createOrder(
            150,
            "01.01.2021",
            [Products.createProduct("name", "category", 1)]
        );
    }

    function createOrder(
        int256 _totalPrice,
        string memory _date,
        Products[] memory _products
    ) public {
        ordersCount++;
        orders[ordersCount] = Order(ordersCount, _totalPrice, _date, _products);
    }
}

可能是个简单的问题,但我以前从未使用过solidity,youtube上的所有教程都太简单了,没有解释这种嵌套数据。

非常感谢您的帮助:D

我认为错误在于您按原样对待合同 类。 要从另一个合约访问一个合约,你必须用它的地址实例化它。 您可以将产品id存储在订单合约中,当您需要获取产品信息时与产品合约进行交互。
如果你想创建带有订单合同的产品,你应该这样做

function createProduct(address addr) public {
    Products p = Products(addr);
    p.createProduct("name", "category", 1);
}

你的 createProduct 方法 return 什么都没有。正是出于这个原因,它不起作用。你可以改变你的方法,比如

function createProduct(
    string memory _name,
    string memory _category,
    int256 _price
  ) public returns (Product) {
      productsCount++;
      products[productsCount] = Product(
        productsCount,
        _name,
        _category,
        _price
      );
    
      emit ProductCreated(productsCount, _name, _category, _price);
      return products[productsCount];
}

或者您可以创建另一个方法来调用 createProduct 来创建产品,然后 return 它。