syntax = "proto3";
package types;
option go_package = "../types";
//后面如果有其他数据模型可继续往上面添加
message Storage {
    oneof value {
        ContentOnlyNotaryStorage  contentStorage      = 1;
        HashOnlyNotaryStorage     hashStorage         = 2;
        LinkNotaryStorage         linkStorage         = 3;
        EncryptNotaryStorage      encryptStorage      = 4;
        EncryptShareNotaryStorage encryptShareStorage = 5;
        EncryptNotaryAdd          encryptAdd          = 6;
    }
    int32 ty = 7;
}

message StorageAction {
    oneof value {
        ContentOnlyNotaryStorage  contentStorage      = 1;
        HashOnlyNotaryStorage     hashStorage         = 2;
        LinkNotaryStorage         linkStorage         = 3;
        EncryptNotaryStorage      encryptStorage      = 4;
        EncryptShareNotaryStorage encryptShareStorage = 5;
        EncryptNotaryAdd          encryptAdd          = 6;
    }
    int32 ty = 7;
}
// 内容存证模型
message ContentOnlyNotaryStorage {
    //长度需要小于512k
    bytes content = 1;
    //自定义的主键，可以为空，如果没传，则用txhash为key
    string key = 2;
    // Op 0表示创建 1表示追加add
    int32  op = 3;
    //字符串值
    string value = 4;
}

//哈希存证模型，推荐使用sha256哈希，限制256位得摘要值
message HashOnlyNotaryStorage {

    //长度固定为32字节
    bytes hash = 1;
    //自定义的主键，可以为空，如果没传，则用txhash为key
    string key = 2;
    //字符串值
    string value = 3;
}

// 链接存证模型
message LinkNotaryStorage {
    //存证内容的链接，可以写入URL,或者其他可用于定位源文件得线索.
    bytes link = 1;
    //源文件得hash值，推荐使用sha256哈希，限制256位得摘要值
    bytes hash = 2;
    //自定义的主键，可以为空，如果没传，则用txhash为key
    string key = 3;
    //字符串值
    string value = 4;
}

// 隐私存证模型，如果一个文件需要存证，且不公开内容，可以选择将源文件通过对称加密算法加密后上链
message EncryptNotaryStorage {
    //存证明文内容的hash值，推荐使用sha256哈希，限制256位得摘要值
    bytes contentHash = 1;
    //源文件得密文，由加密key及nonce对明文加密得到该值。
    bytes encryptContent = 2;
    //加密iv，通过AES进行加密时制定随机生成的iv,解密时需要使用该值
    bytes nonce = 3;
    //自定义的主键，可以为空，如果没传，则用txhash为key
    string key = 4;
    //字符串值
    string value = 5;
}

// 分享隐私存证模型,需要完备的sdk或者相应的密钥库支持
message EncryptShareNotaryStorage {
    //存证明文内容的hash值，推荐使用sha256哈希，限制256位得摘要值
    bytes contentHash = 1;
    //源文件得密文。,用公钥地址加密
    bytes encryptContent = 2;
    //公钥
    bytes pubKey = 3;
    //自定义的主键，可以为空，如果没传，则用txhash为key
    string key = 4;
    //字符串值
    string value = 5;
}

// 加密存证数据运算
message EncryptNotaryAdd {
    //源操作数存证索引
    string key = 1;
    //待操作数据
    bytes encryptAdd = 2;
}

service storage {}
//根据txhash去状态数据库中查询存储内容
message QueryStorage {
    string txHash = 1;
}
//批量查询有可能导致数据库崩溃
message BatchQueryStorage {
    repeated string txHashs = 1;
}

message BatchReplyStorage {
    repeated Storage storages = 1;
}

message ReceiptStorage {
}
