diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/DataAccountKVSetOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/DataAccountKVSetOperationHandle.java index 52801883..76f55220 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/DataAccountKVSetOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/DataAccountKVSetOperationHandle.java @@ -2,6 +2,7 @@ package com.jd.blockchain.ledger.core.handles; import com.jd.blockchain.ledger.DataAccountDoesNotExistException; import com.jd.blockchain.ledger.DataAccountKVSetOperation; +import com.jd.blockchain.ledger.DataVersionConflictException; import com.jd.blockchain.ledger.DataAccountKVSetOperation.KVWriteEntry; import com.jd.blockchain.ledger.LedgerPermission; import com.jd.blockchain.ledger.core.DataAccount; @@ -33,10 +34,13 @@ public class DataAccountKVSetOperationHandle extends AbstractLedgerOperationHand throw new DataAccountDoesNotExistException("DataAccount doesn't exist!"); } KVWriteEntry[] writeSet = kvWriteOp.getWriteSet(); + long v = -1; for (KVWriteEntry kvw : writeSet) { - account.setBytes(Bytes.fromString(kvw.getKey()), kvw.getValue(), kvw.getExpectedVersion()); + v = account.setBytes(Bytes.fromString(kvw.getKey()), kvw.getValue(), kvw.getExpectedVersion()); + if (v < 0) { + throw new DataVersionConflictException(); + } } } - } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java deleted file mode 100644 index 75607b51..00000000 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.jd.blockchain.ledger.core.impl.handles; - -import org.springframework.stereotype.Service; - -import com.jd.blockchain.binaryproto.DataContractRegistry; -import com.jd.blockchain.ledger.BytesValue; -import com.jd.blockchain.ledger.DataAccountDoesNotExistException; -import com.jd.blockchain.ledger.DataAccountKVSetOperation; -import com.jd.blockchain.ledger.DataAccountKVSetOperation.KVWriteEntry; -import com.jd.blockchain.ledger.DataVersionConflictException; -import com.jd.blockchain.ledger.Operation; -import com.jd.blockchain.ledger.core.DataAccount; -import com.jd.blockchain.ledger.core.LedgerDataSet; -import com.jd.blockchain.ledger.core.LedgerService; -import com.jd.blockchain.ledger.core.OperationHandle; -import com.jd.blockchain.ledger.core.TransactionRequestContext; -import com.jd.blockchain.ledger.core.impl.OperationHandleContext; -import com.jd.blockchain.utils.Bytes; - -@Service -public class DataAccountKVSetOperationHandle implements OperationHandle { - static { - DataContractRegistry.register(BytesValue.class); - } - - @Override - public BytesValue process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, - LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) { - DataAccountKVSetOperation kvWriteOp = (DataAccountKVSetOperation) op; - DataAccount account = dataset.getDataAccountSet().getDataAccount(kvWriteOp.getAccountAddress()); - if (account == null) { - throw new DataAccountDoesNotExistException("DataAccount doesn't exist!"); - } - KVWriteEntry[] writeSet = kvWriteOp.getWriteSet(); - long v = -1; - for (KVWriteEntry kvw : writeSet) { - v = account.setBytes(Bytes.fromString(kvw.getKey()), kvw.getValue(), kvw.getExpectedVersion()); - if (v < 0) { - throw new DataVersionConflictException(); - } - } - return null; - } - -// @Override -// public AsyncFuture asyncProcess(Operation op, LedgerDataSet newBlockDataset, TransactionRequestContext requestContext, LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) { -// return null; -// } - - @Override - public boolean support(Class operationType) { - return DataAccountKVSetOperation.class.isAssignableFrom(operationType); - } - -} diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java index 67e8d660..c731b35b 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.times; @@ -29,29 +30,39 @@ import com.jd.blockchain.ledger.EndpointRequest; import com.jd.blockchain.ledger.KVDataEntry; import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerInitSetting; +import com.jd.blockchain.ledger.LedgerPermission; import com.jd.blockchain.ledger.LedgerTransaction; import com.jd.blockchain.ledger.NodeRequest; import com.jd.blockchain.ledger.OperationResult; import com.jd.blockchain.ledger.TransactionContent; import com.jd.blockchain.ledger.TransactionContentBody; +import com.jd.blockchain.ledger.TransactionPermission; import com.jd.blockchain.ledger.TransactionRequest; import com.jd.blockchain.ledger.TransactionRequestBuilder; import com.jd.blockchain.ledger.TransactionResponse; import com.jd.blockchain.ledger.TransactionState; import com.jd.blockchain.ledger.UserRegisterOperation; -import com.jd.blockchain.ledger.core.LedgerDataSet; +import com.jd.blockchain.ledger.core.DefaultOperationHandleRegisteration; +import com.jd.blockchain.ledger.core.LedgerDataset; import com.jd.blockchain.ledger.core.LedgerEditor; +import com.jd.blockchain.ledger.core.LedgerManager; import com.jd.blockchain.ledger.core.LedgerRepository; +import com.jd.blockchain.ledger.core.LedgerSecurityManager; import com.jd.blockchain.ledger.core.LedgerService; import com.jd.blockchain.ledger.core.LedgerTransactionContext; +import com.jd.blockchain.ledger.core.LedgerTransactionalEditor; +import com.jd.blockchain.ledger.core.OperationHandleRegisteration; +import com.jd.blockchain.ledger.core.SecurityPolicy; +import com.jd.blockchain.ledger.core.TransactionBatchProcessor; import com.jd.blockchain.ledger.core.UserAccount; -import com.jd.blockchain.ledger.core.impl.OperationHandleRegisteration; import com.jd.blockchain.service.TransactionBatchResultHandle; import com.jd.blockchain.storage.service.utils.MemoryKVStorage; import com.jd.blockchain.transaction.BooleanValueHolder; import com.jd.blockchain.transaction.TxBuilder; import com.jd.blockchain.utils.Bytes; -import static org.mockito.Matchers.any; + +import test.com.jd.blockchain.ledger.TxTestContract; +import test.com.jd.blockchain.ledger.TxTestContractImpl; public class ContractInvokingTest { static { @@ -172,19 +183,19 @@ public class ContractInvokingTest { // 注册合约处理器; DefaultOperationHandleRegisteration opReg = new DefaultOperationHandleRegisteration(); - opReg.insertAsTopPriority(contractInvokingHandle); + opReg.registerHandle(contractInvokingHandle); // 发布指定地址合约 deploy(ledgerRepo, ledgerManager, opReg, ledgerHash, contractKey); // 创建新区块的交易处理器; LedgerBlock preBlock = ledgerRepo.getLatestBlock(); - LedgerDataSet previousBlockDataset = ledgerRepo.getDataSet(preBlock); + LedgerDataset previousBlockDataset = ledgerRepo.getDataSet(preBlock); // 加载合约 LedgerEditor newBlockEditor = ledgerRepo.createNextBlock(); - TransactionBatchProcessor txbatchProcessor = new TransactionBatchProcessor(newBlockEditor, previousBlockDataset, - opReg, ledgerManager); + TransactionBatchProcessor txbatchProcessor = new TransactionBatchProcessor(getSecurityManager(), newBlockEditor, + previousBlockDataset, opReg, ledgerManager); String key = TxTestContractImpl.KEY; String value = "VAL"; @@ -253,7 +264,7 @@ public class ContractInvokingTest { // 注册合约处理器; DefaultOperationHandleRegisteration opReg = new DefaultOperationHandleRegisteration(); - opReg.insertAsTopPriority(contractInvokingHandle); + opReg.registerHandle(contractInvokingHandle); // 发布指定地址合约 deploy(ledgerRepo, ledgerManager, opReg, ledgerHash, contractKey); @@ -303,7 +314,7 @@ public class ContractInvokingTest { assertEquals(1, kv2.getVersion()); assertEquals("V1-1", kv1.getValue()); assertEquals("V2-1", kv2.getValue()); - + // 构建基于接口调用合约的交易请求,用于测试合约调用; buildBlock(ledgerRepo, ledgerManager, opReg, new TxDefinitor() { @Override @@ -328,10 +339,10 @@ public class ContractInvokingTest { private LedgerBlock buildBlock(LedgerRepository ledgerRepo, LedgerService ledgerService, OperationHandleRegisteration opReg, TxDefinitor txDefinitor) { LedgerBlock preBlock = ledgerRepo.getLatestBlock(); - LedgerDataSet previousBlockDataset = ledgerRepo.getDataSet(preBlock); + LedgerDataset previousBlockDataset = ledgerRepo.getDataSet(preBlock); LedgerEditor newBlockEditor = ledgerRepo.createNextBlock(); - TransactionBatchProcessor txbatchProcessor = new TransactionBatchProcessor(newBlockEditor, previousBlockDataset, - opReg, ledgerService); + TransactionBatchProcessor txbatchProcessor = new TransactionBatchProcessor(getSecurityManager(), newBlockEditor, + previousBlockDataset, opReg, ledgerService); TxBuilder txBuilder = new TxBuilder(ledgerRepo.getHash()); txDefinitor.buildTx(txBuilder); @@ -361,12 +372,12 @@ public class ContractInvokingTest { private void registerDataAccount(LedgerRepository ledgerRepo, LedgerManager ledgerManager, DefaultOperationHandleRegisteration opReg, HashDigest ledgerHash, BlockchainKeypair kpDataAccount) { LedgerBlock preBlock = ledgerRepo.getLatestBlock(); - LedgerDataSet previousBlockDataset = ledgerRepo.getDataSet(preBlock); + LedgerDataset previousBlockDataset = ledgerRepo.getDataSet(preBlock); // 加载合约 LedgerEditor newBlockEditor = ledgerRepo.createNextBlock(); - TransactionBatchProcessor txbatchProcessor = new TransactionBatchProcessor(newBlockEditor, previousBlockDataset, - opReg, ledgerManager); + TransactionBatchProcessor txbatchProcessor = new TransactionBatchProcessor(getSecurityManager(), newBlockEditor, + previousBlockDataset, opReg, ledgerManager); // 注册数据账户; TxBuilder txBuilder = new TxBuilder(ledgerHash);