Files
SiMengWebSite_Notes/docs/notes/programming/solidity/case-analysis.md
2025-10-10 17:33:17 +08:00

360 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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请编写合约代码
/********** 编写判断航班是否延误接口开发 ***********/
}
```
:::
## 题目八
## 题目九
## 题目十