diff --git a/sdk/mock_sdk_interface.go b/sdk/mock_sdk_interface.go index 40608b77820287e40e4bf9e4652c1e8c6c43ab59..43daaddd1c46ba2fe5faf73e19f9f71d6eb76e77 100644 --- a/sdk/mock_sdk_interface.go +++ b/sdk/mock_sdk_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) } +// 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. func (m *MockSDKInterface) GetTxId() (string, error) { m.ctrl.T.Helper() diff --git a/sdk/sdk.go b/sdk/sdk.go index 7764266be1456c3b9ebc6e57822f866672343471..bbd69781ef8ed46018085df83fdc5711889fc930 100644 --- a/sdk/sdk.go +++ b/sdk/sdk.go @@ -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,15 @@ 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 - } + return s.GetState(key, "") +} - // get from chain maker - value, err := s.getState(key, "") - if err != nil { - return "", err - } - return string(value), nil +func (s *SDK) GetStateFromKeyWithExists(key string) (string, bool, error) { + return s.GetStateWithExists(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 +812,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 +823,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) { diff --git a/sdk/sdk_interface.go b/sdk/sdk_interface.go index 8a86099aa92d63707575f18f2d9a8a38e5db4665..8a13d93c762c941b557114e5b6c06bf1ab54ca29 100644 --- a/sdk/sdk_interface.go +++ b/sdk/sdk_interface.go @@ -29,31 +29,46 @@ type SDKInterface interface { // GetArgs get arg from transaction parameters // @return: 参数map GetArgs() map[string][]byte - // GetState get [key, field] from chain and db + // GetState get [key, field] from chain // @param key: 获取的参数名 // @param field: 获取的参数名 // @return1: 获取结果,格式为string // @return2: 获取错误信息 + // Deprecated 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: 获取的参数名 // @return1: 获取结果 // @return2: 获取错误信息 GetBatchState(batchKeys []*vmPb.BatchKey) ([]*vmPb.BatchKey, error) - // GetStateByte get [key, field] from chain and db + // GetStateByte get [key, field] from chain // @param key: 获取的参数名 // @param field: 获取的参数名 - // @return1: 获取结果,格式为[]byte + // @return1: 获取结果,格式为[]byte, nil表示不存在 // @return2: 获取错误信息 GetStateByte(key, field string) ([]byte, error) - // GetStateFromKey get [key] from chain and db + // GetStateFromKey get [key] from chain // @param key: 获取的参数名 // @return1: 获取结果,格式为string // @return2: 获取错误信息 + // Deprecated GetStateFromKey(key string) (string, error) - // GetStateFromKeyByte get [key] from chain and db + // GetStateFromKeyWithExists get [key] from chain // @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: 获取错误信息 GetStateFromKeyByte(key string) ([]byte, error) // PutState put [key, field, value] to chain @@ -189,7 +204,7 @@ type SDKInterface interface { // GetSenderAddr Get the address of the origin caller address, same with Origin() // @return1: origin caller address // @return2: 获取错误信息 - //Deprecated + // Deprecated GetSenderAddr() (string, error) // 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