Browse Source

增加线程阻塞,处理决定结果为NULL的问题

tags/1.1.0
shaozhuguang 5 years ago
parent
commit
48e0f09f74
2 changed files with 31 additions and 21 deletions
  1. +3
    -10
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ContractCodeDeployOperationHandle.java
  2. +28
    -11
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java

+ 3
- 10
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ContractCodeDeployOperationHandle.java View File

@@ -1,15 +1,9 @@
package com.jd.blockchain.ledger.core.handles; package com.jd.blockchain.ledger.core.handles;


import com.jd.blockchain.contract.ContractJarUtils;
import com.jd.blockchain.ledger.ContractCodeDeployOperation; import com.jd.blockchain.ledger.ContractCodeDeployOperation;
import com.jd.blockchain.ledger.LedgerPermission; 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<ContractCodeDeployOperation> { public class ContractCodeDeployOperationHandle extends AbstractLedgerOperationHandle<ContractCodeDeployOperation> {


@@ -19,11 +13,10 @@ public class ContractCodeDeployOperationHandle extends AbstractLedgerOperationHa


@Override @Override
protected void doProcess(ContractCodeDeployOperation op, LedgerDataset newBlockDataset, protected void doProcess(ContractCodeDeployOperation op, LedgerDataset newBlockDataset,
TransactionRequestExtension requestContext, LedgerDataQuery previousBlockDataset,
OperationHandleContext handleContext, LedgerService ledgerService) {
TransactionRequestExtension requestContext, LedgerQuery ledger, TransactionRequestExtension requestContext, LedgerQuery ledger,
OperationHandleContext handleContext) { OperationHandleContext handleContext) {



// TODO: 请求者应该提供合约账户的公钥签名,以确保注册人对注册的地址和公钥具有合法的使用权; // TODO: 请求者应该提供合约账户的公钥签名,以确保注册人对注册的地址和公钥具有合法的使用权;


// 权限校验; // 权限校验;


+ 28
- 11
source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java View File

@@ -6,6 +6,7 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;


import org.springframework.beans.factory.annotation.Autowired; 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"; private static final String DEFAULT_SIGN_ALGORITHM = "ED25519";


/**
* 决定值列表并发处理,必须等待Local释放
*
*/
private final CountDownLatch decisionsCountDownLatch = new CountDownLatch(1);

private final SignatureFunction SIGN_FUNC; private final SignatureFunction SIGN_FUNC;


private volatile LedgerInitConfiguration ledgerInitConfig; private volatile LedgerInitConfiguration ledgerInitConfig;
@@ -190,18 +197,25 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
} }


public LedgerInitDecision makeLocalDecision(PrivKey privKey) { 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; return localDecision;
} }


@@ -678,6 +692,9 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI


try { try {


// 必须等待本地处理完成,此处线程阻塞
this.decisionsCountDownLatch.await();

DecisionResultHandle resultHandle = this.decisions[remoteId]; DecisionResultHandle resultHandle = this.decisions[remoteId];
if (!validateAndRecordDecision(initDecision, resultHandle)) { if (!validateAndRecordDecision(initDecision, resultHandle)) {
// 签名无效; // 签名无效;


Loading…
Cancel
Save