Skip to content

Commit 7644726

Browse files
authored
Merge pull request #1965 from tronprotocol/releases_easytransferasset
Releases easytransferasset
2 parents 4d56578 + eac2f3c commit 7644726

File tree

5 files changed

+248
-2
lines changed

5 files changed

+248
-2
lines changed

src/main/java/org/tron/core/services/RpcApiService.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import org.tron.api.GrpcAPI.BytesMessage;
3535
import org.tron.api.GrpcAPI.DelegatedResourceList;
3636
import org.tron.api.GrpcAPI.DelegatedResourceMessage;
37+
import org.tron.api.GrpcAPI.EasyTransferAssetByPrivateMessage;
38+
import org.tron.api.GrpcAPI.EasyTransferAssetMessage;
3739
import org.tron.api.GrpcAPI.EasyTransferByPrivateMessage;
3840
import org.tron.api.GrpcAPI.EasyTransferMessage;
3941
import org.tron.api.GrpcAPI.EasyTransferResponse;
@@ -727,6 +729,39 @@ private EasyTransferResponse easyTransfer(byte[] privateKey, ByteString toAddres
727729
return responseBuild.build();
728730
}
729731

732+
private EasyTransferResponse easyTransferAsset(byte[] privateKey, ByteString toAddress,
733+
String assetId, long amount) {
734+
TransactionCapsule transactionCapsule;
735+
GrpcAPI.Return.Builder returnBuilder = GrpcAPI.Return.newBuilder();
736+
EasyTransferResponse.Builder responseBuild = EasyTransferResponse.newBuilder();
737+
try {
738+
ECKey ecKey = ECKey.fromPrivate(privateKey);
739+
byte[] owner = ecKey.getAddress();
740+
TransferAssetContract.Builder builder = TransferAssetContract.newBuilder();
741+
builder.setOwnerAddress(ByteString.copyFrom(owner));
742+
builder.setToAddress(toAddress);
743+
builder.setAssetName(ByteString.copyFrom(assetId.getBytes()));
744+
builder.setAmount(amount);
745+
transactionCapsule = createTransactionCapsule(builder.build(),
746+
ContractType.TransferAssetContract);
747+
transactionCapsule.sign(privateKey);
748+
GrpcAPI.Return retur = wallet.broadcastTransaction(transactionCapsule.getInstance());
749+
responseBuild.setTransaction(transactionCapsule.getInstance());
750+
responseBuild.setTxid(transactionCapsule.getTransactionId().getByteString());
751+
responseBuild.setResult(retur);
752+
} catch (ContractValidateException e) {
753+
returnBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR)
754+
.setMessage(ByteString.copyFromUtf8(e.getMessage()));
755+
responseBuild.setResult(returnBuilder.build());
756+
} catch (Exception e) {
757+
returnBuilder.setResult(false).setCode(response_code.OTHER_ERROR)
758+
.setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage()));
759+
responseBuild.setResult(returnBuilder.build());
760+
}
761+
762+
return responseBuild.build();
763+
}
764+
730765
@Override
731766
public void easyTransfer(EasyTransferMessage req,
732767
StreamObserver<EasyTransferResponse> responseObserver) {
@@ -736,6 +771,16 @@ public void easyTransfer(EasyTransferMessage req,
736771
responseObserver.onCompleted();
737772
}
738773

774+
@Override
775+
public void easyTransferAsset(EasyTransferAssetMessage req,
776+
StreamObserver<EasyTransferResponse> responseObserver) {
777+
byte[] privateKey = wallet.pass2Key(req.getPassPhrase().toByteArray());
778+
EasyTransferResponse response = easyTransferAsset(privateKey, req.getToAddress(),
779+
req.getAssetId(), req.getAmount());
780+
responseObserver.onNext(response);
781+
responseObserver.onCompleted();
782+
}
783+
739784
@Override
740785
public void easyTransferByPrivate(EasyTransferByPrivateMessage req,
741786
StreamObserver<EasyTransferResponse> responseObserver) {
@@ -745,6 +790,16 @@ public void easyTransferByPrivate(EasyTransferByPrivateMessage req,
745790
responseObserver.onCompleted();
746791
}
747792

793+
@Override
794+
public void easyTransferAssetByPrivate(EasyTransferAssetByPrivateMessage req,
795+
StreamObserver<EasyTransferResponse> responseObserver) {
796+
byte[] privateKey = req.getPrivateKey().toByteArray();
797+
EasyTransferResponse response = easyTransferAsset(privateKey, req.getToAddress(),
798+
req.getAssetId(), req.getAmount());
799+
responseObserver.onNext(response);
800+
responseObserver.onCompleted();
801+
}
802+
748803
@Override
749804
public void broadcastTransaction(Transaction req,
750805
StreamObserver<GrpcAPI.Return> responseObserver) {
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.tron.core.services.http;
2+
3+
import com.google.protobuf.ByteString;
4+
import java.io.IOException;
5+
import java.util.stream.Collectors;
6+
import javax.servlet.http.HttpServlet;
7+
import javax.servlet.http.HttpServletRequest;
8+
import javax.servlet.http.HttpServletResponse;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.stereotype.Component;
12+
import org.tron.api.GrpcAPI;
13+
import org.tron.api.GrpcAPI.EasyTransferAssetByPrivateMessage;
14+
import org.tron.api.GrpcAPI.EasyTransferResponse;
15+
import org.tron.api.GrpcAPI.Return.response_code;
16+
import org.tron.common.crypto.ECKey;
17+
import org.tron.core.Wallet;
18+
import org.tron.core.capsule.TransactionCapsule;
19+
import org.tron.protos.Contract.TransferAssetContract;
20+
import org.tron.protos.Protocol.Transaction.Contract.ContractType;
21+
22+
23+
@Component
24+
@Slf4j
25+
public class EasyTransferAssetByPrivateServlet extends HttpServlet {
26+
27+
@Autowired
28+
private Wallet wallet;
29+
30+
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
31+
32+
}
33+
34+
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
35+
GrpcAPI.Return.Builder returnBuilder = GrpcAPI.Return.newBuilder();
36+
EasyTransferResponse.Builder responseBuild = EasyTransferResponse.newBuilder();
37+
try {
38+
String input = request.getReader().lines()
39+
.collect(Collectors.joining(System.lineSeparator()));
40+
EasyTransferAssetByPrivateMessage.Builder build = EasyTransferAssetByPrivateMessage
41+
.newBuilder();
42+
JsonFormat.merge(input, build);
43+
byte[] privateKey = build.getPrivateKey().toByteArray();
44+
ECKey ecKey = ECKey.fromPrivate(privateKey);
45+
byte[] owner = ecKey.getAddress();
46+
TransferAssetContract.Builder builder = TransferAssetContract.newBuilder();
47+
builder.setOwnerAddress(ByteString.copyFrom(owner));
48+
builder.setToAddress(build.getToAddress());
49+
builder.setAssetName(ByteString.copyFrom(build.getAssetId().getBytes()));
50+
builder.setAmount(build.getAmount());
51+
52+
TransactionCapsule transactionCapsule;
53+
transactionCapsule = wallet
54+
.createTransactionCapsule(builder.build(), ContractType.TransferAssetContract);
55+
transactionCapsule.sign(privateKey);
56+
GrpcAPI.Return retur = wallet.broadcastTransaction(transactionCapsule.getInstance());
57+
responseBuild.setTransaction(transactionCapsule.getInstance());
58+
responseBuild.setResult(retur);
59+
response.getWriter().println(Util.printEasyTransferResponse(responseBuild.build()));
60+
} catch (Exception e) {
61+
returnBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR)
62+
.setMessage(ByteString.copyFromUtf8(e.getMessage()));
63+
responseBuild.setResult(returnBuilder.build());
64+
try {
65+
response.getWriter().println(JsonFormat.printToString(responseBuild.build()));
66+
} catch (IOException ioe) {
67+
logger.debug("IOException: {}", ioe.getMessage());
68+
}
69+
return;
70+
}
71+
}
72+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package org.tron.core.services.http;
2+
3+
import com.google.protobuf.ByteString;
4+
import java.io.IOException;
5+
import java.util.stream.Collectors;
6+
import javax.servlet.http.HttpServlet;
7+
import javax.servlet.http.HttpServletRequest;
8+
import javax.servlet.http.HttpServletResponse;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.stereotype.Component;
12+
import org.tron.api.GrpcAPI;
13+
import org.tron.api.GrpcAPI.EasyTransferAssetMessage;
14+
import org.tron.api.GrpcAPI.EasyTransferResponse;
15+
import org.tron.api.GrpcAPI.Return.response_code;
16+
import org.tron.common.crypto.ECKey;
17+
import org.tron.core.Wallet;
18+
import org.tron.core.capsule.TransactionCapsule;
19+
import org.tron.core.exception.ContractValidateException;
20+
import org.tron.core.services.http.JsonFormat.ParseException;
21+
import org.tron.protos.Contract.TransferAssetContract;
22+
import org.tron.protos.Protocol.Transaction.Contract.ContractType;
23+
24+
25+
@Component
26+
@Slf4j
27+
public class EasyTransferAssetServlet extends HttpServlet {
28+
29+
@Autowired
30+
private Wallet wallet;
31+
32+
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
33+
34+
}
35+
36+
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
37+
GrpcAPI.Return.Builder returnBuilder = GrpcAPI.Return.newBuilder();
38+
EasyTransferResponse.Builder responseBuild = EasyTransferResponse.newBuilder();
39+
try {
40+
String input = request.getReader().lines()
41+
.collect(Collectors.joining(System.lineSeparator()));
42+
EasyTransferAssetMessage.Builder build = EasyTransferAssetMessage.newBuilder();
43+
JsonFormat.merge(input, build);
44+
byte[] privateKey = wallet.pass2Key(build.getPassPhrase().toByteArray());
45+
ECKey ecKey = ECKey.fromPrivate(privateKey);
46+
byte[] owner = ecKey.getAddress();
47+
TransferAssetContract.Builder builder = TransferAssetContract.newBuilder();
48+
builder.setOwnerAddress(ByteString.copyFrom(owner));
49+
builder.setToAddress(build.getToAddress());
50+
builder.setAssetName(ByteString.copyFrom(build.getAssetId().getBytes()));
51+
builder.setAmount(build.getAmount());
52+
53+
TransactionCapsule transactionCapsule;
54+
transactionCapsule = wallet
55+
.createTransactionCapsule(builder.build(), ContractType.TransferAssetContract);
56+
transactionCapsule.sign(privateKey);
57+
GrpcAPI.Return retur = wallet.broadcastTransaction(transactionCapsule.getInstance());
58+
responseBuild.setTransaction(transactionCapsule.getInstance());
59+
responseBuild.setResult(retur);
60+
response.getWriter().println(Util.printEasyTransferResponse(responseBuild.build()));
61+
} catch (ParseException e) {
62+
logger.debug("ParseException: {}", e.getMessage());
63+
returnBuilder.setResult(false).setCode(response_code.OTHER_ERROR)
64+
.setMessage(ByteString.copyFromUtf8(e.getMessage()));
65+
responseBuild.setResult(returnBuilder.build());
66+
try {
67+
response.getWriter().println(JsonFormat.printToString(responseBuild.build()));
68+
} catch (IOException ioe) {
69+
logger.debug("IOException: {}", ioe.getMessage());
70+
}
71+
return;
72+
} catch (IOException e) {
73+
logger.debug("IOException: {}", e.getMessage());
74+
returnBuilder.setResult(false).setCode(response_code.OTHER_ERROR)
75+
.setMessage(ByteString.copyFromUtf8(e.getMessage()));
76+
responseBuild.setResult(returnBuilder.build());
77+
try {
78+
response.getWriter().println(JsonFormat.printToString(responseBuild.build()));
79+
} catch (IOException ioe) {
80+
logger.debug("IOException: {}", ioe.getMessage());
81+
}
82+
return;
83+
} catch (ContractValidateException e) {
84+
returnBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR)
85+
.setMessage(ByteString.copyFromUtf8(e.getMessage()));
86+
responseBuild.setResult(returnBuilder.build());
87+
try {
88+
response.getWriter().println(JsonFormat.printToString(responseBuild.build()));
89+
} catch (IOException ioe) {
90+
logger.debug("IOException: {}", ioe.getMessage());
91+
}
92+
return;
93+
}
94+
}
95+
}

src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ public class FullNodeHttpApiService implements Service {
9898
@Autowired
9999
private EasyTransferByPrivateServlet easyTransferByPrivateServlet;
100100
@Autowired
101+
private EasyTransferAssetServlet easyTransferAssetServlet;
102+
@Autowired
103+
private EasyTransferAssetByPrivateServlet easyTransferAssetByPrivateServlet;
104+
@Autowired
101105
private CreateAddressServlet createAddressServlet;
102106
@Autowired
103107
private GenerateAddressServlet generateAddressServlet;
@@ -210,6 +214,8 @@ public void start() {
210214
context.addServlet(new ServletHolder(createAddressServlet), "/createaddress");
211215
context.addServlet(new ServletHolder(easyTransferServlet), "/easytransfer");
212216
context.addServlet(new ServletHolder(easyTransferByPrivateServlet), "/easytransferbyprivate");
217+
context.addServlet(new ServletHolder(easyTransferAssetServlet), "/easytransferasset");
218+
context.addServlet(new ServletHolder(easyTransferAssetByPrivateServlet), "/easytransferassetbyprivate");
213219
context.addServlet(new ServletHolder(generateAddressServlet), "/generateaddress");
214220
context.addServlet(new ServletHolder(validateAddressServlet), "/validateaddress");
215221
context.addServlet(new ServletHolder(deployContractServlet), "/deploycontract");

src/main/protos/api/api.proto

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ service Wallet {
3232
};
3333
};
3434

35-
3635
//Please use CreateTransaction2 instead of this function.
3736
rpc CreateTransaction (TransferContract) returns (Transaction) {
3837
option (google.api.http) = {
@@ -552,6 +551,12 @@ service Wallet {
552551
};
553552
};
554553
//Warning: do not invoke this interface provided by others.
554+
rpc EasyTransferAsset (EasyTransferAssetMessage) returns (EasyTransferResponse) {
555+
};
556+
//Warning: do not invoke this interface provided by others.
557+
rpc EasyTransferAssetByPrivate (EasyTransferAssetByPrivateMessage) returns (EasyTransferResponse) {
558+
};
559+
//Warning: do not invoke this interface provided by others.
555560
rpc EasyTransfer (EasyTransferMessage) returns (EasyTransferResponse) {
556561
option (google.api.http) = {
557562
post: "/wallet/easytransfer"
@@ -832,7 +837,6 @@ message DelegatedResourceList {
832837
repeated DelegatedResource delegatedResource = 1;
833838
}
834839

835-
836840
// Gossip node list
837841
message NodeList {
838842
repeated Node nodes = 1;
@@ -920,12 +924,26 @@ message EasyTransferMessage {
920924
int64 amount = 3;
921925
}
922926

927+
message EasyTransferAssetMessage {
928+
bytes passPhrase = 1;
929+
bytes toAddress = 2;
930+
string assetId = 3;
931+
int64 amount = 4;
932+
}
933+
923934
message EasyTransferByPrivateMessage {
924935
bytes privateKey = 1;
925936
bytes toAddress = 2;
926937
int64 amount = 3;
927938
}
928939

940+
message EasyTransferAssetByPrivateMessage {
941+
bytes privateKey = 1;
942+
bytes toAddress = 2;
943+
string assetId = 3;
944+
int64 amount = 4;
945+
}
946+
929947
message EasyTransferResponse {
930948
Transaction transaction = 1;
931949
Return result = 2;

0 commit comments

Comments
 (0)