diff --git a/Makefile b/Makefile index 91714b6edbbcdef66b4b0ff1d04c39c2dac0bd65..4367bdcd59307e83e9596b161a023295f9eb849b 100644 --- a/Makefile +++ b/Makefile @@ -4,17 +4,17 @@ VERSION_DEVELOP=develop gomod: go get chainmaker.org/chainmaker/pb-go/v2@$(VERSION) go get chainmaker.org/chainmaker/common/v2@$(VERSION_DEVELOP) - go get chainmaker.org/chainmaker/protocol/v2@$(VERSION_DEVELOP) + go get chainmaker.org/chainmaker/protocol/v2@$(VERSION) go get chainmaker.org/chainmaker/logger/v2@$(VERSION_DEVELOP) go get chainmaker.org/chainmaker/utils/v2@$(VERSION) go get chainmaker.org/chainmaker/localconf/v2@$(VERSION) - go get chainmaker.org/chainmaker/chainconf/v2@$(VERSION_DEVELOP) + go get chainmaker.org/chainmaker/chainconf/v2@$(VERSION) go mod tidy lint: golangci-lint run ./... ut: - mkdir -p ../vm-native-ut - go test -v -coverprofile=../vm-native-ut/cover.out ./... - go tool cover -html=../vm-native-ut/cover.out -o ../vm-native-ut/coverage.html \ No newline at end of file + mkdir -p ../ut-vm-native + go test -v -coverprofile=../ut-vm-native/cover.out ./... + go tool cover -html=../ut-vm-native/cover.out -o ../ut-vm-native/coverage.html \ No newline at end of file diff --git a/contractmgr/contract_manager.go b/contractmgr/contract_manager.go index 06e00920443189b7aecba9f3e34d610f0b60ebdf..8b451d461f5d4f8988b59dd1951c4184d02a1981 100644 --- a/contractmgr/contract_manager.go +++ b/contractmgr/contract_manager.go @@ -12,12 +12,12 @@ import ( "errors" "fmt" - "chainmaker.org/chainmaker/vm-native/v2/common" - + "chainmaker.org/chainmaker/pb-go/v2/accesscontrol" commonPb "chainmaker.org/chainmaker/pb-go/v2/common" "chainmaker.org/chainmaker/pb-go/v2/syscontract" "chainmaker.org/chainmaker/protocol/v2" "chainmaker.org/chainmaker/utils/v2" + "chainmaker.org/chainmaker/vm-native/v2/common" ) var ( @@ -388,16 +388,20 @@ func (r *ContractManagerRuntime) InstallContract(context protocol.TxSimContext, if len(existContract) > 0 { //exist return nil, 0, errContractExist } + creator, err := r.getCreator(context) + if err != nil { + return nil, 0, err + } contract := &commonPb.Contract{ Name: name, Version: version, RuntimeType: runTime, Status: commonPb.ContractStatus_NORMAL, - Creator: context.GetSender(), + Creator: creator, } cdata, _ := contract.Marshal() - err := context.Put(ContractName, key, cdata) + err = context.Put(ContractName, key, cdata) if err != nil { return nil, 0, err } @@ -428,6 +432,29 @@ func (r *ContractManagerRuntime) InstallContract(context protocol.TxSimContext, return contract, result.GasUsed, nil } +func (r *ContractManagerRuntime) getCreator(context protocol.TxSimContext) (*accesscontrol.MemberFull, error) { + ac, err := context.GetAccessControl() + if err != nil { + r.log.Warn(err) + return nil, err + } + sender := context.GetSender() + member, err := ac.NewMember(sender) + if err != nil { + r.log.Warn(err) + return nil, err + } + creator := &accesscontrol.MemberFull{ + OrgId: sender.GetOrgId(), + MemberType: sender.GetMemberType(), + MemberInfo: sender.GetMemberInfo(), + MemberId: member.GetMemberId(), + Role: string(member.GetRole()), + Uid: member.GetUid(), + } + return creator, nil +} + //UpgradeContract 升级现有合约 func (r *ContractManagerRuntime) UpgradeContract(context protocol.TxSimContext, name, version string, byteCode []byte, runTime commonPb.RuntimeType, upgradeParameters map[string][]byte) (*commonPb.Contract, uint64, error) { diff --git a/contractmgr/contract_manger_test.go b/contractmgr/contract_manger_test.go index a541572721c1c05505007b84a610ba0859b1585e..8a72858d0128891da1d1e72c21ea371b0bd5ec18 100644 --- a/contractmgr/contract_manger_test.go +++ b/contractmgr/contract_manger_test.go @@ -26,9 +26,10 @@ func TestContractManagerRuntime_InstallContract(t *testing.T) { ctrl := gomock.NewController(t) txSimContext := mock.NewMockTxSimContext(ctrl) defer ctrl.Finish() - //acTest := mock.NewMockAccessControlProvider(ctrl) - //acTest.EXPECT().GetHashAlg().Return("SHA256").AnyTimes() - //txSimContext.EXPECT().GetAccessControl().Return(acTest, nil).AnyTimes() + acTest := mock.NewMockAccessControlProvider(ctrl) + acTest.EXPECT().GetHashAlg().Return("SHA256").AnyTimes() + acTest.EXPECT().NewMember(gomock.Any()).Return(&Mb{}, nil).AnyTimes() + txSimContext.EXPECT().GetAccessControl().Return(acTest, nil).AnyTimes() txSimContext.EXPECT().Get(gomock.Any(), gomock.Any()).Return([]byte{}, nil).AnyTimes() txSimContext.EXPECT().GetSender().Return(&pbac.Member{MemberInfo: []byte("user1")}).AnyTimes() txSimContext.EXPECT().Put(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() @@ -195,6 +196,10 @@ func TestContractManagerRuntime_InstallContract2(t *testing.T) { ctrl := gomock.NewController(t) txSimContext := mock.NewMockTxSimContext(ctrl) defer ctrl.Finish() + acTest := mock.NewMockAccessControlProvider(ctrl) + acTest.EXPECT().GetHashAlg().Return("SHA256").AnyTimes() + acTest.EXPECT().NewMember(gomock.Any()).Return(&Mb{}, nil).AnyTimes() + txSimContext.EXPECT().GetAccessControl().Return(acTest, nil).AnyTimes() txSimContext.EXPECT().Get(gomock.Any(), gomock.Any()).Return([]byte{}, nil).AnyTimes() txSimContext.EXPECT().GetSender().Return(&pbac.Member{MemberInfo: []byte("user1")}).AnyTimes() txSimContext.EXPECT().Put(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() @@ -221,3 +226,30 @@ func TestContractManagerRuntime_UpgradeContract2(t *testing.T) { result := runtime.upgradeContract(txSimContext, initParameters()) assert.EqualValues(t, 0, result.Code) } + +type Mb struct { +} + +func (m Mb) GetMemberId() string { + return "memberId" +} + +func (m Mb) GetOrgId() string { + return "orgId" +} + +func (m Mb) GetRole() protocol.Role { + return "role" +} + +func (m Mb) GetUid() string { + return "uid" +} + +func (m Mb) Verify(hashType string, msg []byte, sig []byte) error { + panic("implement me") +} + +func (m Mb) GetMember() (*pbac.Member, error) { + panic("implement me") +} diff --git a/go.mod b/go.mod index a2c0628edd854809e5d7edd368adeeb9aa4018a7..be3363944a860ac401e3e159392b70e7876a8e2a 100644 --- a/go.mod +++ b/go.mod @@ -3,13 +3,13 @@ module chainmaker.org/chainmaker/vm-native/v2 go 1.15 require ( - chainmaker.org/chainmaker/chainconf/v2 v2.1.2-0.20220108134151-1a64f9a1c6a1 - chainmaker.org/chainmaker/common/v2 v2.1.2-0.20211223085411-e4d0e79b2fb7 - chainmaker.org/chainmaker/localconf/v2 v2.1.1-0.20211214124610-bb7620382194 + chainmaker.org/chainmaker/chainconf/v2 v2.1.2-0.20220113072252-aecb4f7ffef0 + chainmaker.org/chainmaker/common/v2 v2.1.2-0.20220118101118-f256fc9c55e6 + chainmaker.org/chainmaker/localconf/v2 v2.1.1-0.20220112085516-908b8478be8f chainmaker.org/chainmaker/logger/v2 v2.1.1-0.20211214124250-621f11b35ab0 - chainmaker.org/chainmaker/pb-go/v2 v2.1.1-0.20220107183321-db2282e902c5 - chainmaker.org/chainmaker/protocol/v2 v2.1.2-0.20220107184221-3b7ad20fc480 - chainmaker.org/chainmaker/utils/v2 v2.1.1-0.20220107161104-2478c2170e16 + chainmaker.org/chainmaker/pb-go/v2 v2.1.1-0.20220119062501-d1b3a201f7fb + chainmaker.org/chainmaker/protocol/v2 v2.1.2-0.20220113081648-bbf6c1946b59 + chainmaker.org/chainmaker/utils/v2 v2.1.1-0.20220114120415-8e1af1e262a7 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 diff --git a/go.sum b/go.sum index b68a949e5f94d3624160ff3663412ae5bed267c3..20394fe449e93d65afe0a544f5d9280361664ffc 100644 --- a/go.sum +++ b/go.sum @@ -1,21 +1,24 @@ -chainmaker.org/chainmaker/chainconf/v2 v2.1.2-0.20220108134151-1a64f9a1c6a1 h1:hU0RwL4vqGJQtkpYdTtnOmPy9NTvreWdX7dY/7KWojc= -chainmaker.org/chainmaker/chainconf/v2 v2.1.2-0.20220108134151-1a64f9a1c6a1/go.mod h1:VMGqTkTrANqthL6lBpaPt3H68+ZciNApjfSb+K1di7Q= +chainmaker.org/chainmaker/chainconf/v2 v2.1.2-0.20220113072252-aecb4f7ffef0 h1:iCWWSFcQTy/jos6Q3X0QUl3Blp/lyFKFnxKRpWUSmQY= +chainmaker.org/chainmaker/chainconf/v2 v2.1.2-0.20220113072252-aecb4f7ffef0/go.mod h1:AR2MszGq1lxI9sHfqj/80cYQ0TMICMT1cANDeNNxv+s= chainmaker.org/chainmaker/common/v2 v2.1.1-0.20211214041159-fe0b2240f08c/go.mod h1:mxLliE20J5mML421llb1T8vj9VtULEMGDA88TITgl68= -chainmaker.org/chainmaker/common/v2 v2.1.2-0.20211223085411-e4d0e79b2fb7 h1:x41AJQdhgMSycEvC7HDsWkxjh+3Gw3GCLOjzx2b41LE= chainmaker.org/chainmaker/common/v2 v2.1.2-0.20211223085411-e4d0e79b2fb7/go.mod h1:mxLliE20J5mML421llb1T8vj9VtULEMGDA88TITgl68= -chainmaker.org/chainmaker/localconf/v2 v2.1.1-0.20211214124610-bb7620382194 h1:dAJ7ZvgbReH7KzzFLkOnN4cbHzijXR2QiqFJzg0Uj4s= -chainmaker.org/chainmaker/localconf/v2 v2.1.1-0.20211214124610-bb7620382194/go.mod h1:ylpW9ir14psujTtKb6qQW81aKhnhjzWW3n9XpjD9S0A= +chainmaker.org/chainmaker/common/v2 v2.1.2-0.20220118101118-f256fc9c55e6 h1:S1cCAfr20W+yV2oiFi64Mm0tCi/amQ01vc6W5fubQwQ= +chainmaker.org/chainmaker/common/v2 v2.1.2-0.20220118101118-f256fc9c55e6/go.mod h1:mxLliE20J5mML421llb1T8vj9VtULEMGDA88TITgl68= +chainmaker.org/chainmaker/localconf/v2 v2.1.1-0.20220112085516-908b8478be8f h1:LrJM1BxZSNuVu4856jIHefku2/0dNGwVoIsvHCgEQi8= +chainmaker.org/chainmaker/localconf/v2 v2.1.1-0.20220112085516-908b8478be8f/go.mod h1:ylpW9ir14psujTtKb6qQW81aKhnhjzWW3n9XpjD9S0A= chainmaker.org/chainmaker/logger/v2 v2.1.1-0.20211214124250-621f11b35ab0 h1:62Lqj463DA9D9g+B8Ciy9RgVf9KmP+4Ayyu0MHiGIJs= chainmaker.org/chainmaker/logger/v2 v2.1.1-0.20211214124250-621f11b35ab0/go.mod h1:pGuJzxvh/JywvHX2+ezy+Xts/Pajw4PGspKGc27U1ow= chainmaker.org/chainmaker/pb-go/v2 v2.1.1-0.20211214073209-1288f39035e8/go.mod h1:gDZodc1Kp6snzGXugS/REqfCqNNizhniQmjeOKUVf64= -chainmaker.org/chainmaker/pb-go/v2 v2.1.1-0.20211215062821-d83f1382c35e/go.mod h1:gDZodc1Kp6snzGXugS/REqfCqNNizhniQmjeOKUVf64= -chainmaker.org/chainmaker/pb-go/v2 v2.1.1-0.20220107183321-db2282e902c5 h1:RqkQa3FdNi1W0crZFSpVRvutSHxJn8U9IQHh7Ym6Vvo= -chainmaker.org/chainmaker/pb-go/v2 v2.1.1-0.20220107183321-db2282e902c5/go.mod h1:b5fg5e93xCjSHU1b5yk/mnslab+z7N08kMkNVDoSpcI= -chainmaker.org/chainmaker/protocol/v2 v2.1.2-0.20211214124103-9512460ad844/go.mod h1:D3B4Ss0Ii1ga1TWBteOuxtOeDZkh4ccExvzZsGK1Mj0= -chainmaker.org/chainmaker/protocol/v2 v2.1.2-0.20220107184221-3b7ad20fc480 h1:zwv574WKHF3dSuyx3t9K6RAl6gEbN30uB/OXlWXFItU= -chainmaker.org/chainmaker/protocol/v2 v2.1.2-0.20220107184221-3b7ad20fc480/go.mod h1:JqzgVT/OlfpK/ng14RLeydbpOI2u3R2n2G6cu4IS9/s= -chainmaker.org/chainmaker/utils/v2 v2.1.1-0.20220107161104-2478c2170e16 h1:wqu3O0/YBPtOXvqu+BHnHy4Abrj0/xodvsE9fMfsNtc= -chainmaker.org/chainmaker/utils/v2 v2.1.1-0.20220107161104-2478c2170e16/go.mod h1:3YX46GuLB9uJtW3aM4NIoY5SilHB0/5xxWktQuyJ0Pg= +chainmaker.org/chainmaker/pb-go/v2 v2.1.1-0.20220110032709-5947499a1a6d/go.mod h1:b5fg5e93xCjSHU1b5yk/mnslab+z7N08kMkNVDoSpcI= +chainmaker.org/chainmaker/pb-go/v2 v2.1.1-0.20220111065457-38aa34ce86a3/go.mod h1:b5fg5e93xCjSHU1b5yk/mnslab+z7N08kMkNVDoSpcI= +chainmaker.org/chainmaker/pb-go/v2 v2.1.1-0.20220119062501-d1b3a201f7fb h1:HmLJvvtUyRmiDc8rCtLdentg0alEXCRgtZB+WSqYs+4= +chainmaker.org/chainmaker/pb-go/v2 v2.1.1-0.20220119062501-d1b3a201f7fb/go.mod h1:b5fg5e93xCjSHU1b5yk/mnslab+z7N08kMkNVDoSpcI= +chainmaker.org/chainmaker/protocol/v2 v2.1.2-0.20220110033503-d6b4e5a065d9/go.mod h1:7VlxwX9MHyHpfAFw7OW+y7hUqawbp/GZKLeQlRDVZdk= +chainmaker.org/chainmaker/protocol/v2 v2.1.2-0.20220113081648-bbf6c1946b59 h1:SR3GsTur2WAsDllkmAWCxFtcWjzVWG9DIWDsYWnzfYs= +chainmaker.org/chainmaker/protocol/v2 v2.1.2-0.20220113081648-bbf6c1946b59/go.mod h1:SYkMoufkVVj4wI1JOU/YpV4Re4Z2i1WXgk+sn0ulWDk= +chainmaker.org/chainmaker/utils/v2 v2.1.1-0.20220110033929-0723ce6bd6ac/go.mod h1:gcBoQ+BL9xodHvb5oh8SLfdo9IEOYzGx+XLsECTj5xk= +chainmaker.org/chainmaker/utils/v2 v2.1.1-0.20220114120415-8e1af1e262a7 h1:RT1NbZf0M7i4p9WmDOoGD59W1FygpEMd5mL8Otzqa4w= +chainmaker.org/chainmaker/utils/v2 v2.1.1-0.20220114120415-8e1af1e262a7/go.mod h1:GeDrATiYzHJ6tdzV3+81kBjCBy5Bb9fCjTQLZLE6kJo= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= diff --git a/privatecompute/tx_context_mock.go b/privatecompute/tx_context_mock.go index 1020d53c6aab440f3921aebc3765c8d3e3e1dc0a..361130c1adb99d45d907276f2cfe42a6f46b754a 100644 --- a/privatecompute/tx_context_mock.go +++ b/privatecompute/tx_context_mock.go @@ -22,6 +22,10 @@ type TxContextMock struct { cacheMap dataStore } +func (s *TxContextMock) GetNoRecord(contractName string, key []byte) ([]byte, error) { + panic("implement me") +} + func (s *TxContextMock) GetBlockTimestamp() int64 { panic("implement me") } diff --git a/v210/contractmgr/contract_manager.go b/v210/contractmgr/contract_manager.go index e714da0397fa1797978b4353e981a3bbaa8023fb..92e601bea7474f9853e986caf9c0b5a015fed991 100644 --- a/v210/contractmgr/contract_manager.go +++ b/v210/contractmgr/contract_manager.go @@ -12,6 +12,8 @@ import ( "errors" "fmt" + "chainmaker.org/chainmaker/pb-go/v2/accesscontrol" + "chainmaker.org/chainmaker/vm-native/v2/chainconfigmgr" "chainmaker.org/chainmaker/vm-native/v2/common" @@ -560,16 +562,20 @@ func (r *ContractManagerRuntime) InstallContract(context protocol.TxSimContext, if len(existContract) > 0 { //exist return nil, errContractExist } + creator, err := r.getCreator(context) + if err != nil { + return nil, err + } contract := &commonPb.Contract{ Name: name, Version: version, RuntimeType: runTime, Status: commonPb.ContractStatus_NORMAL, - Creator: context.GetSender(), + Creator: creator, } cdata, _ := contract.Marshal() - err := context.Put(ContractName, key, cdata) + err = context.Put(ContractName, key, cdata) if err != nil { return nil, err } @@ -713,3 +719,26 @@ func (r *ContractManagerRuntime) changeContractStatus(context protocol.TxSimCont } return contract, nil } + +func (r *ContractManagerRuntime) getCreator(context protocol.TxSimContext) (*accesscontrol.MemberFull, error) { + ac, err := context.GetAccessControl() + if err != nil { + r.log.Warn(err) + return nil, err + } + sender := context.GetSender() + member, err := ac.NewMember(sender) + if err != nil { + r.log.Warn(err) + return nil, err + } + creator := &accesscontrol.MemberFull{ + OrgId: sender.GetOrgId(), + MemberType: sender.GetMemberType(), + MemberInfo: sender.GetMemberInfo(), + MemberId: member.GetMemberId(), + Role: string(member.GetRole()), + Uid: member.GetUid(), + } + return creator, nil +}