diff --git a/sdk-core/src/main/java/org/fisco/bcos/sdk/model/TransactionReceipt.java b/sdk-core/src/main/java/org/fisco/bcos/sdk/model/TransactionReceipt.java index 285e15e8b..ba89be845 100644 --- a/sdk-core/src/main/java/org/fisco/bcos/sdk/model/TransactionReceipt.java +++ b/sdk-core/src/main/java/org/fisco/bcos/sdk/model/TransactionReceipt.java @@ -193,7 +193,7 @@ public void setGasUsed(String gasUsed) { } public String getContractAddress() { - if (!isWasm() && Objects.nonNull(contractAddress)) { + if (!isWasm() && Objects.nonNull(contractAddress) && !contractAddress.isEmpty()) { return "0x" + contractAddress; } diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/manager/AuthManager.java b/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/manager/AuthManager.java deleted file mode 100644 index 217971e3a..000000000 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/manager/AuthManager.java +++ /dev/null @@ -1,246 +0,0 @@ -package org.fisco.bcos.sdk.auth.manager; - -import java.io.IOException; -import java.math.BigInteger; -import java.util.List; -import org.fisco.bcos.sdk.auth.contracts.Committee; -import org.fisco.bcos.sdk.auth.contracts.CommitteeManager; -import org.fisco.bcos.sdk.auth.contracts.ContractAuthPrecompiled; -import org.fisco.bcos.sdk.auth.contracts.ProposalManager; -import org.fisco.bcos.sdk.auth.po.CommitteeInfo; -import org.fisco.bcos.sdk.auth.po.ProposalInfo; -import org.fisco.bcos.sdk.client.Client; -import org.fisco.bcos.sdk.codec.ABICodecException; -import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair; -import org.fisco.bcos.sdk.model.TransactionReceipt; -import org.fisco.bcos.sdk.transaction.codec.decode.TransactionDecoderInterface; -import org.fisco.bcos.sdk.transaction.codec.decode.TransactionDecoderService; -import org.fisco.bcos.sdk.transaction.model.dto.TransactionResponse; -import org.fisco.bcos.sdk.transaction.model.exception.ContractException; -import org.fisco.bcos.sdk.transaction.model.exception.TransactionException; - -public class AuthManager { - - private String committeeManagerAddress; - private CommitteeManager committeeManager; - private Client client; - private CryptoKeyPair credential; - private TransactionDecoderInterface decoder; - // default blocknumber interval. after current block number, it will be outdated. Default value - // is about a week. - private BigInteger DEFAULT_BLOCKNUMBER_INTERVAL = BigInteger.valueOf(3600 * 24 * 7); - - public AuthManager(String committeeManagerAddress, Client client, CryptoKeyPair credential) { - this.committeeManagerAddress = committeeManagerAddress; - this.committeeManager = CommitteeManager.load(committeeManagerAddress, client, credential); - this.decoder = new TransactionDecoderService(client.getCryptoSuite(), client.isWASM()); - } - - public AuthManager( - String committeeManagerAddress, - Client client, - CryptoKeyPair credential, - BigInteger blockNumberInterval) { - this(committeeManagerAddress, client, credential); - this.DEFAULT_BLOCKNUMBER_INTERVAL = blockNumberInterval; - } - - public String getCommitteeAddress() throws ContractException { - return committeeManager._committee(); - } - - public String getProposalManagerAddress() throws ContractException { - return committeeManager._proposalMgr(); - } - - public String getContractAuthPrecompiledAddress() throws ContractException { - return committeeManager._contractPrecompiled(); - } - - public BigInteger updateGovernor(String account, BigInteger weight) - throws ABICodecException, TransactionException, IOException { - TransactionReceipt tr = createUpdateGovernorProposal(account, weight); - TransactionResponse transactionResponse = - decoder.decodeReceiptWithValues( - CommitteeManager.getABI(), - CommitteeManager.FUNC_CREATEUPDATEGOVERNORPROPOSAL, - tr); - return voteProposal(transactionResponse); - } - - public BigInteger setRate(BigInteger participatesRate, BigInteger winRate) - throws ABICodecException, TransactionException, IOException { - TransactionReceipt tr = createSetRateProposal(participatesRate, winRate); - TransactionResponse transactionResponse = - decoder.decodeReceiptWithValues( - CommitteeManager.getABI(), CommitteeManager.FUNC_CREATESETRATEPROPOSAL, tr); - return voteProposal(transactionResponse); - } - - public BigInteger setDeployAuthType(BigInteger deployAuthType) - throws ABICodecException, TransactionException, IOException { - TransactionReceipt tr = createSetDeployAuthTypeProposal(deployAuthType); - TransactionResponse transactionResponse = - decoder.decodeReceiptWithValues( - CommitteeManager.getABI(), - CommitteeManager.FUNC_CREATESETDEPLOYAUTHTYPEPROPOSAL, - tr); - return voteProposal(transactionResponse); - } - - public BigInteger modifyDeployAuth(String account, Boolean openFlag) - throws ABICodecException, TransactionException, IOException { - TransactionReceipt tr = createModifyDeployAuthProposal(account, openFlag); - TransactionResponse transactionResponse = - decoder.decodeReceiptWithValues( - CommitteeManager.getABI(), - CommitteeManager.FUNC_CREATEMODIFYDEPLOYAUTHPROPOSAL, - tr); - return voteProposal(transactionResponse); - } - - public BigInteger resetAdmin(String newAdmin, String contractAddr) - throws ABICodecException, TransactionException, IOException { - TransactionReceipt tr = createResetAdminProposal(newAdmin, contractAddr); - TransactionResponse transactionResponse = - decoder.decodeReceiptWithValues( - CommitteeManager.getABI(), - CommitteeManager.FUNC_CREATEMODIFYDEPLOYAUTHPROPOSAL, - tr); - return voteProposal(transactionResponse); - } - - /* - * apply for update governor - * @param external account - * @param weight, 0-delete, >0-update or insert - */ - public TransactionReceipt createUpdateGovernorProposal(String account, BigInteger weight) { - return committeeManager.createUpdateGovernorProposal( - account, weight, DEFAULT_BLOCKNUMBER_INTERVAL); - } - - /* - * apply set participate rate and win rate. - * @param paricipate rate, [0,100]. if 0, always succeed. - * @param win rate, [0,100]. - */ - public TransactionReceipt createSetRateProposal( - BigInteger participatesRate, BigInteger winRate) { - return committeeManager.createSetRateProposal( - participatesRate, winRate, DEFAULT_BLOCKNUMBER_INTERVAL); - } - - /* - * submit an proposal of setting deploy contract auth type - * @param deployAuthType: 1- whitelist; 2-blacklist - */ - public TransactionReceipt createSetDeployAuthTypeProposal(BigInteger deployAuthType) { - return committeeManager.createSetDeployAuthTypeProposal( - deployAuthType, DEFAULT_BLOCKNUMBER_INTERVAL); - } - - /* - * submit an proposal of adding deploy contract auth for account - * @param account - * @param openFlag: true-open; false-close - */ - public TransactionReceipt createModifyDeployAuthProposal(String account, Boolean openFlag) { - return committeeManager.createModifyDeployAuthProposal( - account, openFlag, DEFAULT_BLOCKNUMBER_INTERVAL); - } - - /* - * submit an propsal of resetting contract admin - * @param newAdmin - * @param contractAddr the address of contract which will propose to reset admin - */ - public TransactionReceipt createResetAdminProposal(String newAdmin, String contractAddr) { - return committeeManager.createResetAdminProposal( - newAdmin, contractAddr, DEFAULT_BLOCKNUMBER_INTERVAL); - } - - /* - * revoke proposal - * @param proposal id - */ - public TransactionReceipt revokeProposal(BigInteger proposalId) { - return committeeManager.revokeProposal(proposalId); - } - - /* - * unified vote - * @param proposal id - * @param true or false - */ - public TransactionReceipt voteProposal(BigInteger proposalId, Boolean agree) { - return committeeManager.voteProposal(proposalId, agree); - } - - public BigInteger voteProposal(TransactionResponse transactionResponse) - throws TransactionException { - if (transactionResponse == null) { - throw new TransactionException("Decode transaction response error"); - } - List valuesList = transactionResponse.getValuesList(); - if (valuesList == null || valuesList.size() == 0) { - throw new TransactionException("Decode transaction response error"); - } - BigInteger proposalId = BigInteger.valueOf((long) valuesList.get(0)); - voteProposal(proposalId, true); - return proposalId; - } - - /* - * get proposal info - * @param proposal id - * @result - * id, - * proposer, - * proposalType, - * blockNumberInterval, - * status, - * address[] agreeVoters, - * address[] againstVoters - */ - public ProposalInfo getProposalInfo(BigInteger proposalId) throws ContractException { - ProposalManager proposalManager = - ProposalManager.load(getProposalManagerAddress(), client, credential); - return new ProposalInfo().fromTuple(proposalManager.getProposalInfo(proposalId)); - } - - public CommitteeInfo getCommitteeInfo() throws ContractException { - Committee committee = Committee.load(getCommitteeAddress(), client, credential); - return new CommitteeInfo().fromTuple(committee.getCommitteeInfo()); - } - - public String getCommitteeManagerAddress() { - return committeeManagerAddress; - } - - public void setCommitteeManagerAddress(String committeeManagerAddress) { - this.committeeManagerAddress = committeeManagerAddress; - } - - public Boolean hasDeployAuth(String account) throws ContractException { - ContractAuthPrecompiled contractAuthPrecompiled = - ContractAuthPrecompiled.load( - getContractAuthPrecompiledAddress(), client, credential); - return contractAuthPrecompiled.hasDeployAuth(account); - } - - public Boolean checkMethodAuth(String contractAddr, byte[] func, String account) - throws ContractException { - ContractAuthPrecompiled contractAuthPrecompiled = - ContractAuthPrecompiled.load( - getContractAuthPrecompiledAddress(), client, credential); - return contractAuthPrecompiled.checkMethodAuth(contractAddr, func, account); - } - - public String getAdmin(String contractAddress) throws ContractException { - ContractAuthPrecompiled contractAuthPrecompiled = - ContractAuthPrecompiled.load( - getContractAuthPrecompiledAddress(), client, credential); - return contractAuthPrecompiled.getAdmin(contractAddress); - } -} diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/po/CommitteeInfo.java b/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/po/CommitteeInfo.java deleted file mode 100644 index 51dc7f6d1..000000000 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/po/CommitteeInfo.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.fisco.bcos.sdk.auth.po; - -import java.math.BigInteger; -import java.util.List; -import org.fisco.bcos.sdk.codec.datatypes.generated.tuples.generated.Tuple4; - -public class CommitteeInfo { - private List governorList; - private List weightList; - private int participatesRate; - private int winRate; - - public CommitteeInfo fromTuple( - Tuple4, List> tuple) { - this.governorList = tuple.getValue3(); - this.weightList = tuple.getValue4(); - this.participatesRate = tuple.getValue1().intValue(); - this.winRate = tuple.getValue2().intValue(); - return this; - } - - public List getGovernorList() { - return governorList; - } - - public void setGovernorList(List governorList) { - this.governorList = governorList; - } - - public List getWeightList() { - return weightList; - } - - public void setWeightList(List weightList) { - this.weightList = weightList; - } - - public int getParticipatesRate() { - return participatesRate; - } - - public void setParticipatesRate(int participatesRate) { - this.participatesRate = participatesRate; - } - - public int getWinRate() { - return winRate; - } - - public void setWinRate(int winRate) { - this.winRate = winRate; - } -} diff --git a/sdk-service/src/test/java/org/fisco/bcos/sdk/test/client/ResponseTest.java b/sdk-service/src/test/java/org/fisco/bcos/sdk/test/client/ResponseTest.java index ba50aff25..8c8464685 100644 --- a/sdk-service/src/test/java/org/fisco/bcos/sdk/test/client/ResponseTest.java +++ b/sdk-service/src/test/java/org/fisco/bcos/sdk/test/client/ResponseTest.java @@ -735,7 +735,7 @@ public void testTransactionReceipt() throws JsonProcessingException { + " \"result\": {\n" + " \"blockHash\": \"0x977efec48c248ea4be87016446b40d7785d7b71b7d4e3aa0b103b9cf0f5fe19e\",\n" + " \"blockNumber\": \"0xa\",\n" - + " \"contractAddress\": \"0x0000000000000000000000000000000000000000\",\n" + + " \"contractAddress\": \"0000000000000000000000000000000000000000\",\n" + " \"from\": \"0xcdcce60801c0a2e6bb534322c32ae528b9dec8d2\",\n" + " \"gasUsed\": \"0x1fb8d\",\n" + " \"input\": \"0xb602109a000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000203078313030303030303030303030303030303030303030303030303030303030000000000000000000000000000000000000000000000000000000000000000832303139303733300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002616100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026262000000000000000000000000000000000000000000000000000000000000\",\n" @@ -822,7 +822,7 @@ public void testTransactionReceiptWithProof() throws JsonProcessingException { + " ],\n" + " \"blockHash\": \"0xcd31b05e466bce99460b1ed70d6069fdfbb15e6eef84e9b9e4534358edb3899a\",\n" + " \"blockNumber\": \"0x5\",\n" - + " \"contractAddress\": \"0x0000000000000000000000000000000000000000\",\n" + + " \"contractAddress\": \"0000000000000000000000000000000000000000\",\n" + " \"from\": \"0x148947262ec5e21739fe3a931c29e8b84ee34a0f\",\n" + " \"gasUsed\": \"0x21dc1b\",\n" + " \"input\": \"0x8a42ebe90000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000000000a3564646636663863653800000000000000000000000000000000000000000000\",\n" diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/Committee.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/Committee.java similarity index 99% rename from sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/Committee.java rename to sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/Committee.java index f9e23ad70..3f202428b 100644 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/Committee.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/Committee.java @@ -1,4 +1,4 @@ -package org.fisco.bcos.sdk.auth.contracts; +package org.fisco.bcos.sdk.contract.auth.contracts; import java.math.BigInteger; import java.util.Arrays; diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/CommitteeManager.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/CommitteeManager.java similarity index 99% rename from sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/CommitteeManager.java rename to sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/CommitteeManager.java index df03e74e8..8d4d7abbb 100644 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/CommitteeManager.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/CommitteeManager.java @@ -1,4 +1,4 @@ -package org.fisco.bcos.sdk.auth.contracts; +package org.fisco.bcos.sdk.contract.auth.contracts; import java.math.BigInteger; import java.util.Arrays; @@ -106,15 +106,6 @@ public String _committee() throws ContractException { return executeCallWithSingleValueReturn(function, String.class); } - public String _contractPrecompiled() throws ContractException { - final Function function = - new Function( - FUNC__CONTRACTPRECOMPILED, - Arrays.asList(), - Arrays.>asList(new TypeReference
() {})); - return executeCallWithSingleValueReturn(function, String.class); - } - public String _proposalMgr() throws ContractException { final Function function = new Function( diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/ContractAuthPrecompiled.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/ContractAuthPrecompiled.java similarity index 99% rename from sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/ContractAuthPrecompiled.java rename to sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/ContractAuthPrecompiled.java index f6f41a9bf..7d797c2a8 100644 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/ContractAuthPrecompiled.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/ContractAuthPrecompiled.java @@ -1,4 +1,4 @@ -package org.fisco.bcos.sdk.auth.contracts; +package org.fisco.bcos.sdk.contract.auth.contracts; import java.math.BigInteger; import java.util.Arrays; diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/ContractInterceptor.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/ContractInterceptor.java similarity index 99% rename from sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/ContractInterceptor.java rename to sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/ContractInterceptor.java index 2bfd2e7b3..97d1e6038 100644 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/ContractInterceptor.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/ContractInterceptor.java @@ -1,4 +1,4 @@ -package org.fisco.bcos.sdk.auth.contracts; +package org.fisco.bcos.sdk.contract.auth.contracts; import java.util.Arrays; import org.fisco.bcos.sdk.client.Client; diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/DeployAuthManager.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/DeployAuthManager.java similarity index 99% rename from sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/DeployAuthManager.java rename to sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/DeployAuthManager.java index 90b15333e..9e4b79550 100644 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/DeployAuthManager.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/DeployAuthManager.java @@ -1,4 +1,4 @@ -package org.fisco.bcos.sdk.auth.contracts; +package org.fisco.bcos.sdk.contract.auth.contracts; import java.math.BigInteger; import java.util.Arrays; diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/MethodAuthManager.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/MethodAuthManager.java similarity index 99% rename from sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/MethodAuthManager.java rename to sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/MethodAuthManager.java index a5674d5eb..6bb11ddd0 100644 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/MethodAuthManager.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/MethodAuthManager.java @@ -1,4 +1,4 @@ -package org.fisco.bcos.sdk.auth.contracts; +package org.fisco.bcos.sdk.contract.auth.contracts; import java.math.BigInteger; import java.util.Arrays; diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/ProposalManager.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/ProposalManager.java similarity index 99% rename from sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/ProposalManager.java rename to sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/ProposalManager.java index 9ddf1a073..4634a637d 100644 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/contracts/ProposalManager.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/contracts/ProposalManager.java @@ -1,4 +1,4 @@ -package org.fisco.bcos.sdk.auth.contracts; +package org.fisco.bcos.sdk.contract.auth.contracts; import java.math.BigInteger; import java.util.Arrays; diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/manager/AuthManager.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/manager/AuthManager.java new file mode 100644 index 000000000..3595f89ea --- /dev/null +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/manager/AuthManager.java @@ -0,0 +1,301 @@ +package org.fisco.bcos.sdk.contract.auth.manager; + +import java.io.IOException; +import java.math.BigInteger; +import java.util.List; +import org.fisco.bcos.sdk.client.Client; +import org.fisco.bcos.sdk.codec.ABICodecException; +import org.fisco.bcos.sdk.codec.datatypes.NumericType; +import org.fisco.bcos.sdk.codec.datatypes.Type; +import org.fisco.bcos.sdk.contract.auth.contracts.Committee; +import org.fisco.bcos.sdk.contract.auth.contracts.CommitteeManager; +import org.fisco.bcos.sdk.contract.auth.contracts.ContractAuthPrecompiled; +import org.fisco.bcos.sdk.contract.auth.contracts.ProposalManager; +import org.fisco.bcos.sdk.contract.auth.po.AuthType; +import org.fisco.bcos.sdk.contract.auth.po.CommitteeInfo; +import org.fisco.bcos.sdk.contract.auth.po.ProposalInfo; +import org.fisco.bcos.sdk.contract.precompiled.model.PrecompiledAddress; +import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair; +import org.fisco.bcos.sdk.model.TransactionReceipt; +import org.fisco.bcos.sdk.transaction.codec.decode.TransactionDecoderInterface; +import org.fisco.bcos.sdk.transaction.codec.decode.TransactionDecoderService; +import org.fisco.bcos.sdk.transaction.model.dto.TransactionResponse; +import org.fisco.bcos.sdk.transaction.model.exception.ContractException; +import org.fisco.bcos.sdk.transaction.model.exception.TransactionException; + +public class AuthManager { + + private final CommitteeManager committeeManager; + private final ProposalManager proposalManager; + private final Committee committee; + private final ContractAuthPrecompiled contractAuthPrecompiled; + private final TransactionDecoderInterface decoder; + // default block number interval. after current block number, it will be outdated. Default value + // is about a week. + private BigInteger DEFAULT_BLOCK_NUMBER_INTERVAL = BigInteger.valueOf(3600 * 24 * 7); + + public AuthManager(Client client, CryptoKeyPair credential) throws ContractException { + this.committeeManager = + CommitteeManager.load( + PrecompiledAddress.COMMITTEE_MANAGER_ADDRESS, client, credential); + this.committee = Committee.load(getCommitteeAddress(), client, credential); + this.proposalManager = + ProposalManager.load(getProposalManagerAddress(), client, credential); + this.contractAuthPrecompiled = + ContractAuthPrecompiled.load( + PrecompiledAddress.CONTRACT_AUTH_ADDRESS, client, credential); + this.decoder = new TransactionDecoderService(client.getCryptoSuite(), client.isWASM()); + } + + public AuthManager(Client client, CryptoKeyPair credential, BigInteger blockNumberInterval) + throws ContractException { + this(client, credential); + this.DEFAULT_BLOCK_NUMBER_INTERVAL = blockNumberInterval; + } + + public String getCommitteeAddress() throws ContractException { + return committeeManager._committee(); + } + + public String getProposalManagerAddress() throws ContractException { + return committeeManager._proposalMgr(); + } + + /** + * apply for update governor, only governor can call it + * + * @param account new governor address + * @param weight, 0-delete, >0-update or insert + * @return proposalId + */ + public BigInteger updateGovernor(String account, BigInteger weight) + throws ABICodecException, TransactionException, IOException { + TransactionReceipt tr = + committeeManager.createUpdateGovernorProposal( + account, weight, DEFAULT_BLOCK_NUMBER_INTERVAL); + TransactionResponse transactionResponse = + decoder.decodeReceiptWithValues( + CommitteeManager.getABI(), + CommitteeManager.FUNC_CREATEUPDATEGOVERNORPROPOSAL, + tr); + return getProposal(transactionResponse); + } + + /** + * apply set participate rate and win rate. only governor can call it + * + * @param participatesRate, [0,100]. if 0, always succeed. + * @param winRate, [0,100]. + * @return proposalId + */ + public BigInteger setRate(BigInteger participatesRate, BigInteger winRate) + throws ABICodecException, TransactionException, IOException { + TransactionReceipt tr = + committeeManager.createSetRateProposal( + participatesRate, winRate, DEFAULT_BLOCK_NUMBER_INTERVAL); + TransactionResponse transactionResponse = + decoder.decodeReceiptWithValues( + CommitteeManager.getABI(), CommitteeManager.FUNC_CREATESETRATEPROPOSAL, tr); + return getProposal(transactionResponse); + } + + /** + * submit a proposal of setting deploy contract auth type, only governor can call it + * + * @param deployAuthType: 1-whitelist; 2-blacklist + * @return proposalId + */ + public BigInteger setDeployAuthType(AuthType deployAuthType) + throws ABICodecException, TransactionException, IOException { + TransactionReceipt tr = + committeeManager.createSetDeployAuthTypeProposal( + deployAuthType.getValue(), DEFAULT_BLOCK_NUMBER_INTERVAL); + TransactionResponse transactionResponse = + decoder.decodeReceiptWithValues( + CommitteeManager.getABI(), + CommitteeManager.FUNC_CREATESETDEPLOYAUTHTYPEPROPOSAL, + tr); + return getProposal(transactionResponse); + } + + /** + * get global deploy auth type + * + * @return deployAuthType + */ + public BigInteger getDeployAuthType() throws ContractException { + return this.contractAuthPrecompiled.deployType(); + } + + /** + * submit a proposal of adding deploy contract auth for account, only governor can call it + * + * @param account account address string + * @param openFlag: true-open; false-close + * @return proposalId + */ + public BigInteger modifyDeployAuth(String account, Boolean openFlag) + throws ABICodecException, TransactionException, IOException { + TransactionReceipt tr = + committeeManager.createModifyDeployAuthProposal( + account, openFlag, DEFAULT_BLOCK_NUMBER_INTERVAL); + TransactionResponse transactionResponse = + decoder.decodeReceiptWithValues( + CommitteeManager.getABI(), + CommitteeManager.FUNC_CREATEMODIFYDEPLOYAUTHPROPOSAL, + tr); + return getProposal(transactionResponse); + } + + /** + * submit a proposal of resetting contract admin, only governor can call it + * + * @param newAdmin admin address + * @param contractAddr the address of contract which will propose to reset admin + * @return proposalId + */ + public BigInteger resetAdmin(String newAdmin, String contractAddr) + throws ABICodecException, TransactionException, IOException { + TransactionReceipt tr = + committeeManager.createResetAdminProposal( + newAdmin, contractAddr, DEFAULT_BLOCK_NUMBER_INTERVAL); + TransactionResponse transactionResponse = + decoder.decodeReceiptWithValues( + CommitteeManager.getABI(), + CommitteeManager.FUNC_CREATEMODIFYDEPLOYAUTHPROPOSAL, + tr); + return getProposal(transactionResponse); + } + + /** + * revoke proposal, only governor can call it + * + * @param proposalId id + */ + public TransactionReceipt revokeProposal(BigInteger proposalId) { + return committeeManager.revokeProposal(proposalId); + } + + /** + * unified vote, only governor can call it + * + * @param proposalId id + * @param agree true or false + */ + public TransactionReceipt voteProposal(BigInteger proposalId, Boolean agree) { + return committeeManager.voteProposal(proposalId, agree); + } + + /** + * getProposal return value in transactionResponse + * + * @param transactionResponse which get proposal from + * @return proposal id + */ + public BigInteger getProposal(TransactionResponse transactionResponse) + throws TransactionException { + if (transactionResponse == null) { + throw new TransactionException("Decode transaction response error"); + } + if (transactionResponse.getTransactionReceipt().getStatus() != 0) { + throw new TransactionException( + transactionResponse.getReceiptMessages(), + transactionResponse.getTransactionReceipt().getStatus()); + } + List valuesList = transactionResponse.getResults(); + if (valuesList == null || valuesList.isEmpty()) { + throw new TransactionException("Decode transaction response error"); + } + NumericType value = (NumericType) valuesList.get(0); + return value.getValue(); + } + + /** + * get proposal info + * + * @param proposalId proposal id + * @return return ProposalInfo {id, proposer, proposalType, blockNumberInterval, status, + * address[] agreeVoters, address[] againstVoters } + */ + public ProposalInfo getProposalInfo(BigInteger proposalId) throws ContractException { + return new ProposalInfo().fromTuple(proposalManager.getProposalInfo(proposalId)); + } + + /** + * get Committee info + * + * @return CommitteeInfo + */ + public CommitteeInfo getCommitteeInfo() throws ContractException { + return new CommitteeInfo().fromTuple(committee.getCommitteeInfo()); + } + + /** + * check the account whether this account can deploy contract + * + * @param account the account to check + * @return true or false + */ + public Boolean hasDeployAuth(String account) throws ContractException { + return contractAuthPrecompiled.hasDeployAuth(account); + } + + /** + * check the contract interface func whether this account can call + * + * @param contractAddr the contractAddress + * @param func interface func selector of contract, 4 bytes + * @param account the account to check + * @return true or false + */ + public Boolean checkMethodAuth(String contractAddr, byte[] func, String account) + throws ContractException { + return contractAuthPrecompiled.checkMethodAuth(contractAddr, func, account); + } + + /** + * get a specific contract admin + * + * @param contractAddress the contract to get admin + * @return admin address + */ + public String getAdmin(String contractAddress) throws ContractException { + return contractAuthPrecompiled.getAdmin(contractAddress); + } + + /** + * set a specific contract's method auth type, only contract admin can call it + * + * @param contractAddr the contract address to set auth + * @param func interface func selector of contract, 4 bytes + * @param authType white_list or black_list + * @return set result, 0 is success + */ + public BigInteger setMethodAuthType(String contractAddr, byte[] func, AuthType authType) { + TransactionReceipt transactionReceipt = + contractAuthPrecompiled.setMethodAuthType(contractAddr, func, authType.getValue()); + return contractAuthPrecompiled.getSetMethodAuthTypeOutput(transactionReceipt).getValue1(); + } + + /** + * set a specific contract's method ACL, only contract admin can call it + * + * @param contractAddr the contract address to set acl + * @param func interface func selector of contract, 4 bytes + * @param account the account to set + * @param isOpen if open, then white_list type is true, black_list is false; if close, then + * white_list type is false, black_list is true; + * @return set result, 0 is success + */ + public BigInteger setMethodAuth( + String contractAddr, byte[] func, String account, boolean isOpen) { + TransactionReceipt receipt; + if (isOpen) { + receipt = contractAuthPrecompiled.openMethodAuth(contractAddr, func, account); + return contractAuthPrecompiled.getOpenMethodAuthOutput(receipt).getValue1(); + } else { + receipt = contractAuthPrecompiled.closeMethodAuth(contractAddr, func, account); + return contractAuthPrecompiled.getCloseMethodAuthOutput(receipt).getValue1(); + } + } +} diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/AuthType.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/AuthType.java new file mode 100644 index 000000000..8bf758a67 --- /dev/null +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/AuthType.java @@ -0,0 +1,18 @@ +package org.fisco.bcos.sdk.contract.auth.po; + +import java.math.BigInteger; + +public enum AuthType { + WHITE_LIST(1), + BLACK_LIST(2); + + private final int value; + + AuthType(int i) { + value = i; + } + + public final BigInteger getValue() { + return BigInteger.valueOf(value); + } +} diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/CommitteeInfo.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/CommitteeInfo.java new file mode 100644 index 000000000..4558464c0 --- /dev/null +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/CommitteeInfo.java @@ -0,0 +1,91 @@ +package org.fisco.bcos.sdk.contract.auth.po; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import org.fisco.bcos.sdk.codec.datatypes.generated.tuples.generated.Tuple4; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CommitteeInfo { + private final Logger logger = LoggerFactory.getLogger(CommitteeInfo.class); + + class GovernorInfo { + String governorAddress; + BigInteger weight; + + public GovernorInfo(String governorAddress, BigInteger weight) { + this.governorAddress = governorAddress; + this.weight = weight; + } + + @Override + public String toString() { + return "GovernorInfo{" + + "governorAddress='" + + governorAddress + + '\'' + + ", weight=" + + weight + + '}'; + } + } + + private List governorList = new ArrayList<>(); + private int participatesRate; + private int winRate; + + public CommitteeInfo fromTuple( + Tuple4, List> tuple) { + List governorNameList = tuple.getValue3(); + List weightList = tuple.getValue4(); + try { + for (int i = 0; i < governorNameList.size(); i++) { + this.governorList.add(new GovernorInfo(governorNameList.get(i), weightList.get(i))); + } + } catch (IndexOutOfBoundsException e) { + logger.error( + "Governor list size not fit with weight list, you should check committee info. e:", + e); + } + this.participatesRate = tuple.getValue1().intValue(); + this.winRate = tuple.getValue2().intValue(); + return this; + } + + public List getGovernorList() { + return governorList; + } + + public void setGovernorList(List governorList) { + this.governorList = governorList; + } + + public int getParticipatesRate() { + return participatesRate; + } + + public void setParticipatesRate(int participatesRate) { + this.participatesRate = participatesRate; + } + + public int getWinRate() { + return winRate; + } + + public void setWinRate(int winRate) { + this.winRate = winRate; + } + + @Override + public String toString() { + return "CommitteeInfo{" + + "governorList=" + + governorList + + ", participatesRate=" + + participatesRate + + ", winRate=" + + winRate + + '}'; + } +} diff --git a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/po/ProposalInfo.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/ProposalInfo.java similarity index 64% rename from sdk-service/src/main/java/org/fisco/bcos/sdk/auth/po/ProposalInfo.java rename to sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/ProposalInfo.java index aaa51ebba..7fb062eee 100644 --- a/sdk-service/src/main/java/org/fisco/bcos/sdk/auth/po/ProposalInfo.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/ProposalInfo.java @@ -1,11 +1,11 @@ -package org.fisco.bcos.sdk.auth.po; +package org.fisco.bcos.sdk.contract.auth.po; import java.math.BigInteger; import java.util.List; import org.fisco.bcos.sdk.codec.datatypes.generated.tuples.generated.Tuple7; public class ProposalInfo { - private String id; + private String resourceId; private String proposer; private int proposalType; private long blockNumberInterval; @@ -16,7 +16,7 @@ public class ProposalInfo { public ProposalInfo fromTuple( Tuple7, List> tuple7) { - this.id = tuple7.getValue1(); + this.resourceId = tuple7.getValue1(); this.proposer = tuple7.getValue2(); this.proposalType = tuple7.getValue3().intValue(); this.blockNumberInterval = tuple7.getValue4().longValue(); @@ -26,12 +26,12 @@ public ProposalInfo fromTuple( return this; } - public String getId() { - return id; + public String getResourceId() { + return resourceId; } - public void setId(String id) { - this.id = id; + public void setResourceId(String resourceId) { + this.resourceId = resourceId; } public String getProposer() { @@ -81,4 +81,26 @@ public List getAgainstVoters() { public void setAgainstVoters(List againstVoters) { this.againstVoters = againstVoters; } + + @Override + public String toString() { + return "ProposalInfo{" + + "resourceId='" + + resourceId + + '\'' + + ", proposer='" + + proposer + + '\'' + + ", proposalType=" + + ProposalType.fromInt(proposalType).getValue() + + ", blockNumberInterval=" + + blockNumberInterval + + ", status=" + + ProposalStatus.fromInt(status).getValue() + + ", agreeVoters=" + + agreeVoters + + ", againstVoters=" + + againstVoters + + '}'; + } } diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/ProposalStatus.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/ProposalStatus.java new file mode 100644 index 000000000..9383cc7e5 --- /dev/null +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/ProposalStatus.java @@ -0,0 +1,34 @@ +package org.fisco.bcos.sdk.contract.auth.po; + +public enum ProposalStatus { + NOT_ENOUGH_VOTE("notEnoughVotes"), + SUCCESS("success"), + FAILED("failed"), + REVOKE("revoke"), + UNKNOWN("unknown"); + + private final String value; + + ProposalStatus(String value) { + this.value = value; + } + + public final String getValue() { + return value; + } + + static ProposalStatus fromInt(int status) { + switch (status) { + case 1: + return NOT_ENOUGH_VOTE; + case 2: + return SUCCESS; + case 3: + return FAILED; + case 4: + return REVOKE; + default: + return UNKNOWN; + } + } +} diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/ProposalType.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/ProposalType.java new file mode 100644 index 000000000..df87da94b --- /dev/null +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/auth/po/ProposalType.java @@ -0,0 +1,37 @@ +package org.fisco.bcos.sdk.contract.auth.po; + +public enum ProposalType { + SET_WEIGHT("setWeight"), + SET_RATE("setRate"), + SET_DEPLOY_AUTH_TYPE("setDeployAuthType"), + MODIFY_DEPLOY_AUTH("modifyDeployAuth"), + RESET_ADMIN("resetAdmin"), + UNKNOWN("unknown"); + + private final String value; + + ProposalType(String value) { + this.value = value; + } + + public final String getValue() { + return value; + } + + static ProposalType fromInt(int type) { + switch (type) { + case 11: + return ProposalType.SET_WEIGHT; + case 12: + return ProposalType.SET_RATE; + case 21: + return ProposalType.SET_DEPLOY_AUTH_TYPE; + case 22: + return ProposalType.MODIFY_DEPLOY_AUTH; + case 31: + return ProposalType.RESET_ADMIN; + default: + return ProposalType.UNKNOWN; + } + } +} diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/precompiled/model/PrecompiledAddress.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/precompiled/model/PrecompiledAddress.java index a5d601e68..a4ec1a9fb 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/precompiled/model/PrecompiledAddress.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/contract/precompiled/model/PrecompiledAddress.java @@ -23,6 +23,9 @@ public class PrecompiledAddress { "0000000000000000000000000000000000001003"; public static final String CNS_PRECOMPILED_ADDRESS = "0000000000000000000000000000000000001004"; public static final String BFS_PRECOMPILED_ADDRESS = "000000000000000000000000000000000000100e"; + public static final String COMMITTEE_MANAGER_ADDRESS = + "0000000000000000000000000000000000010001"; + public static final String CONTRACT_AUTH_ADDRESS = "0000000000000000000000000000000000001005"; public static final String SYSCONFIG_PRECOMPILED_NAME = "/sys/status"; public static final String TABLEFACTORY_PRECOMPILED_NAME = "/sys/table_storage"; diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/ReceiptParser.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/ReceiptParser.java index 1a6f29be3..a3c1eb8f9 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/ReceiptParser.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/codec/decode/ReceiptParser.java @@ -40,7 +40,7 @@ public static RetCode parseTransactionReceipt(TransactionReceipt receipt) throws ContractException { RetCode retCode; try { - Integer status = receipt.getStatus(); + int status = receipt.getStatus(); if (status != 0) { retCode = TransactionReceiptStatus.getStatusMessage(status, receipt.getMessage()); Tuple2 errorOutput = diff --git a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/exception/TransactionException.java b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/exception/TransactionException.java index f10647863..3c78509a3 100644 --- a/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/exception/TransactionException.java +++ b/sdk-transaction/src/main/java/org/fisco/bcos/sdk/transaction/model/exception/TransactionException.java @@ -6,14 +6,14 @@ public class TransactionException extends Exception { private static final long serialVersionUID = -2204228001512046284L; private Optional transactionHash = Optional.empty(); - private String status; + private int status; private BigInteger gasUsed; - public String getStatus() { + public int getStatus() { return status; } - public void setStatus(String status) { + public void setStatus(int status) { this.status = status; } @@ -38,8 +38,13 @@ public TransactionException(String message, String transactionHash) { this.transactionHash = Optional.ofNullable(transactionHash); } + public TransactionException(String message, int status) { + super(message); + this.status = status; + } + public TransactionException( - String message, String status, BigInteger gasUsed, String transactionHash) { + String message, int status, BigInteger gasUsed, String transactionHash) { super(message); this.status = status; this.gasUsed = gasUsed; diff --git a/src/integration-test/java/org/fisco/bcos/sdk/auth/AuthTest.java b/src/integration-test/java/org/fisco/bcos/sdk/auth/AuthTest.java new file mode 100644 index 000000000..00a286dcd --- /dev/null +++ b/src/integration-test/java/org/fisco/bcos/sdk/auth/AuthTest.java @@ -0,0 +1,94 @@ +package org.fisco.bcos.sdk.auth; + +import java.io.IOException; +import java.math.BigInteger; +import java.util.concurrent.atomic.AtomicLong; +import org.fisco.bcos.sdk.BcosSDKTest; +import org.fisco.bcos.sdk.client.Client; +import org.fisco.bcos.sdk.codec.ABICodecException; +import org.fisco.bcos.sdk.config.Config; +import org.fisco.bcos.sdk.config.ConfigOption; +import org.fisco.bcos.sdk.config.exceptions.ConfigException; +import org.fisco.bcos.sdk.contract.auth.manager.AuthManager; +import org.fisco.bcos.sdk.contract.auth.po.CommitteeInfo; +import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair; +import org.fisco.bcos.sdk.jni.common.JniException; +import org.fisco.bcos.sdk.model.ConstantConfig; +import org.fisco.bcos.sdk.model.TransactionReceipt; +import org.fisco.bcos.sdk.transaction.model.exception.ContractException; +import org.fisco.bcos.sdk.transaction.model.exception.TransactionException; +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class AuthTest { + private static final String configFile = + BcosSDKTest.class + .getClassLoader() + .getResource(ConstantConfig.CONFIG_FILE_NAME) + .getPath(); + public AtomicLong receiptCount = new AtomicLong(); + private static final String GROUP = "group"; + + @Test + public void test1GetCommitteeInfo() throws ConfigException, ContractException, JniException { + ConfigOption configOption = Config.load(configFile); + Client client = Client.build(GROUP, configOption); + + CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair(); + + AuthManager authManager = new AuthManager(client, cryptoKeyPair); + CommitteeInfo committeeInfo = authManager.getCommitteeInfo(); + System.out.println(committeeInfo); + Assert.assertEquals(1, committeeInfo.getGovernorList().size()); + } + + @Test + public void test2UpdateGovernor() + throws ConfigException, ContractException, JniException, ABICodecException, + TransactionException, IOException { + ConfigOption configOption = Config.load(configFile); + Client client = Client.build(GROUP, configOption); + + CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair(); + AuthManager authManager = new AuthManager(client, cryptoKeyPair); + BigInteger proposalId = + authManager.updateGovernor( + "0xc49fd7d7648ef4f4774d642d905db2e66f5089a8", BigInteger.ONE); + Assert.assertEquals(proposalId, BigInteger.ONE); + } + + @Test + public void test3RevokeProposal() + throws ConfigException, ContractException, JniException, ABICodecException, + TransactionException, IOException { + ConfigOption configOption = Config.load(configFile); + Client client = Client.build(GROUP, configOption); + + CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair(); + AuthManager authManager = new AuthManager(client, cryptoKeyPair); + BigInteger proposalId = + authManager.updateGovernor( + "0xc49fd7d7648ef4f4774d642d905db2e66f5089a8", BigInteger.ONE); + TransactionReceipt receipt = authManager.revokeProposal(BigInteger.valueOf(123321)); + Assert.assertEquals(proposalId, BigInteger.ONE); + } + + @Test + public void test4VoteProposal() + throws ConfigException, ContractException, JniException, ABICodecException, + TransactionException, IOException { + ConfigOption configOption = Config.load(configFile); + Client client = Client.build(GROUP, configOption); + + CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair(); + AuthManager authManager = new AuthManager(client, cryptoKeyPair); + BigInteger proposalId = + authManager.updateGovernor( + "0xc49fd7d7648ef4f4774d642d905db2e66f5089a8", BigInteger.ONE); + TransactionReceipt receipt = authManager.voteProposal(BigInteger.valueOf(123321), true); + Assert.assertEquals(proposalId, BigInteger.ONE); + } +}