gpt4 book ai didi

ethereum - 功能高的气体需求 : infinite

转载 作者:行者123 更新时间:2023-12-04 14:38:46 27 4
gpt4 key购买 nike

下面是我的智能合约。当我将它放入混音中时,我会收到有关以下每个功能的警告。

函数 MedicalRecord.addNote(bytes32,bytes32) 的 Gas 要求高:无限。

函数 MedicalRecord.getDoctorsNames() 的 Gas 要求高:无限。

函数 MedicalRecord.getNotes() 的 Gas 要求高:无限。

函数 MedicalRecord.giveDoctorAccess(address,bytes32) high 的 gas 要求:无限。

pragma solidity ^0.4.17;


contract MedicalRecord {
struct Doctor {
bytes32 name;
uint id;
}

struct Note {
bytes32 title;
bytes32 note;
}

address public patient;
uint private doctorId;
bytes32[] public doctorsNames;
Note[] notes;
mapping (address => Doctor) private doctors;

modifier onlypatient {
require(msg.sender == patient);
_;
}

modifier isCurrentDoctor {
require(!(doctors[msg.sender].id < doctorId));
_;
}

function MedicalRecord() public {
patient = msg.sender;
doctorId = 0;
}

function giveDoctorAccess(address drAddress, bytes32 name)
public
onlypatient
returns (bytes32)
{
doctors[drAddress] = Doctor (name, doctorId);
doctorId++;
doctorsNames.push(name);
return (name);
}

function getNotes()
view
public
isCurrentDoctor
returns (bytes32[], bytes32[])
{
bytes32[] memory titles = new bytes32[](notes.length);
bytes32[] memory noteTexts = new bytes32[](notes.length);

for (uint i = 0; i < notes.length; i++) {
Note storage snote = notes[i];
titles[i] = snote.title;
noteTexts[i] = snote.note;
}

return (titles, noteTexts);
}

function getDoctorsNames() view public returns (bytes32[]) {
return doctorsNames;
}

function addNote(bytes32 title, bytes32 note) public isCurrentDoctor
{
notes.push(Note({title: title, note:note}));
}
}

谁能告诉我如何改进这一点?

最佳答案

对动态数组的任何引用都将导致无限气体警告。这并不一定意味着你做错了什么。

从优化大小来看,您可以做一些小事情,但大多数不会彻底改变您的 gas 消耗。例如,我认为不需要存储 doctorNames 的单独数组。因为您已经在 Doctor 中保存了这些结构。此外,一般来说,像您在 getNotes() 中所做的那样遍历潜在的无限项数组并不是一个好主意。 .通常,最好有一个返回数组长度的函数,然后调用一个单独的函数来获取传入索引的注释(换句话说,在客户端中执行循环)。但即使在这里,您的用例似乎也不会导致大量注释。

您最大的成本将是您与单个患者签订的契约(Contract)。契约(Contract)部署非常昂贵。在这里,您将为系统中的每个患者部署一个契约(Contract)(可能每个患者有多个契约(Contract),因为它是医疗记录?)。我希望将所有内容都插入结构中,并为所有患者/医疗记录签订一份契约(Contract)。可能每位患者一份契约(Contract),具体取决于整体业务案例(即使考虑到这一点,我想我还是会先探索每位医生一份契约(Contract))。但是,肯定不是每个病历的契约(Contract)。

关于ethereum - 功能高的气体需求 : infinite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49205032/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com