新注册的用户请输入邮箱并保存,随后登录邮箱激活账号。后续可直接使用邮箱登录!

Commit 7a0e2f32 authored by tianle's avatar tianle

Merge branch 'v2.3.1_qc_empty_getstate' into 'v2.3.3_qc' (merge request !39)

fix: get empty state returns nil instead of []byte --bug=1004998
fix: get empty state returns nil instead of []byte
--bug=1004998
parents 93f6adab 4ec00c82
...@@ -398,6 +398,38 @@ func (mr *MockSDKInterfaceMockRecorder) GetStateFromKeyByte(key interface{}) *go ...@@ -398,6 +398,38 @@ func (mr *MockSDKInterfaceMockRecorder) GetStateFromKeyByte(key interface{}) *go
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStateFromKeyByte", reflect.TypeOf((*MockSDKInterface)(nil).GetStateFromKeyByte), key) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStateFromKeyByte", reflect.TypeOf((*MockSDKInterface)(nil).GetStateFromKeyByte), key)
} }
// GetStateFromKeyWithExists mocks base method.
func (m *MockSDKInterface) GetStateFromKeyWithExists(key string) (string, bool, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetStateFromKeyWithExists", key)
ret0, _ := ret[0].(string)
ret1, _ := ret[1].(bool)
ret2, _ := ret[2].(error)
return ret0, ret1, ret2
}
// GetStateFromKeyWithExists indicates an expected call of GetStateFromKeyWithExists.
func (mr *MockSDKInterfaceMockRecorder) GetStateFromKeyWithExists(key interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStateFromKeyWithExists", reflect.TypeOf((*MockSDKInterface)(nil).GetStateFromKeyWithExists), key)
}
// GetStateWithExists mocks base method.
func (m *MockSDKInterface) GetStateWithExists(key, field string) (string, bool, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetStateWithExists", key, field)
ret0, _ := ret[0].(string)
ret1, _ := ret[1].(bool)
ret2, _ := ret[2].(error)
return ret0, ret1, ret2
}
// GetStateWithExists indicates an expected call of GetStateWithExists.
func (mr *MockSDKInterfaceMockRecorder) GetStateWithExists(key, field interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStateWithExists", reflect.TypeOf((*MockSDKInterface)(nil).GetStateWithExists), key, field)
}
// GetTxId mocks base method. // GetTxId mocks base method.
func (m *MockSDKInterface) GetTxId() (string, error) { func (m *MockSDKInterface) GetTxId() (string, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
......
...@@ -119,28 +119,24 @@ func (s *SDK) GetArgs() map[string][]byte { ...@@ -119,28 +119,24 @@ func (s *SDK) GetArgs() map[string][]byte {
} }
func (s *SDK) GetState(key, field string) (string, error) { func (s *SDK) GetState(key, field string) (string, error) {
s.sandboxLogger.Debugf("get state for [%s#%s]", key, field) // get from chain maker
if err := protocol.CheckKeyFieldStr(key, field); err != nil { value, err := s.GetStateByte(key, field)
if err != nil {
return "", err return "", err
} }
return string(value), nil
}
// get from write set func (s *SDK) GetStateWithExists(key, field string) (string, bool, error) {
if value, done := s.getFromWriteSet(key, field); done {
s.putIntoReadSet(key, field, value)
return string(value), nil
}
// get from read set
if value, done := s.getFromReadSet(key, field); done {
return string(value), nil
}
// get from chain maker // get from chain maker
value, err := s.getState(key, field) value, err := s.GetStateByte(key, field)
if err != nil { if err != nil {
return "", err return "", false, err
} }
return string(value), nil if value == nil {
return "", false, nil
}
return string(value), true, nil
} }
func (s *SDK) GetBatchState(batchKeys []*vmPb.BatchKey) ([]*vmPb.BatchKey, error) { func (s *SDK) GetBatchState(batchKeys []*vmPb.BatchKey) ([]*vmPb.BatchKey, error) {
...@@ -207,49 +203,15 @@ func (s *SDK) GetStateByte(key, field string) ([]byte, error) { ...@@ -207,49 +203,15 @@ func (s *SDK) GetStateByte(key, field string) ([]byte, error) {
} }
func (s *SDK) GetStateFromKey(key string) (string, error) { func (s *SDK) GetStateFromKey(key string) (string, error) {
s.sandboxLogger.Debugf("get state for [%s#%s]", key, "") return s.GetState(key, "")
if err := protocol.CheckKeyFieldStr(key, ""); err != nil { }
return "", err
}
// get from write set
if value, done := s.getFromWriteSet(key, ""); done {
s.putIntoReadSet(key, "", value)
return string(value), nil
}
// get from read set
if value, done := s.getFromReadSet(key, ""); done {
return string(value), nil
}
// get from chain maker func (s *SDK) GetStateFromKeyWithExists(key string) (string, bool, error) {
value, err := s.getState(key, "") return s.GetStateWithExists(key, "")
if err != nil {
return "", err
}
return string(value), nil
} }
func (s *SDK) GetStateFromKeyByte(key string) ([]byte, error) { func (s *SDK) GetStateFromKeyByte(key string) ([]byte, error) {
s.sandboxLogger.Debugf("get state for [%s#%s]", key, "") return s.GetStateByte(key, "")
if err := protocol.CheckKeyFieldStr(key, ""); err != nil {
return nil, err
}
// get from write set
if value, done := s.getFromWriteSet(key, ""); done {
s.putIntoReadSet(key, "", value)
return value, nil
}
// get from read set
if value, done := s.getFromReadSet(key, ""); done {
return value, nil
}
// get from chain maker
return s.getState(key, "")
} }
func (s *SDK) getBatchState(batchKeys []*vmPb.BatchKey) ([]*vmPb.BatchKey, error) { func (s *SDK) getBatchState(batchKeys []*vmPb.BatchKey) ([]*vmPb.BatchKey, error) {
...@@ -850,37 +812,7 @@ func (s *SDK) NewHistoryKvIterForKey(key, field string) (KeyHistoryKvIter, error ...@@ -850,37 +812,7 @@ func (s *SDK) NewHistoryKvIterForKey(key, field string) (KeyHistoryKvIter, error
} }
func (s *SDK) GetSenderAddr() (string, error) { func (s *SDK) GetSenderAddr() (string, error) {
if s.origin != "" { return s.Origin()
return s.origin, nil
}
responseCh := make(chan *protogo.DockerVMMessage, 1)
respNotify := func(msg *protogo.DockerVMMessage) {
responseCh <- msg
}
getSenderAddrReq := &protogo.DockerVMMessage{
ChainId: s.chainId,
TxId: s.txId,
Type: protogo.DockerVMType_GET_SENDER_ADDRESS_REQUEST,
CrossContext: s.crossCtx,
SysCallMessage: nil,
Response: nil,
Request: nil,
}
s.sendSysCallRequestWithRespNotify(getSenderAddrReq, respNotify)
result := <-responseCh
if result.SysCallMessage.Code == protocol.ContractSdkSignalResultFail {
return "", errors.New(result.SysCallMessage.Message)
}
origin := string(result.SysCallMessage.Payload[KeySenderAddr])
s.origin = origin
return origin, nil
} }
func (s *SDK) Sender() (string, error) { func (s *SDK) Sender() (string, error) {
...@@ -891,38 +823,7 @@ func (s *SDK) Sender() (string, error) { ...@@ -891,38 +823,7 @@ func (s *SDK) Sender() (string, error) {
return s.senderAddress, nil return s.senderAddress, nil
} }
} }
return s.Origin()
if s.origin != "" {
return s.origin, nil
}
responseCh := make(chan *protogo.DockerVMMessage, 1)
respNotify := func(msg *protogo.DockerVMMessage) {
responseCh <- msg
}
getSenderAddrReq := &protogo.DockerVMMessage{
ChainId: s.chainId,
TxId: s.txId,
Type: protogo.DockerVMType_GET_SENDER_ADDRESS_REQUEST,
CrossContext: s.crossCtx,
SysCallMessage: nil,
Response: nil,
Request: nil,
}
s.sendSysCallRequestWithRespNotify(getSenderAddrReq, respNotify)
result := <-responseCh
if result.SysCallMessage.Code == protocol.ContractSdkSignalResultFail {
return "", errors.New(result.SysCallMessage.Message)
}
origin := string(result.SysCallMessage.Payload[KeySenderAddr])
s.origin = origin
return origin, nil
} }
func (s *SDK) Origin() (string, error) { func (s *SDK) Origin() (string, error) {
......
...@@ -29,31 +29,46 @@ type SDKInterface interface { ...@@ -29,31 +29,46 @@ type SDKInterface interface {
// GetArgs get arg from transaction parameters // GetArgs get arg from transaction parameters
// @return: 参数map // @return: 参数map
GetArgs() map[string][]byte GetArgs() map[string][]byte
// GetState get [key, field] from chain and db // GetState get [key, field] from chain
// @param key: 获取的参数名 // @param key: 获取的参数名
// @param field: 获取的参数名 // @param field: 获取的参数名
// @return1: 获取结果,格式为string // @return1: 获取结果,格式为string
// @return2: 获取错误信息 // @return2: 获取错误信息
// Deprecated
GetState(key, field string) (string, error) GetState(key, field string) (string, error)
// GetBatchState get [BatchKeys] from chain and db // GetStateWithExists get [key, field] from chain
// @param key: 获取的参数名
// @param field: 获取的参数名
// @return1: 获取结果,格式为string
// @return2: 是否存在,bool, 字符串长度为0不代表不存在
// @return3: 获取错误信息
GetStateWithExists(key, field string) (string, bool, error)
// GetBatchState get [BatchKeys] from chain
// @param batchKey: 获取的参数名 // @param batchKey: 获取的参数名
// @return1: 获取结果 // @return1: 获取结果
// @return2: 获取错误信息 // @return2: 获取错误信息
GetBatchState(batchKeys []*vmPb.BatchKey) ([]*vmPb.BatchKey, error) GetBatchState(batchKeys []*vmPb.BatchKey) ([]*vmPb.BatchKey, error)
// GetStateByte get [key, field] from chain and db // GetStateByte get [key, field] from chain
// @param key: 获取的参数名 // @param key: 获取的参数名
// @param field: 获取的参数名 // @param field: 获取的参数名
// @return1: 获取结果,格式为[]byte // @return1: 获取结果,格式为[]byte, nil表示不存在
// @return2: 获取错误信息 // @return2: 获取错误信息
GetStateByte(key, field string) ([]byte, error) GetStateByte(key, field string) ([]byte, error)
// GetStateFromKey get [key] from chain and db // GetStateFromKey get [key] from chain
// @param key: 获取的参数名 // @param key: 获取的参数名
// @return1: 获取结果,格式为string // @return1: 获取结果,格式为string
// @return2: 获取错误信息 // @return2: 获取错误信息
// Deprecated
GetStateFromKey(key string) (string, error) GetStateFromKey(key string) (string, error)
// GetStateFromKeyByte get [key] from chain and db // GetStateFromKeyWithExists get [key] from chain
// @param key: 获取的参数名 // @param key: 获取的参数名
// @return1: 获取结果,格式为[]byte // @return1: 获取结果,格式为string
// @return2: 是否存在,bool, 字符串长度为0不代表不存在
// @return3: 获取错误信息
GetStateFromKeyWithExists(key string) (string, bool, error)
// GetStateFromKeyByte get [key] from chain
// @param key: 获取的参数名
// @return1: 获取结果,格式为[]byte, nil表示不存在
// @return2: 获取错误信息 // @return2: 获取错误信息
GetStateFromKeyByte(key string) ([]byte, error) GetStateFromKeyByte(key string) ([]byte, error)
// PutState put [key, field, value] to chain // PutState put [key, field, value] to chain
...@@ -189,7 +204,7 @@ type SDKInterface interface { ...@@ -189,7 +204,7 @@ type SDKInterface interface {
// GetSenderAddr Get the address of the origin caller address, same with Origin() // GetSenderAddr Get the address of the origin caller address, same with Origin()
// @return1: origin caller address // @return1: origin caller address
// @return2: 获取错误信息 // @return2: 获取错误信息
//Deprecated // Deprecated
GetSenderAddr() (string, error) GetSenderAddr() (string, error)
// Sender Get the address of the sender address, if the contract is called by another contract, the result will be // Sender Get the address of the sender address, if the contract is called by another contract, the result will be
// the caller contract's address // the caller contract's address
......
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