---
# System prepended metadata

title: 项目合约部分

---

# 项目合约部分

## DID 问题

1. 是否有制造商白名单机制
   - 比如前期只愿允许小米才能注册device

2. 设备的生命周期有什么？
   - 未激活 
   - 已激活
   - 正常运行
   - lock （可重新解锁）？
   - 已报废（永久性的）？
   
   在不同的生命周期，产生的IoT数据，是否都要上链（L2）
   
3. 如果上链，gas 费如何解决
    - 如果不上链，数据存储到 L2？

4. Product（对应Collection）和 Device（对应 Item）这样的数据结构
    - Product 的是否添加一个`生产商 （maker）` 属性 

5. Product 和 Item 都应该能够附加元数据（固有的和项目方自定义的），可编程字段的增删改查

6. 铸造操作，对于厂商是注册操作，**是否添加`费用(fee) 属性`**，可以是 0，也可以是动态变化，方便平台收取费用，是一种盈利措施。
    - 收费：可能是在铸造 Device 的时候收取费用
    - 立即收费 or 过一段时间收费

7. 激活操作，激活是用户行为，自主激活
    - owner：一开始为空，表示未激活。激活成功，填入用户钱包地址，如果是代理激活，填入代理地址。
    - owner 是否允许用户更新（转让设备）


8. 代理激活
   - 用户操作设备，需要通过代理地址
   - 代理激活，一定是咱们先垫付，后找制造商回款，回款机制如何设计（链上 or 链下）
   - 代理激活是否可以更换为自主激活（个人操作激活, 更新owner）
   - 如果变为自主激活，立即收费 or 过一段时间收费，需要注意


9. 开发一个代理激活设备的**合约函数**，然后开发一个中心化服务，提供 Web2 API，方便没有 Solana 钱包的用户激活设备，Gas 费用可以加在铸造 Device 时候的费用里

   - 如果使用代理激活，我们可以设置一个代理账号，过一段时间再结算 gas 费
   
10. 开发一个区块链浏览器，提供 Web2 API，提交 DID 获取对应的元数据，用于帮助链下网络的鉴权和授权
    - 区块浏览器显示哪些内容：时间，地址，操作行为等。

## 数据结构与指令

1. Project，这个是链下结构
    - `devices_count` 根据 mint 的次数
    ```rust
    pub struct Project {
        name: String,
        vendor_name: String,
        network: String,
        contract_address: String,
        contract_name: String,
        contract_version: u8,
        minter_address: String,
        devices_count: u32,
    }
    ```
2. Product，这个是链上结构（Collection）


    ```rust

    // admin allow_reg_addr
    // sender inclouds in  allow_reg_addr

    pub struct Admin {
        admin: Account,
    }

    pub struct Global {
        reg_fee: float, // default = 1/100
        allow_reg_addr = vec![],
    }    

    pub struct Product {
        name: String,   
    }
    ```
    
3. Device
    - `identity` 对应设备的 DID 地址
    - holder
    ```rust
    pub struct Device {
        identity: Account<Did>,
        holder_addr: String,
        lock: bool,
    }
    ```
    
4. Did
    ```rust
    pub struct Did {
        name: String,
        mintAt: u32,
        series_num: String,
        owner: Account,
    }
    ```
    
    - register vendor into global
    
    // - update
    
```rust=
impl Product {
    fn mint(){
        sender = "" // get sender 
        if Global.allow_reg_addr.contains(&sender)  {
            msg!("mint successful!!")
        }
    }
    
}

impl Device {
    pub activate() {
      sender = "" // get sender 
        
        let device = Device{}
        device.owner = sender
        device.project.devices_count += 1
        
        msg!("activate successful!!")
    }
}

// update Global
```

## api 功能

1. 查询信息
    - get all projects info
      http://47.91.17.183:1337/api/projects/
      
    - get project detail
      http://47.91.17.183:1337/api/projects/1
      https://fake-did-staging.dephy.io/api/demo
      

    - get all devices info
      https://fake-did-staging.dephy.io/api/demo/devices/
      http://47.91.17.183:1337/api/devices/
      
    - get device detail
      http://47.91.17.183:1337/api/devices/1
      
      https://fake-did-staging.dephy.io/api/demo/devices/0xe66bbb2b28273f4f0307e4c48fa30e304203016c
   
2. 执行
    - register
    - create collection
    - mint
    - actived