Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
df9d9538
Commit
df9d9538
authored
Mar 31, 2020
by
harrylee
Committed by
vipwzw
Apr 04, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rebuild storage
parent
687f0d38
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
246 additions
and
71 deletions
+246
-71
exec.go
plugin/dapp/storage/executor/exec.go
+5
-5
exec_local.go
plugin/dapp/storage/executor/exec_local.go
+73
-11
kv.go
plugin/dapp/storage/executor/kv.go
+6
-0
query.go
plugin/dapp/storage/executor/query.go
+2
-2
storage.go
plugin/dapp/storage/executor/storage.go
+5
-0
storage_test.go
plugin/dapp/storage/executor/storage_test.go
+0
-0
storagedb.go
plugin/dapp/storage/executor/storagedb.go
+120
-30
storage.proto
plugin/dapp/storage/proto/storage.proto
+17
-18
errors.go
plugin/dapp/storage/types/errors.go
+8
-0
storage.go
plugin/dapp/storage/types/storage.go
+10
-5
storage.pb.go
plugin/dapp/storage/types/storage.pb.go
+0
-0
No files found.
plugin/dapp/storage/executor/exec.go
View file @
df9d9538
...
...
@@ -12,25 +12,25 @@ import (
func
(
s
*
storage
)
Exec_ContentStorage
(
payload
*
storagetypes
.
ContentOnlyNotaryStorage
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
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
)
{
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
)
{
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
)
{
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
)
{
action
:=
newStorageAction
(
s
,
tx
,
index
)
return
action
.
EncryptShareStorage
(
&
storagetypes
.
Storage
{
Value
:
&
storagetypes
.
Storage_EncryptShareStorage
{
EncryptShareStorage
:
payload
}}
)
return
action
.
EncryptShareStorage
(
payload
)
}
plugin/dapp/storage/executor/exec_local.go
View file @
df9d9538
package
executor
import
(
"fmt"
"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 (
* 非关键数据,本地存储(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
{}
//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
}
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
{}
//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
}
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
{}
//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
}
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
{}
//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
}
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
{}
//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
}
...
...
plugin/dapp/storage/executor/kv.go
View file @
df9d9538
...
...
@@ -19,3 +19,9 @@ func Key(txHash string) (key []byte) {
key
=
append
(
key
,
[]
byte
(
txHash
)
...
)
return
key
}
func
getLocalDBKey
(
txHash
string
)
(
key
[]
byte
)
{
key
=
append
(
key
,
[]
byte
(
KeyPrefixLocalDB
)
...
)
key
=
append
(
key
,
[]
byte
(
txHash
)
...
)
return
key
}
plugin/dapp/storage/executor/query.go
View file @
df9d9538
...
...
@@ -7,10 +7,10 @@ import (
//从statedb 读取原始数据
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
func
(
s
*
storage
)
Query_BatchQueryStorage
(
in
*
storagetypes
.
BatchQueryStorage
)
(
types
.
Message
,
error
)
{
return
BatchQueryStorage
(
s
.
GetStateDB
(),
in
)
return
BatchQueryStorage
(
s
.
GetStateDB
(),
s
.
GetLocalDB
(),
in
)
}
plugin/dapp/storage/executor/storage.go
View file @
df9d9538
...
...
@@ -51,6 +51,11 @@ func (s *storage) GetDriverName() string {
return
driverName
}
//ExecutorOrder Exec 的时候 同时执行 ExecLocal
func
(
s
*
storage
)
ExecutorOrder
()
int64
{
return
drivers
.
ExecLocalSameTime
}
// CheckTx 实现自定义检验交易接口,供框架调用
func
(
s
*
storage
)
CheckTx
(
tx
*
types
.
Transaction
,
index
int
)
error
{
// implement code
...
...
plugin/dapp/storage/executor/storage_test.go
View file @
df9d9538
This diff is collapsed.
Click to expand it.
plugin/dapp/storage/executor/storagedb.go
View file @
df9d9538
...
...
@@ -6,12 +6,13 @@ import (
"github.com/33cn/chain33/common"
dbm
"github.com/33cn/chain33/common/db"
"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"
)
type
StorageAction
struct
{
db
dbm
.
KV
localdb
dbm
.
KV
txhash
[]
byte
fromaddr
string
blocktime
int64
...
...
@@ -22,7 +23,7 @@ type StorageAction struct {
func
newStorageAction
(
s
*
storage
,
tx
*
types
.
Transaction
,
index
int
)
*
StorageAction
{
hash
:=
tx
.
Hash
()
fromaddr
:=
tx
.
From
()
return
&
StorageAction
{
s
.
GetStateDB
(),
hash
,
fromaddr
,
return
&
StorageAction
{
s
.
GetStateDB
(),
s
.
GetLocalDB
(),
hash
,
fromaddr
,
s
.
GetBlockTime
(),
s
.
GetHeight
(),
index
}
}
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
}
func
(
s
*
StorageAction
)
ContentStorage
(
payload
proto
.
Message
)
(
*
types
.
Receipt
,
error
)
{
func
(
s
*
StorageAction
)
ContentStorage
(
payload
*
ety
.
ContentOnlyNotaryStorage
)
(
*
types
.
Receipt
,
error
)
{
//TODO 这里可以加具体得文本内容限制,超过指定大小的数据不容许写到状态数据库中
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
)
kv
:=
s
.
GetKVSet
(
payload
)
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kv
,
Logs
:
logs
}
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kvs
,
Logs
:
logs
}
return
receipt
,
nil
}
func
(
s
*
StorageAction
)
HashStorage
(
payload
proto
.
Mess
age
)
(
*
types
.
Receipt
,
error
)
{
func
(
s
*
StorageAction
)
HashStorage
(
payload
*
ety
.
HashOnlyNotaryStor
age
)
(
*
types
.
Receipt
,
error
)
{
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
)
kv
:=
s
.
GetKVSet
(
payload
)
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kv
,
Logs
:
logs
}
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kvs
,
Logs
:
logs
}
return
receipt
,
nil
}
func
(
s
*
StorageAction
)
LinkStorage
(
payload
proto
.
Mess
age
)
(
*
types
.
Receipt
,
error
)
{
func
(
s
*
StorageAction
)
LinkStorage
(
payload
*
ety
.
LinkNotaryStor
age
)
(
*
types
.
Receipt
,
error
)
{
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
)
kv
:=
s
.
GetKVSet
(
payload
)
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kv
,
Logs
:
logs
}
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kvs
,
Logs
:
logs
}
return
receipt
,
nil
}
func
(
s
*
StorageAction
)
EncryptStorage
(
payload
proto
.
Mess
age
)
(
*
types
.
Receipt
,
error
)
{
func
(
s
*
StorageAction
)
EncryptStorage
(
payload
*
ety
.
EncryptNotaryStor
age
)
(
*
types
.
Receipt
,
error
)
{
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
)
kv
:=
s
.
GetKVSet
(
payload
)
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kv
,
Logs
:
logs
}
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kvs
,
Logs
:
logs
}
return
receipt
,
nil
}
func
(
s
*
StorageAction
)
EncryptShareStorage
(
payload
proto
.
Mess
age
)
(
*
types
.
Receipt
,
error
)
{
func
(
s
*
StorageAction
)
EncryptShareStorage
(
payload
*
ety
.
EncryptShareNotaryStor
age
)
(
*
types
.
Receipt
,
error
)
{
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
)
kv
:=
s
.
GetKVSet
(
payload
)
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kv
,
Logs
:
logs
}
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kvs
,
Logs
:
logs
}
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
))
if
err
!=
nil
{
elog
.
Debug
(
"QueryStorage"
,
"get"
,
err
)
return
nil
,
err
}
var
storage
storagetypes
.
Storage
var
storage
ety
.
Storage
//decode
err
=
types
.
Decode
(
data
,
&
storage
)
if
err
!=
nil
{
...
...
@@ -86,19 +147,24 @@ func QueryStorageByTxHash(db dbm.KV, txhash string) (*storagetypes.Storage, erro
}
return
&
storage
,
nil
}
func
QueryStorage
(
db
dbm
.
KV
,
in
*
storagetypes
.
QueryStorage
)
(
types
.
Mess
age
,
error
)
{
if
in
.
T
xHash
==
""
{
func
QueryStorage
(
statedb
,
localdb
dbm
.
KV
,
txHash
string
)
(
*
ety
.
Stor
age
,
error
)
{
if
t
xHash
==
""
{
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
{
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
{
msg
,
err
:=
QueryStorage
ByTxHash
(
db
,
txhash
)
msg
,
err
:=
QueryStorage
(
statedb
,
local
db
,
txhash
)
if
err
!=
nil
{
return
msg
,
err
}
...
...
@@ -106,3 +172,27 @@ func BatchQueryStorage(db dbm.KV, in *storagetypes.BatchQueryStorage) (types.Mes
}
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
//}
plugin/dapp/storage/proto/storage.proto
View file @
df9d9538
...
...
@@ -9,6 +9,7 @@ message Storage {
EncryptNotaryStorage
encryptStorage
=
4
;
EncryptShareNotaryStorage
encryptShareStorage
=
5
;
}
int32
ty
=
6
;
}
message
StorageAction
{
...
...
@@ -23,8 +24,12 @@ message StorageAction {
}
// 内容存证模型
message
ContentOnlyNotaryStorage
{
// Op 0表示创建 1表示追加add
int32
op
=
1
;
//长度需要小于512k
bytes
content
=
1
;
bytes
content
=
2
;
//自定义的主键,可以为空,如果没传,则用txhash为key
string
key
=
3
;
}
//哈希存证模型,推荐使用sha256哈希,限制256位得摘要值
...
...
@@ -32,6 +37,8 @@ message HashOnlyNotaryStorage {
//长度固定为32字节
bytes
hash
=
1
;
//自定义的主键,可以为空,如果没传,则用txhash为key
string
key
=
2
;
}
// 链接存证模型
...
...
@@ -40,6 +47,8 @@ message LinkNotaryStorage {
bytes
link
=
1
;
//源文件得hash值,推荐使用sha256哈希,限制256位得摘要值
bytes
hash
=
2
;
//自定义的主键,可以为空,如果没传,则用txhash为key
string
key
=
3
;
}
// 隐私存证模型,如果一个文件需要存证,且不公开内容,可以选择将源文件通过对称加密算法加密后上链
...
...
@@ -50,30 +59,20 @@ message EncryptNotaryStorage {
bytes
encryptContent
=
2
;
//加密iv,通过AES进行加密时制定随机生成的iv,解密时需要使用该值
bytes
nonce
=
3
;
}
// 隐私存证模型
message
EncryptContentOnlyNotaryStorage
{
//存证内容的hash值,推荐使用sha256哈希,限制256位得摘要值
// bytes contentHash = 1;
//源文件得密文。
bytes
encryptContent
=
1
;
//加密iv,通过AES进行加密时制定随机生成的iv,解密时需要使用该值
bytes
nonce
=
2
;
//自定义的主键,可以为空,如果没传,则用txhash为key
string
key
=
4
;
}
// 分享隐私存证模型,需要完备的sdk或者相应的密钥库支持
message
EncryptShareNotaryStorage
{
//存证明文内容的hash值,推荐使用sha256哈希,限制256位得摘要值
bytes
contentHash
=
1
;
//源文件得密文。
//源文件得密文。
,用公钥地址加密
bytes
encryptContent
=
2
;
//密钥的kdf推导路径。密钥tree父节点根据该路径可以推导出私钥key
bytes
keyName
=
3
;
//加密key的wrap key。加密key随机生成,对明文进行加密,该key有私密key进行key wrap后公开。
//使用时,通过私密key对wrap key解密得到加密key对密文进行解密。
bytes
keyWrap
=
4
;
//加密iv,通过AES进行加密时制定随机生成的iv,解密时需要使用该值
bytes
nonce
=
5
;
//公钥
bytes
pubKey
=
3
;
//自定义的主键,可以为空,如果没传,则用txhash为key
string
key
=
4
;
}
service
storage
{}
...
...
plugin/dapp/storage/types/errors.go
0 → 100644
View file @
df9d9538
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!"
)
)
plugin/dapp/storage/types/storage.go
View file @
df9d9538
...
...
@@ -41,6 +41,11 @@ const (
TyEncryptShareStorageLog
)
const
(
OpCreate
=
int32
(
iota
)
OpAdd
)
var
(
//StorageX 执行器名称定义
StorageX
=
"storage"
...
...
@@ -54,11 +59,11 @@ var (
}
//定义log的id和具体log类型及名称,填入具体自定义log类型
logMap
=
map
[
int64
]
*
types
.
LogInfo
{
TyContentStorageLog
:
{
Ty
:
reflect
.
TypeOf
(
Receipt
Storage
{}),
Name
:
"LogContentStorage"
},
TyHashStorageLog
:
{
Ty
:
reflect
.
TypeOf
(
Receipt
Storage
{}),
Name
:
"LogHashStorage"
},
TyLinkStorageLog
:
{
Ty
:
reflect
.
TypeOf
(
Receipt
Storage
{}),
Name
:
"LogLinkStorage"
},
TyEncryptStorageLog
:
{
Ty
:
reflect
.
TypeOf
(
Receipt
Storage
{}),
Name
:
"LogEncryptStorage"
},
TyEncryptShareStorageLog
:
{
Ty
:
reflect
.
TypeOf
(
Receipt
Storage
{}),
Name
:
"LogEncryptShareStorage"
},
TyContentStorageLog
:
{
Ty
:
reflect
.
TypeOf
(
Storage
{}),
Name
:
"LogContentStorage"
},
TyHashStorageLog
:
{
Ty
:
reflect
.
TypeOf
(
Storage
{}),
Name
:
"LogHashStorage"
},
TyLinkStorageLog
:
{
Ty
:
reflect
.
TypeOf
(
Storage
{}),
Name
:
"LogLinkStorage"
},
TyEncryptStorageLog
:
{
Ty
:
reflect
.
TypeOf
(
Storage
{}),
Name
:
"LogEncryptStorage"
},
TyEncryptShareStorageLog
:
{
Ty
:
reflect
.
TypeOf
(
Storage
{}),
Name
:
"LogEncryptShareStorage"
},
}
)
...
...
plugin/dapp/storage/types/storage.pb.go
View file @
df9d9538
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment