/** * Sign the transaction hash data using Secp256k1 algorithm. * * @param signature the signature * @throws Exception the exception */ public void sign(Signature signature) throws Exception { // calculate hash this.calculateHash(); byte[] sign = signature.sign(this.hash); this.alg = signature.algorithm(); this.sign = sign; } }
/** * serialize the transaction data to protobuf data. * * @return the protobuf data * @throws Exception the exception */ public byte[] toProto() throws Exception { TransactionOuterClass.Transaction.Builder builder = TransactionOuterClass.Transaction.newBuilder(); builder.setAlg(this.getAlg().getType()); builder.setChainId(this.getChainID()); builder.setFrom(ByteString.copyFrom(this.getFrom().bytes())); builder.setTo(ByteString.copyFrom(this.getTo().bytes())); builder.setValue(ByteString.copyFrom(ByteUtils.ToFixedSizeBytes(this.getValue().toByteArray(), 16))); builder.setGasLimit(ByteString.copyFrom(ByteUtils.ToFixedSizeBytes(this.getGasLimit().toByteArray(), 16))); builder.setGasPrice(ByteString.copyFrom(ByteUtils.ToFixedSizeBytes(this.getGasPrice().toByteArray(), 16))); builder.setNonce(this.getNonce()); builder.setHash(ByteString.copyFrom(this.getHash())); builder.setSign(ByteString.copyFrom(this.getSign())); builder.setTimestamp(this.getTimestamp()); builder.setData(this.getData()); TransactionOuterClass.Transaction t = builder.build(); return t.toByteArray(); }
/** * FromProto constructs a transaction object with the data from protobuf message data. * * @param msg the msg * @return the transaction * @throws Exception the exception */ public static Transaction FromProto(byte[] msg) throws Exception { Transaction tx = new Transaction(); tx.fromProto(msg); return tx; }
@Test public void calculateHash() throws Exception { String encodedText = "CiCCVuSptT1oavBbf2UJfh+FHaOb15rhXgvMnyMPrpaLORIaGVfKCoAu9e0830glBZkJcmNoRXXOUbwvcz8aGhlXygqALvXtPN9IJQWZCXJjaEV1zlG8L3M/IhAAAAAAAAAAAAAAAAAAAAAKKAEwxbrg1gU6LAoGZGVwbG95EiJ7IlNvdXJjZVR5cGUiOiIxMSIsIlNvdXJjZSI6IjExMSJ9QGRKEAAAAAAAAAAAAAAAAAAATiBSEAAAAAAAAAAAAAAAAAAPQkBYAWJB5ZgDuJwK+EPpThEY0sAHc19immxH/LJCyXzj3OeaDUV7JGil7aIlcRTVsWAd32D5T12q9INlNVCT9m2lEV6/YgE="; byte[] result = ByteUtils.Base64ToBytes(encodedText); Transaction transaction = Transaction.FromProto(result); byte[] originHash = transaction.getHash(); byte[] calHash = transaction.calculateHash(); Assert.assertTrue(ByteUtils.Equal(originHash, calHash)); }
@Test public void binaryPayload() throws Exception { String encodedText = "CiD/DXtAEjr1gTtq3T3pk2nL8CmkZPWzt7suFSPQhi4YEhIaGVeQ+6EMye7DjoRMJLuiXjJc1WRPcPmUV9IaGhlXkPuhDMnuw46ETCS7ol4yXNVkT3D5lFfSIhAAAAAAAAAAAA3gtrOnZAAAKAEw7O7m1gU6CAoGYmluYXJ5QOkHShAAAAAAAAAAAAAAAAAAD0JAUhAAAAAAAAAAAAAAAAAAAw1AWAFiQdX0esPCiDrfxGvCUt51UEZUaasdlYrcAkllPgyw6soeKq8+lRs1hYZPvYWDSzSWbhKs9D4xo5DgRbvdr5fRmekB"; byte[] result = ByteUtils.Base64ToBytes(encodedText); Transaction transaction = Transaction.FromProto(result); byte[] originData = transaction.getData().getPayload().toByteArray(); TransactionBinaryPayload payload = TransactionBinaryPayload.LoadPayload(originData); byte[] data = payload.toBytes(); Assert.assertTrue(ByteUtils.Equal(originData, data)); }
BigInteger gasPrice = new BigInteger("1000000"); // 0 < gasPrice < 10^12 BigInteger gasLimit = new BigInteger("20000"); // 20000 < gasPrice < 50*10^9 Transaction tx = new Transaction(chainID, from, to, value, nonce, payloadType, payload, gasPrice, gasLimit); manager.signTransaction(tx,passphrase); byte[] rawData = tx.toProto(); payload = new TransactionDeployPayload("js", "var demo = 1;", "").toBytes(); tx = new Transaction(chainID, from, from, value, nonce, payloadType, payload, gasPrice, gasLimit); manager.signTransaction(tx,passphrase); rawData = tx.toProto(); tx = new Transaction(chainID, from, to, value, nonce, payloadType, payload, gasPrice, gasLimit); manager.signTransaction(tx,passphrase); rawData = tx.toProto();
@Test public void fromProto() throws Exception { String encodedText = "CiCCVuSptT1oavBbf2UJfh+FHaOb15rhXgvMnyMPrpaLORIaGVfKCoAu9e0830glBZkJcmNoRXXOUbwvcz8aGhlXygqALvXtPN9IJQWZCXJjaEV1zlG8L3M/IhAAAAAAAAAAAAAAAAAAAAAKKAEwxbrg1gU6LAoGZGVwbG95EiJ7IlNvdXJjZVR5cGUiOiIxMSIsIlNvdXJjZSI6IjExMSJ9QGRKEAAAAAAAAAAAAAAAAAAATiBSEAAAAAAAAAAAAAAAAAAPQkBYAWJB5ZgDuJwK+EPpThEY0sAHc19immxH/LJCyXzj3OeaDUV7JGil7aIlcRTVsWAd32D5T12q9INlNVCT9m2lEV6/YgE="; byte[] result = ByteUtils.Base64ToBytes(encodedText); Transaction transaction = Transaction.FromProto(result); String tr = ByteUtils.Base64ToString(transaction.toProto()); assertTrue(encodedText.equals(tr)); }
/** * Sign the transaction. * Calculate the SHA3256 hash of the given transaction first, and then sign the hash data with ECDSA (Secp256k1). * * @param transaction the transaction tobe signed * @param passphrase the passphrase of the transaction sender account * @throws Exception the exception */ public void signTransaction(Transaction transaction, byte[] passphrase) throws Exception { Key key = keystore.getKey(transaction.getFrom().string(), passphrase); Signature signature = Crypto.NewSignature(this.signatureAlg); signature.initSign((PrivateKey) key); transaction.sign(signature); key.clear(); }
@Test public void deployPayload() throws Exception { String encodedText = "CiAfxZM8UvjtK0AGsbtndhsNJbZ/1kjME5fBQ4cDQcDsAhIaGVfPioPBnYjS2g01UperjOGXZYaCGQ8BwmkaGhlXz4qDwZ2I0toNNVKXq4zhl2WGghkPAcJpIhAAAAAAAAAAAAAAAAAAAAAAKAEwhLvr1gU6tjMKBmRlcGxveRKrM3siU291cmNlVHlwZSI6ImpzIiwiU291cmNlIjoiLy8gQ29weXJpZ2h0IChDKSAyMDE3IGdvLW5lYnVsYXMgYXV0aG9yc1xuLy9cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnby1uZWJ1bGFzIGxpYnJhcnkuXG4vL1xuLy8gdGhlIGdvLW5lYnVsYXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3Jcbi8vIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gdGhlIGdvLW5lYnVsYXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhlIGdvLW5lYnVsYXMgbGlicmFyeS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cbi8vXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEFsbG93ZWQgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgdGhpcy5hbGxvd2VkID0ge307XG4gICAgdGhpcy5wYXJzZShvYmopO1xufVxuXG5BbGxvd2VkLnByb3RvdHlwZSA9IHtcbiAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5hbGxvd2VkKTtcbiAgICB9LFxuXG4gICAgcGFyc2U6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKG9iaik7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dlZFtrZXldID0gbmV3IEJpZ051bWJlcihkYXRhW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxvd2VkW2tleV07XG4gICAgfSxcblxuICAgIHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5hbGxvd2VkW2tleV0gPSBuZXcgQmlnTnVtYmVyKHZhbHVlKTtcbiAgICB9XG59XG5cbnZhciBTdGFuZGFyZFRva2VuID0gZnVuY3Rpb24gKCkge1xuICAgIExvY2FsQ29udHJhY3RTdG9yYWdlLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfbmFtZTogbnVsbCxcbiAgICAgICAgX3N5bWJvbDogbnVsbCxcbiAgICAgICAgX2RlY2ltYWxzOiBudWxsLFxuICAgICAgICBfdG90YWxTdXBwbHk6IHtcbiAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvLnRvU3RyaW5nKDEwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgTG9jYWxDb250cmFjdFN0b3JhZ2UuZGVmaW5lTWFwUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIFwiYmFsYW5jZXNcIjoge1xuICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFsbG93ZWRcIjoge1xuICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWxsb3dlZCh2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cblN0YW5kYXJkVG9rZW4ucHJvdG90eXBlID0ge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChuYW1lLCBzeW1ib2wsIGRlY2ltYWxzLCB0b3RhbFN1cHBseSkge1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5fc3ltYm9sID0gc3ltYm9sO1xuICAgICAgICB0aGlzLl9kZWNpbWFscyA9IGRlY2ltYWxzIHwgMDtcbiAgICAgICAgdGhpcy5fdG90YWxTdXBwbHkgPSBuZXcgQmlnTnVtYmVyKHRvdGFsU3VwcGx5KS5tdWwobmV3IEJpZ051bWJlcigxMCkucG93KGRlY2ltYWxzKSk7XG5cbiAgICAgICAgdmFyIGZyb20gPSBCbG9ja2NoYWluLnRyYW5zYWN0aW9uLmZyb207XG4gICAgICAgIHRoaXMuYmFsYW5jZXMuc2V0KGZyb20sIHRoaXMuX3RvdGFsU3VwcGx5KTtcbiAgICAgICAgdGhpcy50cmFuc2ZlckV2ZW50KHRydWUsIGZyb20sIGZyb20sIHRoaXMuX3RvdGFsU3VwcGx5KTtcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdG9rZW5cbiAgICBuYW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH0sXG5cbiAgICAvLyBSZXR1cm5zIHRoZSBzeW1ib2wgb2YgdGhlIHRva2VuXG4gICAgc3ltYm9sOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zeW1ib2w7XG4gICAgfSxcblxuICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkZWNpbWFscyB0aGUgdG9rZW4gdXNlc1xuICAgIGRlY2ltYWxzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNpbWFscztcbiAgICB9LFxuXG4gICAgdG90YWxTdXBwbHk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsU3VwcGx5LnRvU3RyaW5nKDEwKTtcbiAgICB9LFxuXG4gICAgYmFsYW5jZU9mOiBmdW5jdGlvbiAob3duZXIpIHtcbiAgICAgICAgdmFyIGJhbGFuY2UgPSB0aGlzLmJhbGFuY2VzLmdldChvd25lcik7XG5cbiAgICAgICAgaWYgKGJhbGFuY2UgaW5zdGFuY2VvZiBCaWdOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBiYWxhbmNlLnRvU3RyaW5nKDEwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcIjBcIjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB0cmFuc2ZlcjogZnVuY3Rpb24gKHRvLCB2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IG5ldyBCaWdOdW1iZXIodmFsdWUpO1xuXG4gICAgICAgIHZhciBmcm9tID0gQmxvY2tjaGFpbi50cmFuc2FjdGlvbi5mcm9tO1xuICAgICAgICB2YXIgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZXMuZ2V0KGZyb20pIHx8IG5ldyBCaWdOdW1iZXIoMCk7XG5cbiAgICAgICAgaWYgKGJhbGFuY2UubHQodmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFuc2ZlciBmYWlsZWQuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iYWxhbmNlcy5zZXQoZnJvbSwgYmFsYW5jZS5zdWIodmFsdWUpKTtcbiAgICAgICAgdmFyIHRvQmFsYW5jZSA9IHRoaXMuYmFsYW5jZXMuZ2V0KHRvKSB8fCBuZXcgQmlnTnVtYmVyKDApO1xuICAgICAgICB0aGlzLmJhbGFuY2VzLnNldCh0bywgdG9CYWxhbmNlLmFkZCh2YWx1ZSkpO1xuXG4gICAgICAgIHRoaXMudHJhbnNmZXJFdmVudCh0cnVlLCBmcm9tLCB0bywgdmFsdWUpO1xuICAgIH0sXG5cbiAgICB0cmFuc2ZlckZyb206IGZ1bmN0aW9uIChmcm9tLCB0bywgdmFsdWUpIHtcbiAgICAgICAgdmFyIHR4RnJvbSA9IEJsb2NrY2hhaW4udHJhbnNhY3Rpb24uZnJvbTtcbiAgICAgICAgdmFyIGJhbGFuY2UgPSB0aGlzLmJhbGFuY2VzLmdldChmcm9tKSB8fCBuZXcgQmlnTnVtYmVyKDApO1xuXG4gICAgICAgIHZhciBhbGxvd2VkID0gdGhpcy5hbGxvd2VkLmdldChmcm9tKSB8fCBuZXcgQWxsb3dlZCgpO1xuICAgICAgICB2YXIgYWxsb3dlZFZhbHVlID0gYWxsb3dlZC5nZXQodHhGcm9tKSB8fCBuZXcgQmlnTnVtYmVyKDApO1xuXG4gICAgICAgIGlmIChiYWxhbmNlLmd0ZSh2YWx1ZSkgJiYgYWxsb3dlZFZhbHVlLmd0ZSh2YWx1ZSkpIHtcblxuICAgICAgICAgICAgdGhpcy5iYWxhbmNlcy5zZXQoZnJvbSwgYmFsYW5jZS5zdWIodmFsdWUpKTtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIGFsbG93ZWQgdmFsdWVcbiAgICAgICAgICAgIGFsbG93ZWQuc2V0KHR4RnJvbSwgYWxsb3dlZFZhbHVlLnN1Yih2YWx1ZSkpO1xuICAgICAgICAgICAgdGhpcy5hbGxvd2VkLnNldChmcm9tLCBhbGxvd2VkKTtcblxuICAgICAgICAgICAgdmFyIHRvQmFsYW5jZSA9IHRoaXMuYmFsYW5jZXMuZ2V0KHRvKSB8fCBuZXcgQmlnTnVtYmVyKDApO1xuICAgICAgICAgICAgdGhpcy5iYWxhbmNlcy5zZXQodG8sIHRvQmFsYW5jZS5hZGQodmFsdWUpKTtcblxuICAgICAgICAgICAgdGhpcy50cmFuc2ZlckV2ZW50KHRydWUsIGZyb20sIHRvLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFuc2ZlciBmYWlsZWQuXCIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHRyYW5zZmVyRXZlbnQ6IGZ1bmN0aW9uIChzdGF0dXMsIGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICBFdmVudC5UcmlnZ2VyKHRoaXMubmFtZSgpLCB7XG4gICAgICAgICAgICBTdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICAgIFRyYW5zZmVyOiB7XG4gICAgICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgICAgICB0bzogdG8sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhcHByb3ZlOiBmdW5jdGlvbiAoc3BlbmRlciwgY3VycmVudFZhbHVlLCB2YWx1ZSkge1xuICAgICAgICB2YXIgZnJvbSA9IEJsb2NrY2hhaW4udHJhbnNhY3Rpb24uZnJvbTtcblxuICAgICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmFsbG93YW5jZShmcm9tLCBzcGVuZGVyKTtcbiAgICAgICAgaWYgKG9sZFZhbHVlICE9IGN1cnJlbnRWYWx1ZS50b1N0cmluZygpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjdXJyZW50IGFwcHJvdmUgdmFsdWUgbWlzdGFrZS5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmFsYW5jZSA9IG5ldyBCaWdOdW1iZXIodGhpcy5iYWxhbmNlT2YoZnJvbSkpO1xuICAgICAgICBpZiAoYmFsYW5jZS5sdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFwcHJvdmUgdmFsdWUgYmlnZ2VyIHRoYW4gYmFsYW5jZS5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3duZWQgPSB0aGlzLmFsbG93ZWQuZ2V0KGZyb20pIHx8IG5ldyBBbGxvd2VkKCk7XG4gICAgICAgIG93bmVkLnNldChzcGVuZGVyLCBuZXcgQmlnTnVtYmVyKHZhbHVlKSk7XG5cbiAgICAgICAgdGhpcy5hbGxvd2VkLnNldChmcm9tLCBvd25lZCk7XG5cbiAgICAgICAgdGhpcy5hcHByb3ZlRXZlbnQodHJ1ZSwgZnJvbSwgc3BlbmRlciwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBhcHByb3ZlRXZlbnQ6IGZ1bmN0aW9uIChzdGF0dXMsIGZyb20sIHNwZW5kZXIsIHZhbHVlKSB7XG4gICAgICAgIEV2ZW50LlRyaWdnZXIodGhpcy5uYW1lKCksIHtcbiAgICAgICAgICAgIFN0YXR1czogc3RhdHVzLFxuICAgICAgICAgICAgQXBwcm92ZToge1xuICAgICAgICAgICAgICAgIG93bmVyOiBmcm9tLFxuICAgICAgICAgICAgICAgIHNwZW5kZXI6IHNwZW5kZXIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhbGxvd2FuY2U6IGZ1bmN0aW9uIChvd25lciwgc3BlbmRlcikge1xuICAgICAgICB2YXIgb3duZWQgPSB0aGlzLmFsbG93ZWQuZ2V0KG93bmVyKTtcblxuICAgICAgICBpZiAob3duZWQgaW5zdGFuY2VvZiBBbGxvd2VkKSB7XG4gICAgICAgICAgICB2YXIgc3BlbmRlciA9IG93bmVkLmdldChzcGVuZGVyKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3BlbmRlciAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwZW5kZXIudG9TdHJpbmcoMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIjBcIjtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0YW5kYXJkVG9rZW47XG4iLCJBcmdzIjoiW1wiU3RhbmRhcmRUb2tlblwiLCBcIk5SQ1wiLCAxOCwgXCIxMDAwMDAwMDAwXCJdIn1A6gdKEAAAAAAAAAAAAAAAAACYloBSEAAAAAAAAAAAAAAAAAAehIBYAWJBzLnQpTR8uYTW5xIGqPczXiqRprpIHoWBYsKmcKlvB3cW2qE+5a8+u2aTneZG6sklZyumXPu5TewnNWWJRfOQ7gE="; byte[] result = ByteUtils.Base64ToBytes(encodedText); Transaction transaction = Transaction.FromProto(result); byte[] originData = transaction.getData().getPayload().toByteArray(); // System.out.println(new String(originData)); TransactionDeployPayload payload = TransactionDeployPayload.LoadPayload(originData); byte[] data = payload.toBytes(); // System.out.println(new String(data)); Assert.assertTrue(ByteUtils.Equal(originData, data)); }
BigInteger gasPrice = new BigInteger("1000000"); // 0 < gasPrice < 10^12 BigInteger gasLimit = new BigInteger("200000"); // 20000 < gasPrice < 50*10^9 Transaction tx = new Transaction(chainID, from, to, value, nonce + 1, payloadType, payload, gasPrice, gasLimit); byte[] rawData = tx.toProto();
@Test public void callPayload() throws Exception { String encodedText = "CiA5i5zaH6+kSIxjX88xUNPH0LeoknGppfOa23UfS2NH9xIaGVeK0IDCTtos0J+e5qlQ7tNjSM3HvaFl6SwaGhlYM0hO38lXyHfazlcblGGsAOEIsm0ZdxMEIhAAAAAAAAAAAAAAAAAAAAABKAEw5rzr1gU6JQoEY2FsbBIdeyJGdW5jdGlvbiI6Im5hbWUiLCJBcmdzIjoiIn1A6gdKEAAAAAAAAAAAAAAAAAAPQkBSEAAAAAAAAAAAAAAAAAAehIBYAWJBCAb6x7JZ4PE1NhfZj6vjVMh2Y9nqVE5sPBN4OYAOr1MzKP7uty655vCIBURfv8A0JtafaYTbz8Bjy1OiumbLpwE="; byte[] result = ByteUtils.Base64ToBytes(encodedText); Transaction transaction = Transaction.FromProto(result); byte[] originData = transaction.getData().getPayload().toByteArray(); TransactionCallPayload payload = TransactionCallPayload.LoadPayload(originData); byte[] data = payload.toBytes(); Assert.assertTrue(ByteUtils.Equal(originData, data)); } }