xiongzhu 4 anos atrás
pai
commit
746626703d

+ 10 - 0
pom.xml

@@ -90,6 +90,16 @@
             <artifactId>caffeine</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.retry</groupId>
+            <artifactId>spring-retry</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aspects</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>javax.validation</groupId>
             <artifactId>validation-api</artifactId>

+ 15 - 0
src/main/java/com/izouma/nineth/utils/HashUtils.java

@@ -0,0 +1,15 @@
+package com.izouma.nineth.utils;
+
+import org.bouncycastle.jcajce.provider.digest.Keccak;
+import org.bouncycastle.util.encoders.Hex;
+
+import java.nio.charset.StandardCharsets;
+
+public class HashUtils {
+    public static String Keccak256(String input) {
+        Keccak.Digest256 digest256 = new Keccak.Digest256();
+        byte[] hashbytes = digest256.digest(
+                input.getBytes(StandardCharsets.UTF_8));
+        return new String(Hex.encode(hashbytes));
+    }
+}

+ 1 - 0
src/main/resources/access.key

@@ -0,0 +1 @@
+e6e6vQJYhGmIkcA1pfnsipTovp10wJ

+ 2 - 5
src/main/resources/application.yaml

@@ -87,11 +87,8 @@ mychain:
     bizid: a00e36c5
     cipher-suit: ec
     rest-url: https://rest.baas.alipay.com
-    access-id: LTAI5tPNjgdVFZfCndmTCVmN
-    access-secret: e6e6vQJYhGmIkcA1pfnsipTovp10wJ
-    default-account:
-    default-account-key:
-    default-account-pwd:
+    access-id: 11nv01O0PJCIVRRI
+    access-secret: access.key
     tenantid: PJCIVRRI
     read-file-from-ext: false
     account: 9th_test

+ 22 - 1
src/test/java/com/izouma/nineth/AntChainTest.java

@@ -1,17 +1,38 @@
 package com.izouma.nineth;
 
+import com.alibaba.fastjson.JSON;
+import com.alipay.mychain.sdk.common.VMTypeEnum;
+import com.alipay.mychain.sdk.domain.transaction.LogEntry;
+import com.alipay.mychain.sdk.vm.EVMOutput;
 import com.antfinancial.mychain.baas.tool.restclient.RestClient;
+import com.antfinancial.mychain.baas.tool.restclient.model.CallRestBizParam;
 import com.antfinancial.mychain.baas.tool.restclient.model.Method;
+import com.antfinancial.mychain.baas.tool.restclient.model.ReceiptDecoration;
 import com.antfinancial.mychain.baas.tool.restclient.response.BaseResp;
+import com.antfinancial.mychain.baas.tool.utils.ContractParameterUtils;
+import com.izouma.nineth.utils.HashUtils;
+import org.bouncycastle.util.encoders.Base64;
+import org.bouncycastle.util.encoders.Hex;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.Arrays;
+import java.util.List;
+
 public class AntChainTest extends ApplicationTests {
     @Autowired
     private RestClient restClient;
 
     @Test
     public void testQuery() throws Exception {
-        BaseResp baseResp = restClient.chainCall("9df6dffdc211e437986cb42a3b6e600bc37e6fdedfea592812e7b7bb5ccf925b", "", "", Method.QUERYRECEIPT);
+        BaseResp queryBaseResp = restClient.chainCall("0xc819a128fa96a71ad6825c2048e2af9dc0ade762bf60e80e83ee3d9e0e1e5b03", "", "", Method.QUERYRECEIPT);
+        ReceiptDecoration transaction = JSON.parseObject(queryBaseResp.getData(), ReceiptDecoration.class);
+        for (LogEntry log : transaction.getLogs()) {
+            if (log.getTopics().get(0).equals(HashUtils.Keccak256("Transfer(identity,identity,uint256)"))) {
+                System.out.println("from:" + log.getTopics().get(1));
+                System.out.println("to:" + log.getTopics().get(2));
+                System.out.println("token:" + log.getTopics().get(3));
+            }
+        }
     }
 }

+ 434 - 0
src/test/java/com/izouma/nineth/DemoSample.java

@@ -0,0 +1,434 @@
+package com.izouma.nineth;
+
+import com.alipay.mychain.sdk.api.MychainClient;
+import com.alipay.mychain.sdk.api.env.ClientEnv;
+import com.alipay.mychain.sdk.api.env.ISslOption;
+import com.alipay.mychain.sdk.api.env.SignerOption;
+import com.alipay.mychain.sdk.api.env.SslBytesOption;
+import com.alipay.mychain.sdk.api.logging.AbstractLoggerFactory;
+import com.alipay.mychain.sdk.api.logging.ILogger;
+import com.alipay.mychain.sdk.api.utils.ConfidentialUtil;
+import com.alipay.mychain.sdk.api.utils.Utils;
+import com.alipay.mychain.sdk.common.VMTypeEnum;
+import com.alipay.mychain.sdk.crypto.MyCrypto;
+import com.alipay.mychain.sdk.crypto.keyoperator.Pkcs8KeyOperator;
+import com.alipay.mychain.sdk.crypto.keypair.Keypair;
+import com.alipay.mychain.sdk.crypto.signer.SignerBase;
+import com.alipay.mychain.sdk.domain.account.Identity;
+import com.alipay.mychain.sdk.errorcode.ErrorCode;
+import com.alipay.mychain.sdk.message.query.QueryAccountResponse;
+import com.alipay.mychain.sdk.message.transaction.AbstractTransactionRequest;
+import com.alipay.mychain.sdk.message.transaction.TransactionReceiptResponse;
+import com.alipay.mychain.sdk.message.transaction.confidential.ConfidentialRequest;
+import com.alipay.mychain.sdk.message.transaction.contract.CallContractRequest;
+import com.alipay.mychain.sdk.message.transaction.contract.DeployContractRequest;
+import com.alipay.mychain.sdk.type.BaseFixedSizeUnsignedInteger;
+import com.alipay.mychain.sdk.utils.ByteUtils;
+import com.alipay.mychain.sdk.utils.IOUtil;
+import com.alipay.mychain.sdk.utils.RandomUtil;
+import com.alipay.mychain.sdk.vm.EVMOutput;
+import com.alipay.mychain.sdk.vm.EVMParameter;
+
+import java.io.IOException;
+import java.math.BigInteger;
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DemoSample {
+    /**
+     * contract code
+     */
+    private static String contractCodeString
+                                         =
+            "6080604052633b9aca00600055600060015534801561001d57600080fd5b5033600281905550610492806100346000396000f3006080604"
+                    +
+                    "05260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063"
+                    +
+                    "af7c102c1461005c578063b2628df81461009d578063d4486019146100ec575b600080fd5b34801561006857600080fd5b5061008"
+                    +
+                    "76004803603810190808035906020019092919050505061013b565b6040518082815260200191505060405180910390f35b348015"
+                    +
+                    "6100a957600080fd5b506100d26004803603810190808035906020019092919080359060200190929190505050610158565b60405"
+                    +
+                    "1808215151515815260200191505060405180910390f35b3480156100f857600080fd5b5061012160048036038101908080359060"
+                    +
+                    "200190929190803590602001909291905050506102d8565b604051808215151515815260200191505060405180910390f35b60006"
+                    +
+                    "0036000838152602001908152602001600020549050919050565b6000600254331415156101d3576040517f08c379a00000000000"
+                    +
+                    "000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5065726d697"
+                    +
+                    "373696f6e2064656e69656400000000000000000000000000000081525060200191505060405180910390fd5b6000548260015401"
+                    +
+                    "131580156101ee57506001548260015401135b80156101fa5750600082135b151561026e576040517f08c379a0000000000000000"
+                    +
+                    "00000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420"
+                    +
+                    "76616c75652100000000000000000000000000000000000081525060200191505060405180910390fd5b816003600085815260200"
+                    +
+                    "190815260200160002060008282540192505081905550816001600082825401925050819055508183337f31a52246bf8c995cecfd"
+                    +
+                    "d5404cf290ae6c2f4e174e888e4de4fd208137ec274d60405160405180910390a46001905092915050565b6000816003600033815"
+                    +
+                    "26020019081526020016000205412151515610365576040517f08c379a00000000000000000000000000000000000000000000000"
+                    +
+                    "000000000081526004018080602001828103825260138152602001807f62616c616e6365206e6f7420656e6f75676821000000000"
+                    +
+                    "0000000000000000081525060200191505060405180910390fd5b60008213801561037757506000548213155b15156103eb576040"
+                    +
+                    "517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e815"
+                    +
+                    "2602001807f496e76616c69642076616c756521000000000000000000000000000000000000815250602001915050604051809103"
+                    +
+                    "90fd5b816003600033815260200190815260200160002060008282540392505081905550816003600085815260200190815260200"
+                    +
+                    "1600020600082825401925050819055508183337f97c0c2106db19ca3c64afdc86820cd157d60361f777bf0e5323254d6c9689550"
+                    +
+                    "60405160405180910390a460009050929150505600a165627a7a72305820371af9e83b0e49ca71634c470c75e504d08db9abbaf39"
+                    + "92f30434f8d7a7994d40029";
+    private static byte[] contractCode   = ByteUtils.hexStringToBytes(contractCodeString);
+    /**
+     * contract id
+     */
+    private static String testContractId = "CreditManager" + System.currentTimeMillis();
+
+    /**
+     * baas上创建的帐户名字
+     */
+    private static final String   account = "sy_test";
+    private static       Identity userIdentity;
+    private static       Keypair  userKeypair;
+
+    /**
+     * create account test
+     */
+    private static Identity      testAccount1 = Utils.getIdentityByName("test_account_" + System.currentTimeMillis());
+    /**
+     * sdk client
+     */
+    private static MychainClient sdk;
+    /**
+     * client key password
+     */
+    private static String        keyPassword  = "Arb1585Stat";  //根据实际情况更新,申请证书时候指定的SSL密码
+    /**
+     * user password
+     */
+    private static String        userPassword = "12345678"; //根据实际情况更新。申请证书时,创建账户的密码
+    /**
+     * host ip
+     */
+
+    private static String        host         = "106.14.211.115"; //根据实际情况更新,在BaaS平台,通过查看目标合约链"详情",在"区块浏览器"中查看"节点详情"可获取链节点的 IP地址 和 端口号。
+
+    /**
+     * server port
+     */
+    private static int          port               = 18130;               //根据实际情况更新
+    /**
+     * trustCa password.
+     */
+    private static String       trustStorePassword = "mychain";
+    /**
+     * mychain environment
+     */
+    private static ClientEnv    env;
+    /**
+     * mychain is tee Chain
+     */
+    private static boolean      isTeeChain         = false;
+    /**
+     * tee chain publicKeys
+     */
+    private static List<byte[]> publicKeys         = new ArrayList<byte[]>();
+    /**
+     * tee chain secretKey
+     */
+    private static String       secretKey          = "123456";
+
+
+    private static void exit(String tag, String msg) {
+        exit(String.format("%s error : %s ", tag, msg));
+    }
+
+    private static void exit(String msg) {
+        System.out.println(msg);
+        System.exit(0);
+    }
+
+    private static String getErrorMsg(int errorCode) {
+        int minMychainSdkErrorCode = ErrorCode.SDK_INTERNAL_ERROR.getErrorCode();
+        if (errorCode < minMychainSdkErrorCode) {
+            return ErrorCode.valueOf(errorCode).getErrorDesc();
+        } else {
+            return ErrorCode.valueOf(errorCode).getErrorDesc();
+        }
+    }
+
+    private static void initMychainEnv() throws IOException {
+        // any user key for sign message
+        String userPrivateKeyFile = "user.key";
+        userIdentity = Utils.getIdentityByName(account); //根据实际情况更新'gushui03'为'user.key'对应的账户名(BaaS申请证书时创建的账户名)
+        Pkcs8KeyOperator pkcs8KeyOperator = new Pkcs8KeyOperator();
+        userKeypair = pkcs8KeyOperator.load(IOUtil.inputStreamToByte(DemoSample.class.getClassLoader()
+                .getResourceAsStream(userPrivateKeyFile)), userPassword);
+
+        // use publicKeys by tee
+        if (isTeeChain) {
+            Keypair keypair = new Pkcs8KeyOperator()
+                    .loadPubkey(
+                            IOUtil.inputStreamToByte(DemoSample.class.getClassLoader()
+                                    .getResourceAsStream("test_seal_pubkey.pem")));
+            byte[] publicKeyDer = keypair.getPubkeyEncoded(); //tee_rsa_public_key.pem 从BaaS下载获取
+            publicKeys.add(publicKeyDer);
+        }
+
+        env = buildMychainEnv();
+
+        ILogger logger = AbstractLoggerFactory.getInstance(DemoSample.class);
+        env.setLogger(logger);
+    }
+
+    private static ClientEnv buildMychainEnv() throws IOException {
+        InetSocketAddress inetSocketAddress = InetSocketAddress.createUnresolved(host, port);
+        String keyFilePath = "client.key";
+        String certFilePath = "client.crt";
+        String trustStoreFilePath = "trustCa";
+
+        // build ssl option
+        ISslOption sslOption = new SslBytesOption.Builder()
+                .keyBytes(IOUtil.inputStreamToByte(DemoSample.class.getClassLoader().getResourceAsStream(keyFilePath)))
+                .certBytes(IOUtil.inputStreamToByte(DemoSample.class.getClassLoader()
+                        .getResourceAsStream(certFilePath)))
+                .keyPassword(keyPassword)
+                .trustStorePassword(trustStorePassword)
+                .trustStoreBytes(
+                        IOUtil.inputStreamToByte(DemoSample.class.getClassLoader()
+                                .getResourceAsStream(trustStoreFilePath)))
+                .build();
+
+        List<InetSocketAddress> socketAddressArrayList = new ArrayList<InetSocketAddress>();
+        socketAddressArrayList.add(inetSocketAddress);
+
+        List<SignerBase> signerBaseList = new ArrayList<SignerBase>();
+        SignerBase signerBase = MyCrypto.getInstance().createSigner(userKeypair);
+        signerBaseList.add(signerBase);
+        SignerOption signerOption = new SignerOption();
+        signerOption.setSigners(signerBaseList);
+
+        return ClientEnv.build(socketAddressArrayList, sslOption, signerOption);
+    }
+
+
+    private static void signRequest(AbstractTransactionRequest request) {
+        // sign request
+        long ts = sdk.getNetwork().getSystemTimestamp();
+        request.setTxTimeNonce(ts, BaseFixedSizeUnsignedInteger.Fixed64BitUnsignedInteger
+                .valueOf(RandomUtil.randomize(ts + request.getTransaction().hashCode())), true);
+        request.complete();
+        sdk.getConfidentialService().signRequest(env.getSignerOption().getSigners(), request);
+    }
+
+    private static void deployContract() {
+        EVMParameter contractParameters = new EVMParameter();
+
+        // build DeployContractRequest
+        DeployContractRequest request = new DeployContractRequest(userIdentity,
+                Utils.getIdentityByName(testContractId), contractCode, VMTypeEnum.EVM,
+                contractParameters, BigInteger.ZERO);
+
+        //  set Gas limit
+        // Make sure your account balance is greater than 50,000
+        request.setTxGas(BigInteger.valueOf(50000));
+
+        TransactionReceiptResponse deployContractResult;
+        if (isTeeChain) {
+            signRequest(request);
+
+            // generate transaction key
+            byte[] transactionKey = ConfidentialUtil.keyGenerate(secretKey,
+                    request.getTransaction().getHash().getValue());
+
+            ConfidentialRequest confidentialRequest = new ConfidentialRequest(request, publicKeys, transactionKey);
+
+            deployContractResult = sdk.getConfidentialService().confidentialRequest(confidentialRequest);
+        } else {
+            deployContractResult = sdk.getContractService().deployContract(request);
+        }
+
+        // deploy contract
+        if (!deployContractResult.isSuccess()
+                || deployContractResult.getTransactionReceipt().getResult() != 0) {
+            exit("deployContract",
+                    getErrorMsg((int) deployContractResult.getTransactionReceipt().getResult()));
+        } else {
+            System.out.println("deploy contract success.");
+        }
+    }
+
+    private static void issue() {
+        EVMParameter parameters = new EVMParameter("Issue(identity,int256)");
+        parameters.addIdentity(userIdentity);
+        parameters.addUint(BigInteger.valueOf(100));
+
+        // build CallContractRequest
+        CallContractRequest request = new CallContractRequest(userIdentity,
+                Utils.getIdentityByName(testContractId), parameters, BigInteger.ZERO, VMTypeEnum.EVM);
+
+        //  set Gas limit
+        // Make sure your account balance is greater than 50,000
+        request.setTxGas(BigInteger.valueOf(50000));
+
+        TransactionReceiptResponse callContractResult;
+        if (isTeeChain) {
+            signRequest(request);
+
+            // generate transaction key
+            byte[] transactionKey = ConfidentialUtil.keyGenerate(secretKey,
+                    request.getTransaction().getHash().getValue());
+
+            ConfidentialRequest confidentialRequest = new ConfidentialRequest(request, publicKeys, transactionKey);
+
+            callContractResult = sdk.getConfidentialService().confidentialRequest(confidentialRequest);
+        } else {
+            callContractResult = sdk.getContractService().callContract(request);
+        }
+
+        if (!callContractResult.isSuccess() || callContractResult.getTransactionReceipt().getResult() != 0) {
+            exit("issue", getErrorMsg((int) callContractResult.getTransactionReceipt().getResult()));
+        } else {
+            System.out.println("issue success.");
+        }
+    }
+
+    private static void transfer() {
+        // contract parameters
+        EVMParameter contractParameters = new EVMParameter("Transfer(identity,int256)");
+        contractParameters.addIdentity(testAccount1);
+        contractParameters.addUint(BigInteger.valueOf(50));
+
+        CallContractRequest request = new CallContractRequest(userIdentity,
+                Utils.getIdentityByName(testContractId), contractParameters, BigInteger.ZERO, VMTypeEnum.EVM);
+
+        //  set Gas limit
+        // Make sure your account balance is greater than 50,000
+        request.setTxGas(BigInteger.valueOf(50000));
+
+        TransactionReceiptResponse callContractResult;
+        if (isTeeChain) {
+            signRequest(request);
+
+            // generate transaction key
+            byte[] transactionKey = ConfidentialUtil.keyGenerate(secretKey,
+                    request.getTransaction().getHash().getValue());
+
+            ConfidentialRequest confidentialRequest = new ConfidentialRequest(request, publicKeys, transactionKey);
+
+            callContractResult = sdk.getConfidentialService().confidentialRequest(confidentialRequest);
+        } else {
+            callContractResult = sdk.getContractService().callContract(request);
+        }
+
+        if (!callContractResult.isSuccess() || callContractResult.getTransactionReceipt().getResult() != 0) {
+            exit("transfer", getErrorMsg((int) callContractResult.getTransactionReceipt().getResult()));
+        } else {
+            System.out.println("transfer success.");
+        }
+    }
+
+    private static BigInteger query(Identity account) {
+        // contract parameters
+        EVMParameter parameters = new EVMParameter("Query(identity)");
+        parameters.addIdentity(account);
+
+        // build call contract request
+        CallContractRequest request = new CallContractRequest(userIdentity,
+                Utils.getIdentityByName(testContractId), parameters, BigInteger.ZERO, VMTypeEnum.EVM);
+
+        //  set Gas limit
+        // Make sure your account balance is greater than 50,000
+        request.setTxGas(BigInteger.valueOf(50000));
+
+        TransactionReceiptResponse callContractResult;
+        if (isTeeChain) {
+            signRequest(request);
+
+            // generate transaction key
+            byte[] transactionKey = ConfidentialUtil.keyGenerate(secretKey,
+                    request.getTransaction().getHash().getValue());
+
+            ConfidentialRequest confidentialRequest = new ConfidentialRequest(request, publicKeys, transactionKey);
+
+            callContractResult = sdk.getConfidentialService().confidentialRequest(confidentialRequest);
+        } else {
+            callContractResult = sdk.getContractService().callContract(request);
+        }
+
+        if (!callContractResult.isSuccess() || callContractResult.getTransactionReceipt().getResult() != 0) {
+            exit("query", getErrorMsg((int) callContractResult.getTransactionReceipt().getResult()));
+        }
+
+        byte[] output = null;
+        if (isTeeChain) {
+            output = ConfidentialUtil.decrypt(secretKey, callContractResult.getTransactionReceipt()
+                    .getOutput(), request.getTransaction().getHash().hexStrValue());
+        } else {
+            output = callContractResult.getTransactionReceipt().getOutput();
+        }
+
+        if (output == null) {
+            exit("decrypt tee", "decrypt tee output failed");
+            return BigInteger.ZERO;
+        }
+
+        // decode return values
+        EVMOutput contractReturnValues = new EVMOutput(ByteUtils.toHexString(output));
+        return contractReturnValues.getUint();
+    }
+
+    private static void expect(BigInteger balance, BigInteger expectBalance) {
+        if (balance.compareTo(expectBalance) != 0) {
+            exit("expect", "the account value is not expected.");
+        } else {
+            System.out.println("check account balance success.");
+        }
+    }
+
+    private static void initSdk() {
+        sdk = new MychainClient();
+        boolean initResult = sdk.init(env);
+        if (!initResult) {
+            exit("initSdk", "sdk init failed.");
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        //step 1:init mychain env.
+        initMychainEnv();
+
+        //step 2: init sdk client
+        initSdk();
+
+        QueryAccountResponse queryAccountResponse = sdk.getQueryService()
+                .queryAccount(Utils.getIdentityByName("test11133"));
+
+        //step 3 : deploy a contract using useridentity.
+        deployContract();
+
+        //step 4 issue 100 assets to testAccount1.
+        issue();
+
+        //step 5 : transfer 50 assets from useridentity to testAccount1
+        transfer();
+
+        //step 6 : query testAccount1 whose balance should be 50.
+        BigInteger balance = query(testAccount1);
+
+        //step 7 : compare to expect balance.
+        expect(balance, BigInteger.valueOf(50));
+
+        //step 8 : sdk shut down
+        sdk.shutDown();
+    }
+}