From 48e0f09f741598364ca59e42a8906220aa6a1487 Mon Sep 17 00:00:00 2001 From: shaozhuguang Date: Wed, 11 Sep 2019 14:45:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=BF=E7=A8=8B=E9=98=BB?= =?UTF-8?q?=E5=A1=9E=EF=BC=8C=E5=A4=84=E7=90=86=E5=86=B3=E5=AE=9A=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E4=B8=BANULL=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handles/ContractCodeDeployOperationHandle.java | 13 ++------ .../web/LedgerInitializeWebController.java | 39 ++++++++++++++++------ 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ContractCodeDeployOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ContractCodeDeployOperationHandle.java index 3f64e4b8..b4e1cac3 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ContractCodeDeployOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ContractCodeDeployOperationHandle.java @@ -1,15 +1,9 @@ package com.jd.blockchain.ledger.core.handles; +import com.jd.blockchain.contract.ContractJarUtils; import com.jd.blockchain.ledger.ContractCodeDeployOperation; import com.jd.blockchain.ledger.LedgerPermission; -import com.jd.blockchain.ledger.core.LedgerDataQuery; -import com.jd.blockchain.ledger.core.LedgerDataset; -import com.jd.blockchain.ledger.core.LedgerService; -import com.jd.blockchain.ledger.core.MultiIDsPolicy; -import com.jd.blockchain.ledger.core.OperationHandleContext; -import com.jd.blockchain.ledger.core.SecurityContext; -import com.jd.blockchain.ledger.core.SecurityPolicy; -import com.jd.blockchain.ledger.core.TransactionRequestExtension; +import com.jd.blockchain.ledger.core.*; public class ContractCodeDeployOperationHandle extends AbstractLedgerOperationHandle { @@ -19,11 +13,10 @@ public class ContractCodeDeployOperationHandle extends AbstractLedgerOperationHa @Override protected void doProcess(ContractCodeDeployOperation op, LedgerDataset newBlockDataset, - TransactionRequestExtension requestContext, LedgerDataQuery previousBlockDataset, - OperationHandleContext handleContext, LedgerService ledgerService) { TransactionRequestExtension requestContext, LedgerQuery ledger, OperationHandleContext handleContext) { + // TODO: 请求者应该提供合约账户的公钥签名,以确保注册人对注册的地址和公钥具有合法的使用权; // 权限校验; diff --git a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java index 87ffc108..0d4216ea 100644 --- a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java +++ b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; @@ -60,6 +61,12 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI private static final String DEFAULT_SIGN_ALGORITHM = "ED25519"; + /** + * 决定值列表并发处理,必须等待Local释放 + * + */ + private final CountDownLatch decisionsCountDownLatch = new CountDownLatch(1); + private final SignatureFunction SIGN_FUNC; private volatile LedgerInitConfiguration ledgerInitConfig; @@ -190,18 +197,25 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI } public LedgerInitDecision makeLocalDecision(PrivKey privKey) { - // 生成账本; - initializer.prepareLedger(dbConn.getStorageService(), getNodesSignatures()); - - // 生成签名决定; - this.localDecision = makeDecision(currentId, initializer.getLedgerHash(), privKey); - this.decisions = new DecisionResultHandle[ledgerInitConfig.getParticipantCount()]; - for (int i = 0; i < decisions.length; i++) { - // 参与者的 id 是依次递增的; - this.decisions[i] = new DecisionResultHandle(i); + + try { + // 生成账本; + initializer.prepareLedger(dbConn.getStorageService(), getNodesSignatures()); + + // 生成签名决定; + this.localDecision = makeDecision(currentId, initializer.getLedgerHash(), privKey); + this.decisions = new DecisionResultHandle[ledgerInitConfig.getParticipantCount()]; + for (int i = 0; i < decisions.length; i++) { + // 参与者的 id 是依次递增的; + this.decisions[i] = new DecisionResultHandle(i); + } + // 预置当前参与方的“决定”到列表,避免向自己发起请求; + this.decisions[currentId].setValue(localDecision); + } finally { + // 释放,以便于其他节点接收 + this.decisionsCountDownLatch.countDown(); } - // 预置当前参与方的“决定”到列表,避免向自己发起请求; - this.decisions[currentId].setValue(localDecision); + return localDecision; } @@ -678,6 +692,9 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI try { + // 必须等待本地处理完成,此处线程阻塞 + this.decisionsCountDownLatch.await(); + DecisionResultHandle resultHandle = this.decisions[remoteId]; if (!validateAndRecordDecision(initDecision, resultHandle)) { // 签名无效;