Skip to content
This repository has been archived by the owner on Sep 26, 2019. It is now read-only.

Commit

Permalink
Change eea_getPrivateTransaction endpoint to accept hex
Browse files Browse the repository at this point in the history
  • Loading branch information
Puneetha17 committed Jul 11, 2019
1 parent f89f922 commit 005495a
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
/*
* Copyright 2019 ConsenSys AG.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package tech.pegasys.pantheon.ethereum.jsonrpc.methods;

import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;

import tech.pegasys.orion.testutil.OrionTestHarness;
import tech.pegasys.orion.testutil.OrionTestHarnessFactory;
import tech.pegasys.pantheon.crypto.SECP256K1;
import tech.pegasys.pantheon.enclave.Enclave;
import tech.pegasys.pantheon.enclave.types.SendRequest;
import tech.pegasys.pantheon.enclave.types.SendResponse;
import tech.pegasys.pantheon.ethereum.core.Address;
import tech.pegasys.pantheon.ethereum.core.PrivacyParameters;
import tech.pegasys.pantheon.ethereum.core.Wei;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.JsonRpcRequest;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.methods.privacy.EeaGetPrivateTransaction;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.parameters.JsonRpcParameter;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.response.JsonRpcSuccessResponse;
import tech.pegasys.pantheon.ethereum.privacy.PrivateTransaction;
import tech.pegasys.pantheon.ethereum.privacy.Restriction;
import tech.pegasys.pantheon.ethereum.rlp.BytesValueRLPOutput;
import tech.pegasys.pantheon.util.bytes.BytesValue;

import java.io.IOException;
import java.math.BigInteger;
import java.util.Base64;

import com.google.common.collect.Lists;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class EeaGetPrivateTransactionIntegrationTest {

@ClassRule public static final TemporaryFolder folder = new TemporaryFolder();

private static Enclave enclave;

private static OrionTestHarness testHarness;

@BeforeClass
public static void setUpOnce() throws Exception {
folder.create();

testHarness =
OrionTestHarnessFactory.create(
folder.newFolder().toPath(), "orion_key_0.pub", "orion_key_0.key");

enclave = new Enclave(testHarness.clientUrl());
}

@AfterClass
public static void tearDownOnce() {
testHarness.stopOrion();
}

@Test
public void testUpCheck() throws IOException {
assertTrue(enclave.upCheck());
}

private final Address sender =
Address.fromHexString("0x0000000000000000000000000000000000000003");
private static final SECP256K1.KeyPair KEY_PAIR =
SECP256K1.KeyPair.create(
SECP256K1.PrivateKey.create(
new BigInteger(
"8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", 16)));

private final PrivateTransaction privateTransaction =
PrivateTransaction.builder()
.nonce(0)
.gasPrice(Wei.of(1000))
.gasLimit(3000000)
.to(null)
.value(Wei.ZERO)
.payload(
BytesValue.fromHexString(
"0x608060405234801561001057600080fd5b5060d08061001f60003960"
+ "00f3fe60806040526004361060485763ffffffff7c01000000"
+ "00000000000000000000000000000000000000000000000000"
+ "60003504166360fe47b18114604d5780636d4ce63c14607557"
+ "5b600080fd5b348015605857600080fd5b5060736004803603"
+ "6020811015606d57600080fd5b50356099565b005b34801560"
+ "8057600080fd5b506087609e565b6040805191825251908190"
+ "0360200190f35b600055565b6000549056fea165627a7a7230"
+ "5820cb1d0935d14b589300b12fcd0ab849a7e9019c81da24d6"
+ "daa4f6b2f003d1b0180029"))
.sender(sender)
.chainId(BigInteger.valueOf(2018))
.privateFrom(
BytesValue.wrap("A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo=".getBytes(UTF_8)))
.privateFor(
Lists.newArrayList(
BytesValue.wrap("A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo=".getBytes(UTF_8))))
.restriction(Restriction.RESTRICTED)
.signAndBuild(KEY_PAIR);

private final JsonRpcParameter parameters = new JsonRpcParameter();

private final PrivacyParameters privacyParameters = mock(PrivacyParameters.class);

@Test
public void returnsStoredPrivateTransaction() throws Exception {
final EeaGetPrivateTransaction eeaGetPrivateTransaction =
new EeaGetPrivateTransaction(enclave, parameters, privacyParameters);

final BytesValueRLPOutput bvrlp = new BytesValueRLPOutput();
privateTransaction.writeTo(bvrlp);

SendRequest sendRequest =
new SendRequest(
Base64.getEncoder().encodeToString(bvrlp.encoded().extractArray()),
"A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo=",
Lists.newArrayList("A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="));
SendResponse sendResponse = enclave.send(sendRequest);

String hexKey = BytesValue.wrap(Base64.getDecoder().decode(sendResponse.getKey())).toString();
final Object[] params = new Object[] {hexKey};
final JsonRpcRequest request = new JsonRpcRequest("1", "eea_getPrivateTransaction", params);

final JsonRpcSuccessResponse response =
(JsonRpcSuccessResponse) eeaGetPrivateTransaction.response(request);
final PrivateTransaction result = (PrivateTransaction) response.getResult();

assertEquals(privateTransaction, result);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,11 @@ public JsonRpcResponse response(final JsonRpcRequest request) {
final String enclaveKey = parameters.required(request.getParams(), 0, String.class);
try {
ReceiveResponse receiveResponse =
getReceiveResponseFromEnclave(enclaveKey, privacyParameters.getEnclavePublicKey());
getReceiveResponseFromEnclave(
Base64.getEncoder()
.encodeToString(BytesValue.fromHexString(enclaveKey).extractArray()),
privacyParameters.getEnclavePublicKey());

LOG.trace("Received transaction information from Enclave");

final BytesValueRLPInput bytesValueRLPInput =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ public Orion getOrion() {
return orion;
}

public void stopOrion() {
orion.stop();
}

public Config getConfig() {
return config;
}
Expand Down

0 comments on commit 005495a

Please sign in to comment.