如何在智能合约中将 Struct 转换为 Array?

How can I convert a Struct to Array in smart contract?

我会写一个关于病人病历的智能合约。我有一个例子。但是所有数据都存储在结构中。我想使用时间序列数据。据我所知,我必须使用结构数组,但我不知道该怎么做?

你能帮帮我吗?

contract MedicalHistory {
    enum Gender {
        Male,
        Female
    }
    uint _patientCount = 0;

    struct Patient {
        string name;
        uint16 age;
        //max of uint16 is 4096
        //if we use uint8 the max is uint8
        string telephone;
        string homeAddress;
        uint64 birthday; //unix time
        string disease; //disease can be enum
        uint256 createdAt; // save all history
        Gender gender;
    }

    mapping(uint => Patient) _patients;

    function Register(
        string memory name,
        uint16 age,
        string memory telephone,
        string memory homeAddress,
        uint64 birthday,
        string memory disease,
        // uint256 createdAt,
        Gender gender
    }
}

这是我的智能合约的代码片段。我如何将结构转换为数组?

您可以.push()进入存储阵列,有效地添加新项目。

我简化了代码示例,以便更容易看到实际的数组操作:

pragma solidity ^0.8;

contract MedicalHistory {
    struct Patient {
        string name;
        uint16 age;
    }

    Patient[] _patients;

    function Register(
        string memory name,
        uint16 age
    ) external {
        Patient memory patient = Patient(name, age);
        _patients.push(patient);
    }
}

请注意,如果您使用的是 public 网络(例如以太坊),即使存储在非 public 属性 网络中,也可以通过查询合同存储槽。有关代码示例,请参阅 。所以除非这只是一个学术练习,否则我真的不建议在区块链上存储健康和其他敏感数据。