diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractEventSendOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractEventSendOperationHandle.java index 498457af..9edde458 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractEventSendOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractEventSendOperationHandle.java @@ -42,7 +42,7 @@ public class ContractEventSendOperationHandle implements OperationHandle { contract.getAddress().toBase58(),contract.getChaincodeVersion(),contract.getChainCode()). processEvent(localContractEventContext); } catch (Exception e) { - e.printStackTrace(); + throw new LedgerException("contract processEvent exception. detail:"+e.getMessage()); } } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContent.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContent.java index 136ce6e0..a081738f 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContent.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContent.java @@ -1,21 +1,25 @@ -package com.jd.blockchain.ledger; - -import com.jd.blockchain.base.data.TypeCodes; -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.crypto.hash.HashDigest; -import com.jd.blockchain.utils.ValueType; - -/** - * 交易内容; - * - * @author huanghaiquan - * - */ -@DataContract(code= TypeCodes.TX_CONTENT) -public interface TransactionContent extends TransactionContentBody, HashObject { - @Override - @DataField(order=1, primitiveType = ValueType.BYTES) - HashDigest getHash(); - -} +package com.jd.blockchain.ledger; + +import com.jd.blockchain.base.data.TypeCodes; +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.crypto.hash.HashDigest; +import com.jd.blockchain.utils.ValueType; + +/** + * 交易内容; + * + * @author huanghaiquan + * + */ +@DataContract(code= TypeCodes.TX_CONTENT) +public interface TransactionContent extends TransactionContentBody, HashObject { + @Override + @DataField(order=1, primitiveType = ValueType.BYTES) + HashDigest getHash(); + + //获得交易操作时间; + @DataField(order=2, primitiveType = ValueType.INT64) + Long getTxOpTime(); + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContentBody.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContentBody.java index 39a27256..82aaf23f 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContentBody.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContentBody.java @@ -1,36 +1,44 @@ -package com.jd.blockchain.ledger; - -import com.jd.blockchain.base.data.TypeCodes; -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.crypto.hash.HashDigest; -import com.jd.blockchain.utils.ValueType; - -/** - * 交易内容; - * - * @author huanghaiquan - * - */ -@DataContract(code = TypeCodes.TX_CONTENT_BODY) -public interface TransactionContentBody { - - /** - * 执行交易的账本地址; - * - * 注:除了账本的创世交易之外,任何交易的账本地址都不允许为 null; - * - * @return - */ - @DataField(order = 1, primitiveType = ValueType.BYTES) - HashDigest getLedgerHash(); - - /** - * 操作列表; - * - * @return - */ - @DataField(order = 2, list = true, refContract = true, genericContract = true) - Operation[] getOperations(); - -} +package com.jd.blockchain.ledger; + +import com.jd.blockchain.base.data.TypeCodes; +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.crypto.hash.HashDigest; +import com.jd.blockchain.utils.ValueType; + +/** + * 交易内容; + * + * @author huanghaiquan + * + */ +@DataContract(code = TypeCodes.TX_CONTENT_BODY) +public interface TransactionContentBody { + + /** + * 执行交易的账本地址; + * + * 注:除了账本的创世交易之外,任何交易的账本地址都不允许为 null; + * + * @return + */ + @DataField(order = 1, primitiveType = ValueType.BYTES) + HashDigest getLedgerHash(); + + /** + * 操作列表; + * + * @return + */ + @DataField(order = 2, list = true, refContract = true, genericContract = true) + Operation[] getOperations(); + + /** + * 交易操作时间 + * + * @return + */ + @DataField(order = 3, primitiveType = ValueType.INT64) + Long getTxOpTime(); + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/data/TxBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/data/TxBuilder.java index fc2680ba..447feb47 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/data/TxBuilder.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/data/TxBuilder.java @@ -1,88 +1,89 @@ -package com.jd.blockchain.ledger.data; - -import com.jd.blockchain.binaryproto.BinaryEncodingUtils; -import com.jd.blockchain.binaryproto.DataContractRegistry; -import com.jd.blockchain.crypto.CryptoAlgorithm; -import com.jd.blockchain.crypto.CryptoUtils; -import com.jd.blockchain.crypto.hash.HashDigest; -import com.jd.blockchain.ledger.TransactionBuilder; -import com.jd.blockchain.ledger.TransactionContent; -import com.jd.blockchain.ledger.TransactionContentBody; -import com.jd.blockchain.ledger.TransactionRequestBuilder; -import com.jd.blockchain.utils.Bytes; - -public class TxBuilder implements TransactionBuilder { - - static { - DataContractRegistry.register(TransactionContentBody.class); - } - - private BlockchainOperationFactory opFactory = new BlockchainOperationFactory(); - - private CryptoAlgorithm defaultHashAlgorithm = CryptoAlgorithm.SHA256; - - private HashDigest ledgerHash; - - public TxBuilder(HashDigest ledgerHash) { - this.ledgerHash = ledgerHash; - } - - @Override - public HashDigest getLedgerHash() { - return ledgerHash; - } - - @Override - public TransactionRequestBuilder prepareRequest() { - TransactionContent txContent = prepareContent(); - return new TxRequestBuilder(txContent); - } - - @Override - public TransactionContent prepareContent() { - TxContentBlob txContent = new TxContentBlob(ledgerHash); - txContent.addOperations(opFactory.getOperations()); - - byte[] contentBodyBytes = BinaryEncodingUtils.encode(txContent, TransactionContentBody.class); - HashDigest contentHash = CryptoUtils.hash(defaultHashAlgorithm).hash(contentBodyBytes); - txContent.setHash(contentHash); - - return txContent; - } - - @Override - public LedgerInitOperationBuilder ledgers() { - return opFactory.ledgers(); - } - - @Override - public UserRegisterOperationBuilder users() { - return opFactory.users(); - } - - @Override - public DataAccountRegisterOperationBuilder dataAccounts() { - return opFactory.dataAccounts(); - } - - @Override - public DataAccountKVSetOperationBuilder dataAccount(String accountAddress) { - return opFactory.dataAccount(accountAddress); - } - - @Override - public DataAccountKVSetOperationBuilder dataAccount(Bytes accountAddress) { - return opFactory.dataAccount(accountAddress); - } - - @Override - public ContractCodeDeployOperationBuilder contracts() { - return opFactory.contracts(); - } - - @Override - public ContractEventSendOperationBuilder contractEvents() { - return opFactory.contractEvents(); - } - -} +package com.jd.blockchain.ledger.data; + +import com.jd.blockchain.binaryproto.BinaryEncodingUtils; +import com.jd.blockchain.binaryproto.DataContractRegistry; +import com.jd.blockchain.crypto.CryptoAlgorithm; +import com.jd.blockchain.crypto.CryptoUtils; +import com.jd.blockchain.crypto.hash.HashDigest; +import com.jd.blockchain.ledger.TransactionBuilder; +import com.jd.blockchain.ledger.TransactionContent; +import com.jd.blockchain.ledger.TransactionContentBody; +import com.jd.blockchain.ledger.TransactionRequestBuilder; +import com.jd.blockchain.utils.Bytes; + +public class TxBuilder implements TransactionBuilder { + + static { + DataContractRegistry.register(TransactionContentBody.class); + } + + private BlockchainOperationFactory opFactory = new BlockchainOperationFactory(); + + private CryptoAlgorithm defaultHashAlgorithm = CryptoAlgorithm.SHA256; + + private HashDigest ledgerHash; + + public TxBuilder(HashDigest ledgerHash) { + this.ledgerHash = ledgerHash; + } + + @Override + public HashDigest getLedgerHash() { + return ledgerHash; + } + + @Override + public TransactionRequestBuilder prepareRequest() { + TransactionContent txContent = prepareContent(); + return new TxRequestBuilder(txContent); + } + + @Override + public TransactionContent prepareContent() { + TxContentBlob txContent = new TxContentBlob(ledgerHash); + txContent.addOperations(opFactory.getOperations()); + txContent.setTxOpTime(System.currentTimeMillis()); + + byte[] contentBodyBytes = BinaryEncodingUtils.encode(txContent, TransactionContentBody.class); + HashDigest contentHash = CryptoUtils.hash(defaultHashAlgorithm).hash(contentBodyBytes); + txContent.setHash(contentHash); + + return txContent; + } + + @Override + public LedgerInitOperationBuilder ledgers() { + return opFactory.ledgers(); + } + + @Override + public UserRegisterOperationBuilder users() { + return opFactory.users(); + } + + @Override + public DataAccountRegisterOperationBuilder dataAccounts() { + return opFactory.dataAccounts(); + } + + @Override + public DataAccountKVSetOperationBuilder dataAccount(String accountAddress) { + return opFactory.dataAccount(accountAddress); + } + + @Override + public DataAccountKVSetOperationBuilder dataAccount(Bytes accountAddress) { + return opFactory.dataAccount(accountAddress); + } + + @Override + public ContractCodeDeployOperationBuilder contracts() { + return opFactory.contracts(); + } + + @Override + public ContractEventSendOperationBuilder contractEvents() { + return opFactory.contractEvents(); + } + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/data/TxContentBlob.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/data/TxContentBlob.java index d669951f..8ee55cfa 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/data/TxContentBlob.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/data/TxContentBlob.java @@ -1,92 +1,104 @@ -package com.jd.blockchain.ledger.data; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import com.jd.blockchain.binaryproto.DConstructor; -import com.jd.blockchain.binaryproto.FieldSetter; -import com.jd.blockchain.crypto.hash.HashDigest; -import com.jd.blockchain.ledger.Operation; -import com.jd.blockchain.ledger.TransactionContent; -import com.jd.blockchain.utils.io.NumberMask; - -/** - * 交易内容的数据块; - *

- * - * 包含原始交易请求的数据块; - * - * @author huanghaiquan - * - */ -public class TxContentBlob implements TransactionContent { - - /** - * 操作数量的最大值; - */ - public static final int MAX_OP_COUNT = NumberMask.SHORT.MAX_BOUNDARY_SIZE; - - private List operationList = new ArrayList(); - - private HashDigest hash; - - private HashDigest ledgerHash; - - @DConstructor(name ="TxContentBlob") - public TxContentBlob(@FieldSetter(name="getLedgerHash", type="HashDigest") HashDigest ledgerHash) { - this.ledgerHash = ledgerHash; - } - - /** - * 交易内容的哈希值; - */ - @Override - public HashDigest getHash() { - return this.hash; - } - - /** - * 更新交易内容的哈希值; - *

- * 注:当前对象只充当值对象,不校验指定哈希值的完整性,调用者应该在外部实施完整性校验; - * @param hash - */ - public void setHash(HashDigest hash) { - this.hash = hash; - } - - /** - * 交易请求链的hash - * - * @return - */ - @Override - public HashDigest getLedgerHash() { - return ledgerHash; - } - public void setLedgerHash(HashDigest ledgerHash) { - this.ledgerHash = ledgerHash; - } - - @Override - public Operation[] getOperations() { - return operationList.toArray(new Operation[operationList.size()]); - } - - public void setOperations(Object[] operations) { - //in array's case ,cast will failed! - for (Object operation : operations) { - Operation op = (Operation)operation; - addOperation(op); - } - } - - public void addOperation(Operation operation) { - operationList.add(operation); - } - - public void addOperations(Collection operations) { - operationList.addAll(operations); - } -} +package com.jd.blockchain.ledger.data; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.jd.blockchain.binaryproto.DConstructor; +import com.jd.blockchain.binaryproto.FieldSetter; +import com.jd.blockchain.crypto.hash.HashDigest; +import com.jd.blockchain.ledger.Operation; +import com.jd.blockchain.ledger.TransactionContent; +import com.jd.blockchain.utils.io.NumberMask; + +/** + * 交易内容的数据块; + *

+ * + * 包含原始交易请求的数据块; + * + * @author huanghaiquan + * + */ +public class TxContentBlob implements TransactionContent { + + /** + * 操作数量的最大值; + */ + public static final int MAX_OP_COUNT = NumberMask.SHORT.MAX_BOUNDARY_SIZE; + + private List operationList = new ArrayList(); + + private HashDigest hash; + + private HashDigest ledgerHash; + + //交易操作时间; + private Long txOpTime; + + @DConstructor(name ="TxContentBlob") + public TxContentBlob(@FieldSetter(name="getLedgerHash", type="HashDigest") HashDigest ledgerHash) { + this.ledgerHash = ledgerHash; + } + + /** + * 交易内容的哈希值; + */ + @Override + public HashDigest getHash() { + return this.hash; + } + + /** + * 更新交易内容的哈希值; + *

+ * 注:当前对象只充当值对象,不校验指定哈希值的完整性,调用者应该在外部实施完整性校验; + * @param hash + */ + public void setHash(HashDigest hash) { + this.hash = hash; + } + + /** + * 交易请求链的hash + * + * @return + */ + @Override + public HashDigest getLedgerHash() { + return ledgerHash; + } + public void setLedgerHash(HashDigest ledgerHash) { + this.ledgerHash = ledgerHash; + } + + @Override + public Operation[] getOperations() { + return operationList.toArray(new Operation[operationList.size()]); + } + + public void setOperations(Object[] operations) { + //in array's case ,cast will failed! + for (Object operation : operations) { + Operation op = (Operation)operation; + addOperation(op); + } + } + + public void addOperation(Operation operation) { + operationList.add(operation); + } + + public void addOperations(Collection operations) { + operationList.addAll(operations); + } + + @Override + public Long getTxOpTime() { + return txOpTime; + } + + public void setTxOpTime(Long txOpTime) { + this.txOpTime = txOpTime; + } +} diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java index 79b9e189..22aa9b1e 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java @@ -139,7 +139,7 @@ public class IntegrationTest4Bftsmart { } try { - Thread.sleep(60000); + Thread.sleep(60000000); } catch (InterruptedException e) { e.printStackTrace(); }