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

Commit 12c3d53e authored by gh lu's avatar gh lu

fix: get empty state returns nil instead of []byte

--bug=1004998
parent 9eff2ad2
......@@ -398,6 +398,22 @@ func (mr *MockSDKInterfaceMockRecorder) GetStateFromKeyByte(key interface{}) *go
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStateFromKeyByte", reflect.TypeOf((*MockSDKInterface)(nil).GetStateFromKeyByte), 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.
func (m *MockSDKInterface) GetTxId() (string, error) {
m.ctrl.T.Helper()
......
......@@ -119,28 +119,24 @@ func (s *SDK) GetArgs() map[string][]byte {
}
func (s *SDK) GetState(key, field string) (string, error) {
s.sandboxLogger.Debugf("get state for [%s#%s]", key, field)
if err := protocol.CheckKeyFieldStr(key, field); err != nil {
// get from chain maker
value, err := s.GetStateByte(key, field)
if err != nil {
return "", err
}
return string(value), nil
}
// get from write set
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
}
func (s *SDK) GetStateWithExists(key, field string) (string, bool, error) {
// get from chain maker
value, err := s.getState(key, field)
value, err := s.GetStateByte(key, field)
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) {
......@@ -207,49 +203,11 @@ func (s *SDK) GetStateByte(key, field string) ([]byte, error) {
}
func (s *SDK) GetStateFromKey(key string) (string, error) {
s.sandboxLogger.Debugf("get state for [%s#%s]", 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
value, err := s.getState(key, "")
if err != nil {
return "", err
}
return string(value), nil
return s.GetState(key, "")
}
func (s *SDK) GetStateFromKeyByte(key string) ([]byte, error) {
s.sandboxLogger.Debugf("get state for [%s#%s]", 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, "")
return s.GetStateByte(key, "")
}
func (s *SDK) getBatchState(batchKeys []*vmPb.BatchKey) ([]*vmPb.BatchKey, error) {
......@@ -850,37 +808,7 @@ func (s *SDK) NewHistoryKvIterForKey(key, field string) (KeyHistoryKvIter, error
}
func (s *SDK) GetSenderAddr() (string, error) {
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
return s.Origin()
}
func (s *SDK) Sender() (string, error) {
......@@ -891,38 +819,7 @@ func (s *SDK) Sender() (string, error) {
return s.senderAddress, nil
}
}
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
return s.Origin()
}
func (s *SDK) Origin() (string, error) {
......
......@@ -35,6 +35,13 @@ type SDKInterface interface {
// @return1: 获取结果,格式为string
// @return2: 获取错误信息
GetState(key, field string) (string, error)
// GetStateWithExists get [key, field] from chain and db
// @param key: 获取的参数名
// @param field: 获取的参数名
// @return1: 获取结果,格式为string
// @return2: 是否存在,bool
// @return3: 获取错误信息
GetStateWithExists(key, field string) (string, bool, error)
// GetBatchState get [BatchKeys] from chain and db
// @param batchKey: 获取的参数名
// @return1: 获取结果
......
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