我正在尝试在 Remix IDE 中的以太坊 sepolia 测试网上部署智能合约。但我收到错误“合约创建代码存储耗尽”。我不明白其中的原因,因为我的钱包里有足够的测试网 ETH,而且我只导入了必要的库。 这是完整的代码:
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
contract IssueCred is ERC20, AccessControl {
bytes32 public constant DOCTOR_ROLE = keccak256("DOCTOR_ROLE");
bytes32 public constant PHARMACIST_ROLE = keccak256("PHARMACIST_ROLE");
bytes32 public constant GOVERNMENT_ROLE = keccak256("GOVERNMENT_ROLE");
struct HealthCareProvider {
string name;
string licenseNumber;
bool isVerified;
}
struct Prescription {
address doctor;
string drug;
uint dosage;
uint duration;
uint timestamp;
}
mapping(address => HealthCareProvider) public providers;
mapping(string => Prescription[]) private prescriptions;
event ProviderRegistered(address indexed providerAddress, string name, string licenseNumber);
event ProviderVerified(address indexed providerAddress);
event PrescriptionIssued(address indexed doctor, string indexed patientID, string drug, uint dosage, uint duration);
constructor() ERC20("AccountabilityToken", "PHARMA") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(GOVERNMENT_ROLE, msg.sender);
_mint(msg.sender, 1000 * (10 ** decimals()));
}
function registerProvider(
address providerAddress,
string calldata name,
string calldata licenseNumber,
bytes32 role
) external onlyRole(GOVERNMENT_ROLE) {
require(role == DOCTOR_ROLE || role == PHARMACIST_ROLE, "Invalid role");
providers[providerAddress] = HealthCareProvider({
name: name,
licenseNumber: licenseNumber,
isVerified: false
});
emit ProviderRegistered(providerAddress, name, licenseNumber);
}
function verifyProvider(address providerAddress, bytes32 role) external onlyRole(GOVERNMENT_ROLE) {
require(providers[providerAddress].isVerified == false, "Provider already verified");
providers[providerAddress].isVerified = true;
_grantRole(role, providerAddress);
emit ProviderVerified(providerAddress);
}
function isProviderVerified(address providerAddress) external view returns (bool) {
return providers[providerAddress].isVerified;
}
function issuePrescription(
string calldata patientID,
string calldata drug,
uint dosage,
uint duration
) external onlyRole(DOCTOR_ROLE) {
prescriptions[patientID].push(Prescription({
doctor: msg.sender,
drug: drug,
dosage: dosage,
duration: duration,
timestamp: block.timestamp
}));
emit PrescriptionIssued(msg.sender, patientID, drug, dosage, duration);
}
function getPrescriptions(string calldata patientID) external view returns (Prescription[] memory) {
return prescriptions[patientID];
}
}
我在网上搜索发现增加gas limit会对我的情况有所帮助,但没有发生这样的事情。此外,我尝试通过用事件替换我为注册提供者和经过验证的提供者创建的列表来优化代码。谁能告诉我我的代码是否优化过?
错误! /tmp/dEZAOIYV5D.cpp:31:3:错误:预期在“else”之前有不合格的 id 31 | } 别的 { | ^~~~ /tmp/dEZAOIYV5D.cpp:36:2:错误:“返回”之前预期有不合格的 id 36 | 36 返回0; | ^~~~~~~ /tmp/dEZAOIYV5D.cpp:37:1: 错误: '}' 标记之前的预期声明 37 | 37 } | ^ /tmp/dEZAOIYV5D.cpp:在函数“std::string klasifikasiGaji(float)”中: /tmp/dEZAOIYV5D.cpp:25:5:警告:控制到达非 void 函数的末尾 [-Wreturn-type] 25 | 25 } | ^
=== 代码因错误退出 ===