Commit df9d9538 authored by harrylee's avatar harrylee Committed by vipwzw

rebuild storage

parent 687f0d38
...@@ -12,25 +12,25 @@ import ( ...@@ -12,25 +12,25 @@ import (
func (s *storage) Exec_ContentStorage(payload *storagetypes.ContentOnlyNotaryStorage, tx *types.Transaction, index int) (*types.Receipt, error) { func (s *storage) Exec_ContentStorage(payload *storagetypes.ContentOnlyNotaryStorage, tx *types.Transaction, index int) (*types.Receipt, error) {
action := newStorageAction(s, tx, index) action := newStorageAction(s, tx, index)
return action.ContentStorage(&storagetypes.Storage{Value: &storagetypes.Storage_ContentStorage{ContentStorage: payload}}) return action.ContentStorage(payload)
} }
func (s *storage) Exec_HashStorage(payload *storagetypes.HashOnlyNotaryStorage, tx *types.Transaction, index int) (*types.Receipt, error) { func (s *storage) Exec_HashStorage(payload *storagetypes.HashOnlyNotaryStorage, tx *types.Transaction, index int) (*types.Receipt, error) {
action := newStorageAction(s, tx, index) action := newStorageAction(s, tx, index)
return action.HashStorage(&storagetypes.Storage{Value: &storagetypes.Storage_HashStorage{HashStorage: payload}}) return action.HashStorage(payload)
} }
func (s *storage) Exec_LinkStorage(payload *storagetypes.LinkNotaryStorage, tx *types.Transaction, index int) (*types.Receipt, error) { func (s *storage) Exec_LinkStorage(payload *storagetypes.LinkNotaryStorage, tx *types.Transaction, index int) (*types.Receipt, error) {
action := newStorageAction(s, tx, index) action := newStorageAction(s, tx, index)
return action.LinkStorage(&storagetypes.Storage{Value: &storagetypes.Storage_LinkStorage{LinkStorage: payload}}) return action.LinkStorage(payload)
} }
func (s *storage) Exec_EncryptStorage(payload *storagetypes.EncryptNotaryStorage, tx *types.Transaction, index int) (*types.Receipt, error) { func (s *storage) Exec_EncryptStorage(payload *storagetypes.EncryptNotaryStorage, tx *types.Transaction, index int) (*types.Receipt, error) {
action := newStorageAction(s, tx, index) action := newStorageAction(s, tx, index)
return action.EncryptStorage(&storagetypes.Storage{Value: &storagetypes.Storage_EncryptStorage{EncryptStorage: payload}}) return action.EncryptStorage(payload)
} }
func (s *storage) Exec_EncryptShareStorage(payload *storagetypes.EncryptShareNotaryStorage, tx *types.Transaction, index int) (*types.Receipt, error) { func (s *storage) Exec_EncryptShareStorage(payload *storagetypes.EncryptShareNotaryStorage, tx *types.Transaction, index int) (*types.Receipt, error) {
action := newStorageAction(s, tx, index) action := newStorageAction(s, tx, index)
return action.EncryptShareStorage(&storagetypes.Storage{Value: &storagetypes.Storage_EncryptShareStorage{EncryptShareStorage: payload}}) return action.EncryptShareStorage(payload)
} }
package executor package executor
import ( import (
"fmt"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
storagetypes "github.com/33cn/plugin/plugin/dapp/storage/types" ety "github.com/33cn/plugin/plugin/dapp/storage/types"
) )
/* /*
...@@ -10,33 +11,94 @@ import ( ...@@ -10,33 +11,94 @@ import (
* 非关键数据,本地存储(localDB), 用于辅助查询,效率高 * 非关键数据,本地存储(localDB), 用于辅助查询,效率高
*/ */
func (s *storage) ExecLocal_ContentStorage(payload *storagetypes.ContentOnlyNotaryStorage, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (s *storage) ExecLocal_ContentStorage(payload *ety.ContentOnlyNotaryStorage, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{} dbSet := &types.LocalDBSet{}
//implement code if receiptData.Ty == types.ExecOk {
for _, log := range receiptData.Logs {
switch log.Ty {
case ety.TyContentStorageLog:
storage := &ety.Storage{}
if err := types.Decode(log.Log, storage); err != nil {
return nil, err
}
fmt.Println(string(storage.GetContentStorage().Key))
kv := &types.KeyValue{Key: getLocalDBKey(storage.GetContentStorage().Key), Value: types.Encode(storage)}
dbSet.KV = append(dbSet.KV, kv)
}
}
}
return s.addAutoRollBack(tx, dbSet.KV), nil return s.addAutoRollBack(tx, dbSet.KV), nil
} }
func (s *storage) ExecLocal_HashStorage(payload *storagetypes.HashOnlyNotaryStorage, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (s *storage) ExecLocal_HashStorage(payload *ety.HashOnlyNotaryStorage, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{} dbSet := &types.LocalDBSet{}
//implement code if receiptData.Ty == types.ExecOk {
for _, log := range receiptData.Logs {
switch log.Ty {
case ety.TyHashStorageLog:
storage := &ety.Storage{}
if err := types.Decode(log.Log, storage); err != nil {
return nil, err
}
kv := &types.KeyValue{Key: getLocalDBKey(storage.GetHashStorage().Key), Value: types.Encode(storage)}
dbSet.KV = append(dbSet.KV, kv)
}
}
}
return s.addAutoRollBack(tx, dbSet.KV), nil return s.addAutoRollBack(tx, dbSet.KV), nil
} }
func (s *storage) ExecLocal_LinkStorage(payload *storagetypes.LinkNotaryStorage, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (s *storage) ExecLocal_LinkStorage(payload *ety.LinkNotaryStorage, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{} dbSet := &types.LocalDBSet{}
//implement code if receiptData.Ty == types.ExecOk {
for _, log := range receiptData.Logs {
switch log.Ty {
case ety.TyLinkStorageLog:
storage := &ety.Storage{}
if err := types.Decode(log.Log, storage); err != nil {
return nil, err
}
kv := &types.KeyValue{Key: getLocalDBKey(storage.GetLinkStorage().Key), Value: types.Encode(storage)}
dbSet.KV = append(dbSet.KV, kv)
}
}
}
return s.addAutoRollBack(tx, dbSet.KV), nil return s.addAutoRollBack(tx, dbSet.KV), nil
} }
func (s *storage) ExecLocal_EncryptStorage(payload *storagetypes.EncryptNotaryStorage, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (s *storage) ExecLocal_EncryptStorage(payload *ety.EncryptNotaryStorage, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{} dbSet := &types.LocalDBSet{}
//implement code if receiptData.Ty == types.ExecOk {
for _, log := range receiptData.Logs {
switch log.Ty {
case ety.TyEncryptStorageLog:
storage := &ety.Storage{}
if err := types.Decode(log.Log, storage); err != nil {
return nil, err
}
kv := &types.KeyValue{Key: getLocalDBKey(storage.GetEncryptStorage().Key), Value: types.Encode(storage)}
dbSet.KV = append(dbSet.KV, kv)
}
}
}
return s.addAutoRollBack(tx, dbSet.KV), nil return s.addAutoRollBack(tx, dbSet.KV), nil
} }
func (s *storage) ExecLocal_EncryptShareStorage(payload *storagetypes.EncryptShareNotaryStorage, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (s *storage) ExecLocal_EncryptShareStorage(payload *ety.EncryptShareNotaryStorage, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{} dbSet := &types.LocalDBSet{}
//implement code if receiptData.Ty == types.ExecOk {
for _, log := range receiptData.Logs {
switch log.Ty {
case ety.TyEncryptShareStorageLog:
storage := &ety.Storage{}
if err := types.Decode(log.Log, storage); err != nil {
return nil, err
}
kv := &types.KeyValue{Key: getLocalDBKey(storage.GetEncryptShareStorage().Key), Value: types.Encode(storage)}
dbSet.KV = append(dbSet.KV, kv)
}
}
}
return s.addAutoRollBack(tx, dbSet.KV), nil return s.addAutoRollBack(tx, dbSet.KV), nil
} }
......
...@@ -19,3 +19,9 @@ func Key(txHash string) (key []byte) { ...@@ -19,3 +19,9 @@ func Key(txHash string) (key []byte) {
key = append(key, []byte(txHash)...) key = append(key, []byte(txHash)...)
return key return key
} }
func getLocalDBKey(txHash string) (key []byte) {
key = append(key, []byte(KeyPrefixLocalDB)...)
key = append(key, []byte(txHash)...)
return key
}
...@@ -7,10 +7,10 @@ import ( ...@@ -7,10 +7,10 @@ import (
//从statedb 读取原始数据 //从statedb 读取原始数据
func (s *storage) Query_QueryStorage(in *storagetypes.QueryStorage) (types.Message, error) { func (s *storage) Query_QueryStorage(in *storagetypes.QueryStorage) (types.Message, error) {
return QueryStorage(s.GetStateDB(), in) return QueryStorage(s.GetStateDB(), s.GetLocalDB(), in.TxHash)
} }
//通过状态查询ids //通过状态查询ids
func (s *storage) Query_BatchQueryStorage(in *storagetypes.BatchQueryStorage) (types.Message, error) { func (s *storage) Query_BatchQueryStorage(in *storagetypes.BatchQueryStorage) (types.Message, error) {
return BatchQueryStorage(s.GetStateDB(), in) return BatchQueryStorage(s.GetStateDB(), s.GetLocalDB(), in)
} }
...@@ -51,6 +51,11 @@ func (s *storage) GetDriverName() string { ...@@ -51,6 +51,11 @@ func (s *storage) GetDriverName() string {
return driverName return driverName
} }
//ExecutorOrder Exec 的时候 同时执行 ExecLocal
func (s *storage) ExecutorOrder() int64 {
return drivers.ExecLocalSameTime
}
// CheckTx 实现自定义检验交易接口,供框架调用 // CheckTx 实现自定义检验交易接口,供框架调用
func (s *storage) CheckTx(tx *types.Transaction, index int) error { func (s *storage) CheckTx(tx *types.Transaction, index int) error {
// implement code // implement code
......
...@@ -6,12 +6,13 @@ import ( ...@@ -6,12 +6,13 @@ import (
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
dbm "github.com/33cn/chain33/common/db" dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
storagetypes "github.com/33cn/plugin/plugin/dapp/storage/types" ety "github.com/33cn/plugin/plugin/dapp/storage/types"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
) )
type StorageAction struct { type StorageAction struct {
db dbm.KV db dbm.KV
localdb dbm.KV
txhash []byte txhash []byte
fromaddr string fromaddr string
blocktime int64 blocktime int64
...@@ -22,7 +23,7 @@ type StorageAction struct { ...@@ -22,7 +23,7 @@ type StorageAction struct {
func newStorageAction(s *storage, tx *types.Transaction, index int) *StorageAction { func newStorageAction(s *storage, tx *types.Transaction, index int) *StorageAction {
hash := tx.Hash() hash := tx.Hash()
fromaddr := tx.From() fromaddr := tx.From()
return &StorageAction{s.GetStateDB(), hash, fromaddr, return &StorageAction{s.GetStateDB(), s.GetLocalDB(), hash, fromaddr,
s.GetBlockTime(), s.GetHeight(), index} s.GetBlockTime(), s.GetHeight(), index}
} }
func (s *StorageAction) GetKVSet(payload proto.Message) (kvset []*types.KeyValue) { func (s *StorageAction) GetKVSet(payload proto.Message) (kvset []*types.KeyValue) {
...@@ -30,54 +31,114 @@ func (s *StorageAction) GetKVSet(payload proto.Message) (kvset []*types.KeyValue ...@@ -30,54 +31,114 @@ func (s *StorageAction) GetKVSet(payload proto.Message) (kvset []*types.KeyValue
return kvset return kvset
} }
func (s *StorageAction) ContentStorage(payload proto.Message) (*types.Receipt, error) { func (s *StorageAction) ContentStorage(payload *ety.ContentOnlyNotaryStorage) (*types.Receipt, error) {
//TODO 这里可以加具体得文本内容限制,超过指定大小的数据不容许写到状态数据库中 //TODO 这里可以加具体得文本内容限制,超过指定大小的数据不容许写到状态数据库中
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
log := &types.ReceiptLog{Ty: storagetypes.TyContentStorageLog} var kvs []*types.KeyValue
key := payload.Key
op := payload.Op
if key == "" {
key = common.ToHex(s.txhash)
}
payload.Key = key
storage, err := QueryStorageFromLocalDB(s.localdb, key)
if op == ety.OpCreate {
if err != types.ErrNotFound {
return nil, ety.ErrKeyExisted
}
} else {
if err == nil && storage.Ty != ety.TyContentStorageAction {
return nil, ety.ErrStorageType
}
content := append(storage.GetContentStorage().Content, []byte(",")...)
payload.Content = append(content, payload.Content...)
}
stg := &ety.Storage{Value: &ety.Storage_ContentStorage{ContentStorage: payload}, Ty: ety.TyContentStorageAction}
log := &types.ReceiptLog{Ty: ety.TyContentStorageLog, Log: types.Encode(stg)}
logs = append(logs, log) logs = append(logs, log)
kv := s.GetKVSet(payload) receipt := &types.Receipt{Ty: types.ExecOk, KV: kvs, Logs: logs}
receipt := &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}
return receipt, nil return receipt, nil
} }
func (s *StorageAction) HashStorage(payload proto.Message) (*types.Receipt, error) { func (s *StorageAction) HashStorage(payload *ety.HashOnlyNotaryStorage) (*types.Receipt, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
log := &types.ReceiptLog{Ty: storagetypes.TyHashStorageLog} var kvs []*types.KeyValue
key := payload.Key
if key == "" {
key = common.ToHex(s.txhash)
}
_, err := QueryStorageFromLocalDB(s.localdb, key)
if err != types.ErrNotFound {
return nil, ety.ErrKeyExisted
}
payload.Key = key
stg := &ety.Storage{Value: &ety.Storage_HashStorage{HashStorage: payload}, Ty: ety.TyHashStorageAction}
log := &types.ReceiptLog{Ty: ety.TyHashStorageLog, Log: types.Encode(stg)}
logs = append(logs, log) logs = append(logs, log)
kv := s.GetKVSet(payload) receipt := &types.Receipt{Ty: types.ExecOk, KV: kvs, Logs: logs}
receipt := &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}
return receipt, nil return receipt, nil
} }
func (s *StorageAction) LinkStorage(payload proto.Message) (*types.Receipt, error) { func (s *StorageAction) LinkStorage(payload *ety.LinkNotaryStorage) (*types.Receipt, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
log := &types.ReceiptLog{Ty: storagetypes.TyLinkStorageLog} var kvs []*types.KeyValue
key := payload.Key
if key == "" {
key = common.ToHex(s.txhash)
}
payload.Key = key
_, err := QueryStorageFromLocalDB(s.localdb, key)
if err != types.ErrNotFound {
return nil, ety.ErrKeyExisted
}
stg := &ety.Storage{Value: &ety.Storage_LinkStorage{LinkStorage: payload}, Ty: ety.TyLinkStorageAction}
log := &types.ReceiptLog{Ty: ety.TyLinkStorageLog, Log: types.Encode(stg)}
logs = append(logs, log) logs = append(logs, log)
kv := s.GetKVSet(payload) receipt := &types.Receipt{Ty: types.ExecOk, KV: kvs, Logs: logs}
receipt := &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}
return receipt, nil return receipt, nil
} }
func (s *StorageAction) EncryptStorage(payload proto.Message) (*types.Receipt, error) { func (s *StorageAction) EncryptStorage(payload *ety.EncryptNotaryStorage) (*types.Receipt, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
log := &types.ReceiptLog{Ty: storagetypes.TyEncryptStorageLog} var kvs []*types.KeyValue
key := payload.Key
if key == "" {
key = common.ToHex(s.txhash)
}
payload.Key = key
_, err := QueryStorageFromLocalDB(s.localdb, key)
if err != types.ErrNotFound {
return nil, ety.ErrKeyExisted
}
stg := &ety.Storage{Value: &ety.Storage_EncryptStorage{EncryptStorage: payload}, Ty: ety.TyEncryptStorageAction}
log := &types.ReceiptLog{Ty: ety.TyEncryptStorageLog, Log: types.Encode(stg)}
logs = append(logs, log) logs = append(logs, log)
kv := s.GetKVSet(payload) receipt := &types.Receipt{Ty: types.ExecOk, KV: kvs, Logs: logs}
receipt := &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}
return receipt, nil return receipt, nil
} }
func (s *StorageAction) EncryptShareStorage(payload proto.Message) (*types.Receipt, error) { func (s *StorageAction) EncryptShareStorage(payload *ety.EncryptShareNotaryStorage) (*types.Receipt, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
log := &types.ReceiptLog{Ty: storagetypes.TyEncryptShareStorageLog} var kvs []*types.KeyValue
key := payload.Key
if key == "" {
key = common.ToHex(s.txhash)
}
payload.Key = key
_, err := QueryStorageFromLocalDB(s.localdb, key)
if err != types.ErrNotFound {
return nil, ety.ErrKeyExisted
}
stg := &ety.Storage{Value: &ety.Storage_EncryptShareStorage{EncryptShareStorage: payload}, Ty: ety.TyEncryptStorageAction}
log := &types.ReceiptLog{Ty: ety.TyEncryptShareStorageLog, Log: types.Encode(stg)}
logs = append(logs, log) logs = append(logs, log)
kv := s.GetKVSet(payload) receipt := &types.Receipt{Ty: types.ExecOk, KV: kvs, Logs: logs}
receipt := &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}
return receipt, nil return receipt, nil
} }
func QueryStorageByTxHash(db dbm.KV, txhash string) (*storagetypes.Storage, error) { func QueryStorageByTxHash(db dbm.KV, txhash string) (*ety.Storage, error) {
data, err := db.Get(Key(txhash)) data, err := db.Get(Key(txhash))
if err != nil { if err != nil {
elog.Debug("QueryStorage", "get", err) elog.Debug("QueryStorage", "get", err)
return nil, err return nil, err
} }
var storage storagetypes.Storage var storage ety.Storage
//decode //decode
err = types.Decode(data, &storage) err = types.Decode(data, &storage)
if err != nil { if err != nil {
...@@ -86,19 +147,24 @@ func QueryStorageByTxHash(db dbm.KV, txhash string) (*storagetypes.Storage, erro ...@@ -86,19 +147,24 @@ func QueryStorageByTxHash(db dbm.KV, txhash string) (*storagetypes.Storage, erro
} }
return &storage, nil return &storage, nil
} }
func QueryStorage(db dbm.KV, in *storagetypes.QueryStorage) (types.Message, error) { func QueryStorage(statedb, localdb dbm.KV, txHash string) (*ety.Storage, error) {
if in.TxHash == "" { if txHash == "" {
return nil, fmt.Errorf("txhash can't equail nil") return nil, fmt.Errorf("txhash can't equail nil")
} }
return QueryStorageByTxHash(db, in.TxHash) //先去localdb中查询,如果没有,则再去状态数据库中查询
storage, err := QueryStorageFromLocalDB(localdb, txHash)
if err != nil {
return QueryStorageByTxHash(statedb, txHash)
}
return storage, nil
} }
func BatchQueryStorage(db dbm.KV, in *storagetypes.BatchQueryStorage) (types.Message, error) { func BatchQueryStorage(statedb, localdb dbm.KV, in *ety.BatchQueryStorage) (types.Message, error) {
if len(in.TxHashs) > 10 { if len(in.TxHashs) > 10 {
return nil, fmt.Errorf("The number of batch queries is too large! the maximux is %d,but current num %d", 10, len(in.TxHashs)) return nil, fmt.Errorf("The number of batch queries is too large! the maximux is %d,but current num %d", 10, len(in.TxHashs))
} }
var storage storagetypes.BatchReplyStorage var storage ety.BatchReplyStorage
for _, txhash := range in.TxHashs { for _, txhash := range in.TxHashs {
msg, err := QueryStorageByTxHash(db, txhash) msg, err := QueryStorage(statedb, localdb, txhash)
if err != nil { if err != nil {
return msg, err return msg, err
} }
...@@ -106,3 +172,27 @@ func BatchQueryStorage(db dbm.KV, in *storagetypes.BatchQueryStorage) (types.Mes ...@@ -106,3 +172,27 @@ func BatchQueryStorage(db dbm.KV, in *storagetypes.BatchQueryStorage) (types.Mes
} }
return &storage, nil return &storage, nil
} }
//因为table表不支持嵌套多种数据存储结构,改成手动KV存储
func QueryStorageFromLocalDB(localdb dbm.KV, key string) (*ety.Storage, error) {
data, err := localdb.Get(getLocalDBKey(key))
if err != nil {
return nil, err
}
var storage ety.Storage
err = types.Decode(data, &storage)
if err != nil {
return nil, err
}
return &storage, nil
}
//func QueryStorageFromLocalDB(localdb dbm.KV, key string) (*ety.Storage, error) {
// storageTable := NewStorageTable(localdb)
// row, err := storageTable.GetData([]byte(key))
// if err != nil {
// return nil, err
// }
// fmt.Println(row)
// return row.Data.(*ety.Storage), nil
//}
...@@ -9,6 +9,7 @@ message Storage { ...@@ -9,6 +9,7 @@ message Storage {
EncryptNotaryStorage encryptStorage = 4; EncryptNotaryStorage encryptStorage = 4;
EncryptShareNotaryStorage encryptShareStorage = 5; EncryptShareNotaryStorage encryptShareStorage = 5;
} }
int32 ty = 6;
} }
message StorageAction { message StorageAction {
...@@ -23,8 +24,12 @@ message StorageAction { ...@@ -23,8 +24,12 @@ message StorageAction {
} }
// 内容存证模型 // 内容存证模型
message ContentOnlyNotaryStorage { message ContentOnlyNotaryStorage {
// Op 0表示创建 1表示追加add
int32 op = 1;
//长度需要小于512k //长度需要小于512k
bytes content = 1; bytes content = 2;
//自定义的主键,可以为空,如果没传,则用txhash为key
string key = 3;
} }
//哈希存证模型,推荐使用sha256哈希,限制256位得摘要值 //哈希存证模型,推荐使用sha256哈希,限制256位得摘要值
...@@ -32,6 +37,8 @@ message HashOnlyNotaryStorage { ...@@ -32,6 +37,8 @@ message HashOnlyNotaryStorage {
//长度固定为32字节 //长度固定为32字节
bytes hash = 1; bytes hash = 1;
//自定义的主键,可以为空,如果没传,则用txhash为key
string key = 2;
} }
// 链接存证模型 // 链接存证模型
...@@ -40,6 +47,8 @@ message LinkNotaryStorage { ...@@ -40,6 +47,8 @@ message LinkNotaryStorage {
bytes link = 1; bytes link = 1;
//源文件得hash值,推荐使用sha256哈希,限制256位得摘要值 //源文件得hash值,推荐使用sha256哈希,限制256位得摘要值
bytes hash = 2; bytes hash = 2;
//自定义的主键,可以为空,如果没传,则用txhash为key
string key = 3;
} }
// 隐私存证模型,如果一个文件需要存证,且不公开内容,可以选择将源文件通过对称加密算法加密后上链 // 隐私存证模型,如果一个文件需要存证,且不公开内容,可以选择将源文件通过对称加密算法加密后上链
...@@ -50,30 +59,20 @@ message EncryptNotaryStorage { ...@@ -50,30 +59,20 @@ message EncryptNotaryStorage {
bytes encryptContent = 2; bytes encryptContent = 2;
//加密iv,通过AES进行加密时制定随机生成的iv,解密时需要使用该值 //加密iv,通过AES进行加密时制定随机生成的iv,解密时需要使用该值
bytes nonce = 3; bytes nonce = 3;
} //自定义的主键,可以为空,如果没传,则用txhash为key
// 隐私存证模型 string key = 4;
message EncryptContentOnlyNotaryStorage {
//存证内容的hash值,推荐使用sha256哈希,限制256位得摘要值
// bytes contentHash = 1;
//源文件得密文。
bytes encryptContent = 1;
//加密iv,通过AES进行加密时制定随机生成的iv,解密时需要使用该值
bytes nonce = 2;
} }
// 分享隐私存证模型,需要完备的sdk或者相应的密钥库支持 // 分享隐私存证模型,需要完备的sdk或者相应的密钥库支持
message EncryptShareNotaryStorage { message EncryptShareNotaryStorage {
//存证明文内容的hash值,推荐使用sha256哈希,限制256位得摘要值 //存证明文内容的hash值,推荐使用sha256哈希,限制256位得摘要值
bytes contentHash = 1; bytes contentHash = 1;
//源文件得密文。 //源文件得密文。,用公钥地址加密
bytes encryptContent = 2; bytes encryptContent = 2;
//密钥的kdf推导路径。密钥tree父节点根据该路径可以推导出私钥key //公钥
bytes keyName = 3; bytes pubKey = 3;
//加密key的wrap key。加密key随机生成,对明文进行加密,该key有私密key进行key wrap后公开。 //自定义的主键,可以为空,如果没传,则用txhash为key
//使用时,通过私密key对wrap key解密得到加密key对密文进行解密。 string key = 4;
bytes keyWrap = 4;
//加密iv,通过AES进行加密时制定随机生成的iv,解密时需要使用该值
bytes nonce = 5;
} }
service storage {} service storage {}
......
package types
import "fmt"
// some errors definition
var (
ErrKeyExisted = fmt.Errorf("%s", "The key has already existed!")
ErrStorageType = fmt.Errorf("%s", "The key has used storage another type!")
)
...@@ -41,6 +41,11 @@ const ( ...@@ -41,6 +41,11 @@ const (
TyEncryptShareStorageLog TyEncryptShareStorageLog
) )
const (
OpCreate = int32(iota)
OpAdd
)
var ( var (
//StorageX 执行器名称定义 //StorageX 执行器名称定义
StorageX = "storage" StorageX = "storage"
...@@ -54,11 +59,11 @@ var ( ...@@ -54,11 +59,11 @@ var (
} }
//定义log的id和具体log类型及名称,填入具体自定义log类型 //定义log的id和具体log类型及名称,填入具体自定义log类型
logMap = map[int64]*types.LogInfo{ logMap = map[int64]*types.LogInfo{
TyContentStorageLog: {Ty: reflect.TypeOf(ReceiptStorage{}), Name: "LogContentStorage"}, TyContentStorageLog: {Ty: reflect.TypeOf(Storage{}), Name: "LogContentStorage"},
TyHashStorageLog: {Ty: reflect.TypeOf(ReceiptStorage{}), Name: "LogHashStorage"}, TyHashStorageLog: {Ty: reflect.TypeOf(Storage{}), Name: "LogHashStorage"},
TyLinkStorageLog: {Ty: reflect.TypeOf(ReceiptStorage{}), Name: "LogLinkStorage"}, TyLinkStorageLog: {Ty: reflect.TypeOf(Storage{}), Name: "LogLinkStorage"},
TyEncryptStorageLog: {Ty: reflect.TypeOf(ReceiptStorage{}), Name: "LogEncryptStorage"}, TyEncryptStorageLog: {Ty: reflect.TypeOf(Storage{}), Name: "LogEncryptStorage"},
TyEncryptShareStorageLog: {Ty: reflect.TypeOf(ReceiptStorage{}), Name: "LogEncryptShareStorage"}, TyEncryptShareStorageLog: {Ty: reflect.TypeOf(Storage{}), Name: "LogEncryptShareStorage"},
} }
) )
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment