--- title: 十份代码实例 createTime: 2025/10/10 11:07:11 permalink: /programming/solidity/analysis/case-analysis/ password: simeng --- ## 题目一 ## 题目二 ## 题目三 ## 题目四 原题: 1.编写原材料接口newMaterial,初始化原材料信息,返回合约地址,并实现原材料信息上链功能。 2.编写获取存原材料接口getMaterial,根据合约地址获取原材料信息 3.编写食品物流上链接口addLogistic,实现食品物流信息上链功能 4.编写获取食品物流信息的接口getLogistics,根据食品产品编号获取物流信息 ::: code-tabs @tab Logistics.sol ```solidity pragma solidity 0.6.10; pragma experimental ABIEncoderV2; contract Logistics { struct LogisticsData { address cargo; //货物合约地址 address orgin; //货物上级合约地址 address destination; //货物下级合约地址 string memo; //备注信息 uint createdAt; //创建时间 uint queryCount; //已查询次数 } LogisticsData[] private _logisticsData; //全部物流信息数组 uint public recordCount;//所有记录条数 uint public queryCount;//所有查询次数 //可自行添加形参和返回值 function addLogistics(address _cargo,address _orgin,【请补充】) public { //TODO:”请补充缺失代码 } //可自行添加形参和返回值 function getLogisticsInfo(address _cargo) public returns(LogisticsData[] memory _cargoLogisticsData) { //TODO:”请补充缺失代码 } } ``` @tab Material.sol ```solidity pragma solidity 0.6.10; contract Material { struct Material { address owner; string name; string id; string memo; uint createdAt; bool exist; } mapping(string => Material) public materials; //可自行添加形参和返回值 function newMaterial(string memory _name,string memory _id,【请补充】) public { //TODO:”请补充缺失代码 } //可自行添加形参和返回值 function getMaterial(string memory id) public view returns(【请补充】) { //TODO:”请补充缺失代码 } } ``` ::: 参考答案: ::: code-tabs @tab Logistics.sol ```solidity pragma solidity 0.6.10; pragma experimental ABIEncoderV2; contract Logistics { struct LogisticsData { address cargo; //货物合约地址 address orgin; //货物上级合约地址 address destination; //货物下级合约地址 string memo; //备注信息 uint createdAt; //创建时间 uint queryCount; //已查询次数 } LogisticsData[] private _logisticsData; //全部物流信息数组 uint public recordCount;//所有记录条数 uint public queryCount;//所有查询次数 //可自行添加形参和返回值 function addLogistics(address _cargo,address _orgin,【请补充】) public { //TODO:”请补充缺失代码 } //可自行添加形参和返回值 function getLogisticsInfo(address _cargo) public returns(LogisticsData[] memory _cargoLogisticsData) { //TODO:”请补充缺失代码 } } ``` @tab Material.sol ```solidity pragma solidity 0.6.10; contract Material { struct Material { address owner; string name; string id; string memo; uint createdAt; bool exist; } mapping(string => Material) public materials; //可自行添加形参和返回值 function newMaterial(string memory _name,string memory _id,【请补充】) public { //TODO:”请补充缺失代码 } //可自行添加形参和返回值 function getMaterial(string memory id) public view returns(【请补充】) { //TODO:”请补充缺失代码 } } ``` ::: ## 题目五 ## 题目六 ## 题目七 原题: **子任务2-2-1:航班延误保险购买合约编码(5分)** (1)编写航班保险购买上链接口,完成只有购买机票的用户可以购买保险、必须缴纳正确的保费金额、购买保险的时间不能超过购买机票后的0.5小时的功能,符合条件则用户可以购买保险,将用户购买保险状态上链;(3分) (2)编写退保接口,完成保险公司预存赔偿金后,用户无法退保,反之用户可退保的功能,将用户退保状态上链,并退还用户保费功能。(2分) **子任务2-2-2:航班信息存证上链合约编码** (1)编写获取航班信息接口,实现依据航班号获得航班号对应的计划起飞时间、实际起飞时间、到达时间、是否延误状态的功能; (2)编写判断航班是否延误接口,实现依据航班号获得航班号对应的航班是否延误,得到航班是否延误的结果功能。 **子任务2-2-3:航班延误险理赔合约编码** (1)编写客户理赔接口,实现如果航班延误超过4小时,将赔偿金赔偿给乘客的功能; (2)编写保险公司收取保费接口,实现如果航班没有延误或者延误时间少于4小时,将保费转账给保险公司,并退还赔偿金的功能。 ::: code-tabs @tab Claims.sol ```solidity pragma solidity ^0.6.10; import "./FlightDelayInsurance.sol"; contract Claims is FlightDelayInsurance{ // 定义航班信息结构体 struct Flight { uint256 departureTime; // 航班出发时间 uint256 delayTime; // 航班延误时间 bool isDelayed; // 航班是否延误 bool isInsured; // 航班是否购买保险 } // 定义保险公司地址 address public insuranceCompany; // 定义航班信息映射 mapping(bytes32 => Flight) public flights; // 定义购买保险事件 event BuyInsurance(bytes32 flightKey, address passenger, uint256 premium); // 定义航班延误事件 event FlightDelay(bytes32 flightKey, uint256 delayTime); // 定义理赔事件 event Claim(bytes32 flightKey, address passenger, uint256 amount); // 定义保险公司预存的赔偿金 uint256 public compensationNew; // 构造函数,初始化保险公司地址和赔偿金 constructor() FlightDelayInsurance(platformS,airlineV,insuranceCompanyC,premium,compensation) public { insuranceCompany = msg.sender; compensationNew = compensation; } // 更新航班信息函数 function updateFlight(bytes32 flightKey, uint256 departureTime, uint256 delayTime, bool isDelayed) payable public { // 判断调用者是否为保险公司 require(msg.sender == insuranceCompany, "Only insurance company can update flight information"); // 更新航班信息 flights[flightKey].departureTime = departureTime; flights[flightKey].isDelayed = isDelayed; /*********** 客户理赔接口 **********/ //任务2-2-3,请编写合约代码 /********** 客户理赔接口 ***********/ /*********** 保险公司收取保费接口开发 **********/ //任务2-2-3,请编写合约代码 /********** 保险公司收取保费接口开发 ***********/ // 触发航班延误事件 emit FlightDelay(flightKey, delayTime); } } ``` @tab FlightDelayInsurance.sol ```solidity pragma solidity ^0.6.10; contract FlightDelayInsurance { address public platformS; // 平台S的地址 address public airlineV; // 航空公司V的地址 address public insuranceCompanyC; // 保险公司C的地址 uint public premium; // 保险费 uint public compensation; // 赔偿金额 uint public purchaseTime; // 购买保险的时间 uint public depositTime; // 存入赔偿金额的时间 bool public purchased; // 是否购买了保险 bool public deposited; // 是否存入了赔偿金额 mapping(address => bool) public insured; // 已退保的用户 mapping(address => bool) public policy; // 已生成保单的用户 mapping(address => bool) public purchasedTicket; // 已购买机票的用户 constructor(address _platformS, address _airlineV, address _insuranceCompanyC, uint _premium, uint _compensation) public { platformS = _platformS; // 初始化平台S的地址 airlineV = _airlineV; // 初始化航空公司V的地址 insuranceCompanyC = _insuranceCompanyC; // 初始化保险公司C的地址 premium = _premium; // 初始化保险费 compensation = _compensation; // 初始化赔偿金额 } function purchaseTicket() public { require(!purchasedTicket[msg.sender], "Ticket has already been purchased"); // 该用户已购买机票 purchasedTicket[msg.sender] = true; // 标记该用户已购买机票 purchaseTime = block.timestamp; } /*********** 航班保险购买上链接口开发 **********/ //任务2-2-1,请编写合约代码 /********** 航班保险购买上链接口开发 ***********/ function depositCompensation() public payable { require(msg.sender == insuranceCompanyC, "Only insurance company C can deposit compensation"); // 只有保险公司C可以存入赔偿金额 require(msg.value == compensation, "Compensation amount is incorrect"); // 赔偿金额不正确 require(block.timestamp < depositTime + 2 hours, "Deposit time has expired"); // 存入赔偿金额的时间已过期 deposited = true; // 标记已存入赔偿金额 } /*********** 退保接口开发 **********/ //任务2-2-1,请编写合约代码 /********** 退保接口开发 ***********/ function generatePolicy() public { require(deposited, "Compensation has not been deposited"); // 赔偿金额未存入,无法生成保单 require(msg.sender == platformS, "Only platform S can generate policy"); // 只有平台S可以生成保单 require(!policy[msg.sender], "Policy has already been generated"); // 该用户已生成保单 policy[msg.sender] = true; // 标记该用户已生成保单 } } ``` @tab FlightManagement.sol ```solidity pragma solidity ^0.6.10; contract FlightManagement { // 航班结构体 struct Flight { string flightNumber; // 航班号 uint256 scheduledDepartureTime; // 计划起飞时间 uint256 actualDepartureTime; // 实际起飞时间 uint256 arrivalTime; // 到达时间 bool delayed; // 是否延误 } // 航班号到航班信息的映射 mapping(string => Flight) flights; // 添加航班 function addFlight(string memory _flightNumber, uint256 _scheduledDepartureTime, uint256 _arrivalTime) public { flights[_flightNumber] = Flight(_flightNumber, _scheduledDepartureTime, 0, _arrivalTime, false); } // 更新实际起飞时间 function updateActualDepartureTime(string memory _flightNumber, uint256 _actualDepartureTime) public { flights[_flightNumber].actualDepartureTime = _actualDepartureTime; } /*********** 获取航班信息接口开发 **********/ //任务2-2-2,请编写合约代码 /********** 获取航班信息接口开发 ***********/ /*********** 编写判断航班是否延误接口开发 **********/ //任务2-2-2,请编写合约代码 /********** 编写判断航班是否延误接口开发 ***********/ } ``` ::: ## 题目八 ## 题目九 ## 题目十