Compare commits

...

3 Commits

Author SHA1 Message Date
祀梦
6ac5000c86 更新文章 2025-10-11 23:48:28 +08:00
祀梦
df01754706 更新文章 2025-10-10 17:33:17 +08:00
祀梦
7e413866c2 文章更新 2025-10-10 10:54:35 +08:00
6 changed files with 996 additions and 153 deletions

View File

@@ -35,7 +35,12 @@ const solidity = defineNoteConfig({
{ {
text: "基础语法", prefix: "/basic-syntax", items: [ text: "基础语法", prefix: "/basic-syntax", items: [
{ text: "Solidity 基础语法与数据类型", link: "/programming/solidity/basic-syntax/" } { text: "Solidity 基础语法与数据类型", link: "/programming/solidity/basic-syntax/" }
] ],
},
{
text: "项目实例", prefix: "/basic-syntax", items: [
{ text: "Solidity 代码实例", link: "/programming/solidity/analysis/case-analysis/" }
],
} }
] ]
}) })

View File

@@ -7,3 +7,15 @@ permalink: /programming/solidity/
## Solidity 智能合约概述 ## Solidity 智能合约概述
Solidity 是一种用于编写智能合约的静态类型编程语言它运行在以太坊虚拟机EVM上。
## 推荐的资料
推荐的编辑器
Remix IDE[https://remix.ethereum.org/](https://remix.ethereum.org/)
有在线版本,也可以下载之后使用,而且可以通过 Docker 部署,很方便
Solidity 学习资料:
- [Solidity 官方文档](https://docs.soliditylang.org/zh-cn/latest/index.html)
- [cryptozombies](https://cryptozombies.io/zh/course)

View File

@@ -6,180 +6,83 @@ permalink: /programming/solidity/basic-syntax/
# Solidity 基础语法与数据类型~(≧∇≦)ノ # Solidity 基础语法与数据类型~(≧∇≦)ノ
嗨~欢迎来到 Solidity 基础语法的学习时间!今天我们要一起探索 Solidity 这门神奇语言的基本结构和数据类型哦准备好了吗Let's go(๑>◡<) ## Solidity 文件基础框架
## 智能合约的基本结构 🏗️ Solidity 文件的基础框架通常包含以下几个部分:
让我们先来看一个最简单的 Solidity 智能合约是什么样子的吧 1. **SPDX 许可证标识符 (SPDX License Identifier)**:为了避免法律问题和明确智能合约的开源许可证,建议在合约的开头添加 SPDX 许可证标识符。
2. **Solidity 版本声明 (Pragma)**:这会告诉编译器您希望使用哪个版本的 Solidity 来编译您的代码。
3. **ABI编码编译指示**:通过`pragma abicoder v1``pragma abicoder v2`来指定ABI编码版本。
4. **合约定义 (Contract Definition)**:这是您编写智能合约代码的主体部分。
下面是一个基础的 Solidity 文件框架示例,您可以直接使用:
```solidity ```solidity
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.20;
pragma experimental ABIEncoderV2;
contract HelloWorld {
// 状态变量
string public greeting = "Hello, World!";
// 函数
function setGreeting(string memory _greeting) public {
greeting = _greeting;
}
function getGreeting() public view returns (string memory) {
return greeting;
}
}
```
是不是看起来有点像其他编程语言呀让我们来一点一点地了解它吧
## 版本声明和许可证 📜
Solidity 合约的最开始我们需要添加两行重要的声明
```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
```
- **许可证声明**告诉别人你的代码使用什么许可证可以自由使用吗
- **版本声明**指定合约使用的 Solidity 编译器版本`^0.8.0` 表示可以使用 0.8.0 及以上的版本哦
## 数据类型 🌈
Solidity 有很多有趣的数据类型让我们来认识一下它们吧
### 值类型
这些类型在赋值时会直接复制值哦
#### 布尔型 (Boolean)
```solidity
bool public isActive = true;
bool public isPaused = false;
```
布尔型只有两个值`true` `false`就像开关一样简单(˘˘)
#### 整型 (Integer)
```solidity
int public negativeNumber = -42;
uint public positiveNumber = 42;
// 你还可以指定位数哦~
uint8 public smallNumber = 255; // 0-255
uint256 public bigNumber = 1000000000000000000; // 这是 1 以太币的 wei 值哦~
```
整型分为有符号`int`和无符号`uint`两种可以存储正数和负数呢
#### 地址型 (Address)
```solidity
address public owner = 0x71C7656EC7ab88b098defB751B7401B5f6d8976F;
// 可以转账的地址类型
address payable public recipient = payable(0x71C7656EC7ab88b098defB751B7401B5f6d8976F);
```
地址类型非常特别它用于存储以太坊账户的地址就像是账户的身份证号码一样`address payable` 还可以接收以太币转账呢
### 引用类型
这些类型在赋值时只会传递引用而不是复制整个值哦
#### 字符串 (String)
```solidity
string public message = "Hello, Solidity!";
string public name = "祀梦";
```
字符串用于存储文本数据就像你平时写的便签一样
#### 数组 (Array)
```solidity
// 固定大小的数组
uint[5] public fixedArray = [1, 2, 3, 4, 5];
// 动态大小的数组
uint[] public dynamicArray;
// 你还可以在函数中这样使用哦~
function addNumber(uint _number) public {
dynamicArray.push(_number);
}
```
数组就像是一个收纳盒可以按顺序存放多个相同类型的数据呢
#### 映射 (Mapping)
```solidity
// 映射:地址 => 余额
mapping(address => uint) public balances;
// 使用方式
function deposit() public payable {
balances[msg.sender] += msg.value;
}
```
映射是 Solidity 中非常强大的数据结构就像是一个魔法字典可以通过键快速找到对应的值
## 变量作用域 🔍
Solidity 变量有不同的作用域哦
### 状态变量
```solidity
contract MyContract { contract MyContract {
// 状态变量:存储在区块链上的 // 在这里编写您的合约代码
uint public myStateVariable = 42;
} }
``` ```
状态变量是存储在区块链上的所有合约函数都可以访问它们就像是合约的公共记忆一样 ## Solidity 基础数据类型
### 局部变量 - 布尔类型bool值为 `true``false`
- 运算符:`!`(逻辑非)、`&&`(逻辑与)、`||`(逻辑或)、`==`(等于)、`!=`(不等于)
- 整形int/uint
- 有符号整数int可以表示负数和零。
- 无符号整数uint只能表示非负数。
- 整数类型可以是8位、16位、32位、64位或256位。只要是八的倍数都可以
- 例如:`int8``uint256`等。
- 运算符:
- 比较运算符:`<=`,`<`,`>=`,`>`
- 位运算符:`&`(按位与)、`|`(按位或)、`^`(按位异或)、`~`(按位取反)
- 移位运算符:`<<`(左移)、`>>`(右移)
- 算数运算符:`+`(加法)、`-`(减法)、`*`(乘法)、`/`(除法)、`%`(取余)
- 对于一个整数类型`X`,可以使用`type(X).min``type(X).max`来获取其最小值和最大值。
## Solidity 基础语法结构
## Solidity 基础操作
### 导入其他源文件
Solidity 支持导入其他源文件,使用`import`语句。例如:
```solidity ```solidity
function myFunction() public { import "filename.sol";
// 局部变量:只在函数内部可见
uint myLocalVariable = 100;
}
``` ```
局部变量只在定义它们的函数内部可见函数执行结束后就会消失哦 这将导入`filename.sol`文件中的合约代码。
### 全局变量 还可以创建一个新的全局符号
```solidity ```solidity
function getSender() public view returns (address) { import * as NewName from "filename.sol"
// msg.sender 是一个全局变量,包含当前调用者的地址
return msg.sender;
}
``` ```
全局变量是 Solidity 内置的特殊变量可以在任何地方使用它们提供了关于区块链和交易的重要信息呢 这将创建一个新的全局符号`NewName`,您可以在合约中使用它来引用`filename.sol`文件中的合约,例如`NewName.ContractName`
## 小练习 🏋️‍♀️ 还可以在导入的同时重命名符号:`import {symbol1 as alias, symbol2} from "filename";`
现在让我们来做一个小练习吧试着编写一个简单的计数器合约包含以下功能 ### 注释
1. 一个状态变量来存储计数值 Solidity 支持两种类型的注释:
2. 一个函数来增加计数
3. 一个函数来减少计数
4. 一个函数来获取当前计数值
你可以做到吗相信自己你一定可以的(̀ㅂ́)و 1. **行注释**:使用`//`来注释单行代码。
2. **块注释**:使用`/*``*/`来注释多行代码。
## 写在最后~💌 例如:
今天我们学习了 Solidity 的基础语法和数据类型这些都是构建智能合约的基石哦虽然一开始可能会觉得有点复杂但只要多练习你一定会越来越熟练的下节课我们将学习 Solidity 的函数和修饰器敬请期待吧 ```solidity
// 这是一个行注释
如果有任何问题欢迎随时提问哦让我们一起在区块链的世界里快乐地探索吧( 3 ̄) /*
这是一个
块注释
*/
```

View File

@@ -0,0 +1,922 @@
---
title: 十份代码实例
createTime: 2025/10/10 11:07:11
permalink: /programming/solidity/analysis/case-analysis/
password: simeng
---
## 题目一
原题:
1.食品信息FoodInfoItem的接口编码
1编写食品信息实体的接口完成可溯源食品信息初始化实现可追溯的原始生产商食品信息上链功能
2编写分销商食品上链信息接口根据食品溯源智能合约地址获取分销商上链食品的信息
3编写超市进行食品上链信息的接口根据食品溯源智能合约地址获取超市上链食品信息。
2.食品溯源(Trace)的接口编码
1编写食品溯源智能合约生产商Producer添加食品接口必须生产商才能添加可溯源的食品实现溯源功能
2编写食品溯源智能合约分销商Distributor添加食品接口必须分销商才能添加可溯源的食品实现溯源功能
3编写食品溯源智能合约超市Retailer添加食品接口必须超市才能添加可溯源的食品实现溯源功能
3.角色Role管理的接口编码
1编写食品溯源增加角色接口必须是未增加的角色才能被添加实现添加角色的功能
2编写食品溯源移除角色接口必须是已增加的角色才能被移除实现移除角色的功能
3编写食品溯源角色授权接口必须是授权的角色地址实现角色权限管理功能
::: code-tabs
@tab Distributor.sol
```solidity
pragma solidity ^0.4.25;
import "./Roles.sol";
//中间商角色
contract Distributor {
using Roles for Roles.Role;
event DistributorAdded(address indexed account);
event DistributorRemoved(address indexed account);
Roles.Role private _distributors;
constructor (address distributor ) public {
_addDistributor(distributor);
}
modifier onlyDistributor() {
require(isDistributor(msg.sender), "DistributorRole: caller does not have the Distributor role");
_;
}
function isDistributor(address account) public view returns (bool) {
return _distributors.has(account);
}
function addDistributor(address account) public onlyDistributor {
_addDistributor(account);
}
function renounceDistributor() public {
_removeDistributor(msg.sender);
}
function _addDistributor(address account) internal {
_distributors.add(account);
emit DistributorAdded(account);
}
function _removeDistributor(address account) internal {
_distributors.remove(account);
emit DistributorRemoved(account);
}
}
```
@tab FoodInfoItem.sol
```solidity
pragma solidity >=0.4.22 <0.5.0;
pragma experimental ABIEncoderV2;
//食品信息管理合约
// 1. 保存食品基本信息:时间戳(流转过程中),用户名(流转过程中),用户地址信息(流转过程中),食品质量(流转过程中),食物名称,当前用户名称,质量,状态.
// 2. 对食品基本信息进行初始化
// 3. 实现两个方法:中间商添加食品信息;超市添加食品信息
// 4. 实现显示食品信息的方法
contract FoodInfoItem{
uint[] _timestamp;//①保存食品流转过程中各个阶段的时间戳
string[] _traceName;//②保存食品流转过程各个阶段的用户名
address[] _traceAddress;//③保存食品流转过程各个阶段的用户地址信息(和用户一一对应)
uint8[] _traceQuality;//④保存食品流转过程中各个阶段的质量
string _name;//⑤食品名称
string _currentTraceName;//⑥当前用户名称
uint8 _quality;//⑦质量0=优质 1=合格 2=不合格)
uint8 _status;//⑧状态0:生产 1:分销 2:出售)
address _owner;//⑨初始化owner
constructor (string name, string traceName, uint8 quality, address producer) public {
_timestamp.push(now);
_traceName.push(traceName);
_traceAddress.push(producer);
_traceQuality.push(quality);
_name = name;
_currentTraceName = traceName;
_quality = quality;
_status = 0;
_owner = msg.sender;
}
function addTraceInfoByDistributor(string traceName,address distributor, uint8 quality) public returns(bool) {
require(_status == 0 , "status must be producing");
require(_owner == msg.sender,"only trace contract can invoke")
//②
_timestamp.push(now);
_traceName.push(traceName);
_currentTraceName = traceName;
_traceAddress.push(distributor);
_quality = quality;
//③
//④
_traceQuality.push(_quality);
_status = 1;
return true;
}
function addTraceInfoByRetailer(string traceName,address retailer, uint8 quality) public returns(bool) {
require(_status == 1 , "status must be distributing");
require(_owner == msg.sender,"only trace contract can invoke")
//②
_timestamp.push(now);
_traceName.push(traceName);
_currentTraceName = traceName;
_traceAddress.push(retailer);
_quality = quality;
//③
//④
_traceQuality.push(_quality);
_status = 2;
return true;
}
function getTraceInfo() public constant returns(uint[], string[], address[], uint8[]) {
return(_timestamp, _traceName, _traceAddress, _traceQuality);
}
function getFood() public constant returns(uint, string, string, string, address, uint8) {
return(_timestamp[0], _traceName[0], _name, _currentTraceName, _traceAddress[0], _quality);
}
}
```
@tab Producer.sol
```solidity
pragma solidity ^0.4.25;
import "./Roles.sol";
//生产者角色
contract Producer {
using Roles for Roles.Role;
event ProducerAdded(address indexed account);
event ProducerRemoved(address indexed account);
Roles.Role private _producers;
constructor (address producer) public {
_addProducer(producer);
}
modifier onlyProducer() {
require(isProducer(msg.sender), "ProducerRole: caller does not have the Producer role");
_;
}
function isProducer(address account) public view returns (bool) {
return _producers.has(account);
}
function addProducer(address account) public onlyProducer {
_addProducer(account);
}
function renounceProducer() public {
_removeProducer(msg.sender);
}
function _addProducer(address account) internal {
_producers.add(account);
emit ProducerAdded(account);
}
function _removeProducer(address account) internal {
_producers.remove(account);
emit ProducerRemoved(account);
}
}
```
@tab Retailer.sol
```solidity
pragma solidity ^0.4.25;
import "./Roles.sol";
//零售商角色(超市)
contract Retailer {
using Roles for Roles.Role;
event RetailerAdded(address indexed account);
event RetailerRemoved(address indexed account);
Roles.Role private _retailers;
constructor (address retailer) public {
_addRetailer(retailer);
}
modifier onlyRetailer() {
require(isRetailer(msg.sender), "RetailerRole: caller does not have the Retailer role");
_;
}
function isRetailer(address account) public view returns (bool) {
return _retailers.has(account);
}
function addRetailer(address account) public onlyRetailer {
_addRetailer(account);
}
function renounceRetailer() public {
_removeRetailer(msg.sender);
}
function _addRetailer(address account) internal {
_retailers.add(account);
emit RetailerAdded(account);
}
function _removeRetailer(address account) internal {
_retailers.remove(account);
emit RetailerRemoved(account);
}
}
```
@tab Roles.sol
```solidity
pragma solidity ^0.4.25;
//角色库(管理所有角色地址)
// 1. 实现增加角色地址
// 2. 移除角色地址
// 3. 判断角色地址是否被授权
library Roles {
struct Role {
mapping (address => bool) bearer;
}
function add(Role storage role, address account) internal {
require(!has(role, account), "Roles: account already has role");
role.bearer[account] = true;
}
function remove(Role storage role, address account) internal {
require(has(role, account), "Roles: account does not have role");
role.bearer[account] = false;
}
function has(Role storage role, address account) internal returns (bool) {
require(account != address(0), "Roles: account is the zero address");
return role.bearer[account];
}
}
```
@tab Trace.sol
```solidity
pragma solidity >=0.4.22 <0.7.0;
pragma experimental ABIEncoderV2;
import "./FoodInfoItem.sol";
import "./Distributor.sol";
import "./Producer.sol";
import "./Retailer.sol";
//食品溯源合约(负责具体食品溯源信息的生成)
// 1.实现生产食品的方法(新建食品信息)
// 2.实现食品分销过程中增加溯源信息的接口
// 3.实现食品出售过程中增加溯源信息的接口
// 4.实现获取食品溯源信息接口
contract Trace is Producer, Distributor, Retailer{
mapping (uint256 => address) foods;//食品溯源id到具体食品溯源合约的映射表
uint[] foodList;
//构造函数
constructor(address producer, address distributor, address retailer)
public Producer(producer)
Distributor(distributor)
Retailer(retailer){
}
//生成食品溯源信息接口
//只有Producer能调用
//name 食品名称
//traceNumber 食品溯源id
//traceName 当前用户名称
//quality 当前食品质量
function newFood(string name,uint256 traceNumber, string traceName, uint8 quality)
public onlyProducer returns(uint)
{
require(foods[traceNumber] == address(0),"traceName already exist");//④
FoodInfoItem food = new FoodInfoItem(name,traceName,quality,msg.sender);//⑤
foods[traceNumber] = food;//⑥
foodList.push(traceNumber);//⑦
retur food;//⑧
}
//食品分销过程中增加溯源信息的接口
//只有Distributor能调用
//traceNumber 食品溯源id
//traceName 当前用户名称
//quality 当前食品质量
function addTraceInfoByDistributor(uint256 traceNumber,string traceName, uint8 quality)
public onlyRetailer returns(bool) {
require(foods[traceNumber] != address(0),"traceNumber does not exist");
//③
return FoodInfoItem(foods[traceNumber]).addTraceInfoByDistributor(traceName,msg.sender, quality);
}
//食品出售过程中增加溯源信息的接口
//只有Retailer能调用
//traceNumber 食品溯源id
//traceName 当前用户名称
//quality 当前食品质量
function addTraceInfoByRetailer(uint256 traceNumber,string traceName, uint8 quality)
public onlyRetailer returns(bool) {
require(foods[traceNumber != address(0)], "traceNumber does not exist");
return FoodInfoItem(foods[traceNumber]).addTraceInfoByRetailer(traceName,msg.sender, quality);
}
//获取食品溯源信息接口
//string[] 保存食品流转过程中各个阶段的相关信息
//address[] 保存食品流转过程各个阶段的用户地址信息(和用户一一对应)
//uint8[] 保存食品流转过程中各个阶段的状态变化
function getTraceInfo(uint256 traceNumber) public constant returns(uint[], string[], address[], uint8[]) {
require(foods[traceNumber] != address(0), "traceNumber does not exist");
return FoodInfoItem(foods[traceNumber]).getTraceInfo();
}
function getFood(uint256 traceNumber) public constant returns(uint, string, string, string, address, uint8) {
require(foods[traceNumber] != address(0), "traceNumber does not exist");
return FoodInfoItem(foods[traceNumber]).getFood();
}
function getAllFood() public constant returns (uint[]) {
return foodList;
}
}
```
:::
## 题目二
题目:
1.供应链金融实体信息编码6分
1编写供应链金融智能合约的实体接口完成实体通用数据的初始化实现企业和票据实体信息上链的功能2分
2编写企业上链信息接口实现供应链金融的企业信息上链2分
3基于给定的智能合约代码以及注释完成银行向企业交易的接口函数2分
2.供应链金融公司与公司接口编码6分
1编写公司与公司之间进行交易的历史存证上链接口实现公司与公司之间的交易功能2分
2编写创建存证的接口实现创建存证的功能2分
3编写交易金额数量变化的接口实现凭证交易双方资金的变化功能2分
3.供应链金融公司与银行交易的接口编码4分
1编写公司与银行之间进行交易的历史存证上链接口实现公司与银行之间的交易功能2分
2编写创建存证的接口实现创建存证的功能1分
3编写交易金额数量变化的接口实现凭证交易双方资金的变化功能1分
::: code-tabs
@tab xxx.sol
```solidity
```
@tab xxx.sol
```solidity
```
@tab xxx.sol
```solidity
```
:::
## 题目三
题目:
子任务2-2-1太阳能板管理接口编码
1. 根据文档要求,编写太阳能板新增接口功能,必须将新增太阳能板数据存入指定表中,在存储完成后需触发后事件并返回存储与否的标识;
2. 根据文档要求,编写太阳能板修改接口,必须通过指定表修改完成数据更新,在完成更新后需触发事件并返回更新与否的标识。
子任务2-2-2能源管理接口编码
1. 根据文档要求,编写能源新增接口功能,必须将新增能源数据存入指定表中,在存储完成后需触发后事件并返回存储与否的标识;
2. 根据文档要求,编写能源修改接口,必须通过指定表修改完成数据更新,在完成更新后需触发事件并返回更新与否的标识。
子任务2-2-3合约部署和调用
1. 解决代码错误和警告正确编译并部署合约成功获取部署的合约地址和ABI
2. 调用太阳能板查询合约接口,完整验证业务流程;
3. 调用能源查询合约接口,完整验证业务流程。
::: code-tabs
@tab xxx.sol
```solidity
```
@tab xxx.sol
```solidity
```
@tab xxx.sol
```solidity
```
:::
## 题目四
原题:
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”请补充缺失代码
}
}
```
:::
## 题目五
题目:
1.个人签章信息接口编码
1编写个人签章智能合约的实体接口完成实体通用数据的初始化实现签章和用户实体信息上链的功能
2编写签章信息上链的接口实现Seal合约的构造函数
3基于给定的智能合约代码以及注释完成ElectronicSeal合约判断多人签章文件编号是否存在的函数。
2.电子印章接口编码
1基于给定的智能合约代码以及注释完成ElectronicSeal合约获取多人签章信息函数
2基于给定的智能合约代码以及注释完成ElectronicSeal合约多人签章函数。
::: code-tabs
@tab xxx.sol
```solidity
```
:::
## 题目六
题目:
1.食品信息Food、成员信息(Member)、生产订单信息(Productions)的结构体功能编码6分
1编写食品信息实体功能。2分
2完善智能合约中用户结构体内容2分
3编写生产订单(Productions)结构体信息。2分
2.食品溯源(Trace)的接口编码6分
1根据食品信息结构体完成食品信息添加相应功能2分
2编写食品溯源收购商创建收购订单功能。
3编写食品溯源创建运输订单功能。
3.角色Role管理的接口编码4分
1编写食品溯源增加角色接口实现添加角色的功能。1分
2编写食品溯源获取角色功能。1分
3编写食品溯源修改角色功能。2分
::: code-tabs
@tab xxx.sol
```
```
:::
## 题目七
原题:
**子任务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请编写合约代码
/********** 编写判断航班是否延误接口开发 ***********/
}
```
:::
## 题目八
题目:
子任务2-2-1信息管理合约编码
1. 编写检索个人信息接口,完成患者通过身份证号检索其姓名、性别、年龄的功能;
2. 编写信息管理接口,完成允许患者与医院和科室进行信息管理,通过身份证号检索到患者的个人信息,将预约信息显示给患者,并发送到患者的账户地址中的功能;
子任务2-2-2病历管理合约编码
1. 编写新建病历接口,实现检索病人对应科室既往病历,授权医生查看,如果没有既往病历则创建一个新的病历功能;
2. 编写结束就诊接口,实现检查病历是否已经填写,并结束病历咨询的功能。
子任务2-2-3病历查看合约编码
根据需求用例文档在待补充源码中完成病历查看合约的编码,解决代码错误和警告,正确编译合约,功能调试正确,运行合约中的检查退款请求状态、自动批准退款请求接口功能。
1编写查看病人个人信息接口实现获取指定病人个人信息功能
2编写查看病人病情描述接口实现获取指定病人病情描述功能。
::: code-tabs
@tab xxx.sol
```
```
:::
## 题目九
题目:
子任务2-2-1合同管理合约编码
1编写房东签署合同接口完成本合同位置只允许房东签署通过合同中的信息生成租赁合同的链上哈希触发协议签署合同的功能其中合同中的信息包括房东链上账户、租客链上账户、租赁开始时间、租赁结束时间、月租金额、押金金额、交租时间
2编写租金支付接口完成只允许租客支付租金的规则检查支付的租金金额是否正确触发记录租金支付情况的功能。
子任务2-2-2违约管理合约编码
1编写房东终止合同接口实现房东终止合同判断如果租客已经终止合同则合同无效如果合同有效对合同终止状态进行标记将剩余押金退还给租客的功能
2编写租客终止合同接口实现租客终止合同判断如果房东已经终止合同则合同无效如果合同有效对合同终止状态进行标记将剩余押金退还给房东的功能。
子任务2-2-3押金管理合约编码
根据需求用例文档在待补充源码中完成押金管理合约的编码,解决代码错误和警告,正确编译合约,功能调试正确,运行合约中的租客缴纳押金情况查询、房东收取押金情况查询接口功能。
1编写租客缴纳押金情况查询接口实现查询租客是狗已缴纳押金功能
2编写房东收取押金情况查询接口实现房东是否已收到押金的功能。
::: code-tabs
@tab xxx.sol
```
```
:::
## 题目十
题目:
子任务2-2-1账户管理合约编码
根据需求用例文档在待补充源码中完成账户管理合约的编码,解决代码错误和警告,正确编译合约,功能调试正确。需要编写生成账户接口,完成从外部部门检索姓名、年龄、雇主、开始日期、工资、缴费基数,将人员信息进行综合存储功能。
子任务2-2-2费用管理合约编码
根据需求用例文档在待补充源码中完成费用管理合约的编码,解决代码错误和警告,正确编译合约,功能调试正确,运行添加新职工账户、添加新雇主账户。
1编写添加新职工账户接口实现当账户不存在只有管理员可以添加职工账户职工新账户中账户余额为0未被赞助的功能
2编写添加新雇主账户接口实现当账户不存在只有管理员可以添加雇主账户雇主新账户中账户余额为0已被赞助的功能
子任务2-2-3保险转移合约编码
根据需求用例文档在待补充源码中完成保险转移合约的编码,解决代码错误和警告,正确编译合约,功能调试正确,运行合约中的申请转移关系、接收账户转移接口。
1编写申请转移关系接口实现创建申请、添加到申请列表功能其中创建申请需要设置申请人地址、原城市、目标城市、停缴状态、批准状态
2编写接收账户转移接口实现获取账户进行账户授权状态、接收状态、个人账户基金、统筹账户基金、养老保险账户的信息设置
::: code-tabs
@tab xxx.sol
```
```
:::

View File

@@ -8,8 +8,8 @@
"node": "^20.6.0 || >=22.0.0" "node": "^20.6.0 || >=22.0.0"
}, },
"scripts": { "scripts": {
"docs:dev": "vuepress dev docs", "docs:dev": "vuepress dev docs --port 4567",
"docs:dev-clean": "vuepress dev docs --clean-cache --clean-temp", "docs:dev-clean": "vuepress dev docs --clean-cache --clean-temp --port 4567",
"docs:build": "vuepress build docs --clean-cache --clean-temp", "docs:build": "vuepress build docs --clean-cache --clean-temp",
"docs:preview": "http-server docs/.vuepress/dist", "docs:preview": "http-server docs/.vuepress/dist",
"vp-update": "npx vp-update" "vp-update": "npx vp-update"

1
start.bat Normal file
View File

@@ -0,0 +1 @@
npm run docs:dev -- --host 0.0.0.0