Skip to content

Commit

Permalink
Working check:data
Browse files Browse the repository at this point in the history
  • Loading branch information
fireduck64 committed Oct 21, 2020
1 parent 40955c7 commit cb9c62d
Show file tree
Hide file tree
Showing 8 changed files with 179 additions and 13 deletions.
4 changes: 4 additions & 0 deletions curl/addr.bal
@@ -0,0 +1,4 @@
curl -d '{"network_identifier": {"blockchain":"snowblossom","network":"mainnet"}, "block_identifier":{"index":12}, "account_identifier":{"address":"snow:dk7traxesh3z3x27r5tp9qmmdrqjvv752fpc9anp"} }' -H "Content-Type: application/json" http://localhost:8080/account/balance | jq .

echo ""

2 changes: 1 addition & 1 deletion curl/block
@@ -1,4 +1,4 @@
curl -d '{"network_identifier": {"blockchain":"snowblossom","network":"mainnet"}, "block_identifier":{"index":10} }' -H "Content-Type: application/json" http://localhost:8080/block/ | jq .
curl -d '{"network_identifier": {"blockchain":"snowblossom","network":"mainnet"}, "block_identifier":{"index":129142} }' -H "Content-Type: application/json" http://localhost:8080/block/ | jq .

echo ""

4 changes: 4 additions & 0 deletions curl/block.0
@@ -0,0 +1,4 @@
curl -d '{"network_identifier": {"blockchain":"snowblossom","network":"mainnet"}, "block_identifier":{"index":0} }' -H "Content-Type: application/json" http://localhost:8080/block/ | jq .

echo ""

65 changes: 64 additions & 1 deletion src/main/java/io/swagger/controllers/Account.java
Expand Up @@ -7,6 +7,7 @@
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import java.io.File;
import java.util.List;
import java.util.LinkedList;

import io.swagger.model.*;

Expand All @@ -15,6 +16,16 @@
import io.swagger.model.Error;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import snowblossom.lib.ChainHash;
import snowblossom.node.SnowBlossomNode;

import org.snowblossom.rosesnow.RoseSnow;
import org.snowblossom.rosesnow.RoseUtil;
import snowblossom.client.StubHolder;
import snowblossom.client.GetUTXOUtil;
import snowblossom.proto.BlockHeader;
import snowblossom.lib.AddressSpecHash;
import snowblossom.lib.TransactionBridge;

@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.JavaInflectorServerCodegen", date = "2020-10-18T05:48:04.106Z[GMT]")
public class Account
Expand All @@ -32,10 +43,62 @@ public ResponseContext accountBalance(RequestContext request , JsonNode body)
NetworkIdentifier id = req.getNetworkIdentifier();
AccountIdentifier acct = req.getAccountIdentifier();

PartialBlockIdentifier pbi = req.getBlockIdentifier();
ChainHash block_hash = null;
int block_idx;
SnowBlossomNode node = RoseSnow.getNode(id);

if (pbi != null)
{
if (pbi.getHash() != null) block_hash = new ChainHash(pbi.getHash());
else
{
block_hash = node.getDB().getBlockHashAtHeight(pbi.getIndex().intValue());
}
}


StubHolder stub_holder = RoseSnow.getClient(id);

if (block_hash == null)
{
BlockHeader head = node.getBlockIngestor().getHead().getHeader();
block_hash = new ChainHash( head.getSnowHash());

}
BlockHeader header = node.getDB().getBlockSummaryMap().get(block_hash.getBytes()).getHeader();

AddressSpecHash addr = new AddressSpecHash( acct.getAddress(), node.getParams());


List<TransactionBridge> bridges = GetUTXOUtil.getSpendableValidatedStatic(
addr,
stub_holder.getBlockingStub(),
header.getUtxoRootHash());


AccountBalanceResponse resp = new AccountBalanceResponse();
long total = 0;
LinkedList<Coin> coins = new LinkedList<>();
for(TransactionBridge br : bridges)
{
total += br.value;
Coin c = new Coin();
c.setAmount( RoseUtil.getSnowAmount( br.value, node.getParams() ));

ChainHash tx_out = new ChainHash(br.in.getSrcTxId());
int out_idx = br.in.getSrcTxOutIdx();

c.setCoinIdentifier( new CoinIdentifier().identifier( tx_out.toString() + ":" + out_idx));

coins.add(c);

}
resp.setCoins(coins);
resp.getBalances().add( RoseUtil.getSnowAmount( total, node.getParams() ) );
resp.setBlockIdentifier( new BlockIdentifier().hash(block_hash.toString()).index( (long) header.getBlockHeight()));

return new ResponseContext().status(Status.INTERNAL_SERVER_ERROR).entity( "Not implemented" );
return new ResponseContext().entity(resp);
}

}
Expand Down
40 changes: 32 additions & 8 deletions src/main/java/io/swagger/controllers/Block.java
Expand Up @@ -52,22 +52,28 @@ public ResponseContext block(RequestContext request , JsonNode body)

io.swagger.model.Block b = new io.swagger.model.Block();



b.setBlockIdentifier( new BlockIdentifier()
.index( (long) blk.getHeader().getBlockHeight() )
.hash( new ChainHash(blk.getHeader().getSnowHash()).toString() ));
if (blk.getHeader().getBlockHeight() > 0)

if (blk.getHeader().getBlockHeight() == 0)
{
b.setParentBlockIdentifier( b.getBlockIdentifier());

}
else
{
long p = (long) blk.getHeader().getBlockHeight()-1;

b.setParentBlockIdentifier( new BlockIdentifier()
.index( (long) blk.getHeader().getBlockHeight()-1 )
.index( p )
.hash( new ChainHash(blk.getHeader().getPrevBlockHash()).toString() ));
}
b.setTimestamp( blk.getHeader().getTimestamp() );

for( snowblossom.proto.Transaction s_tx : blk.getTransactionsList() )
{
b.getTransactions().add( RoseUtil.protoToModel(s_tx));
b.getTransactions().add( RoseUtil.protoToModel(s_tx, node.getDB(), node.getParams()) );
}


Expand All @@ -76,9 +82,27 @@ public ResponseContext block(RequestContext request , JsonNode body)
return new ResponseContext().entity(resp);
}

public ResponseContext blockTransaction(RequestContext request , JsonNode body ) {
return new ResponseContext().status(Status.INTERNAL_SERVER_ERROR).entity( "Not implemented" );
}
public ResponseContext blockTransaction(RequestContext request , JsonNode body )
throws Exception
{
BlockTransactionRequest req = new ObjectMapper().readValue(body.toString(), BlockTransactionRequest.class);

NetworkIdentifier id = req.getNetworkIdentifier();
BlockIdentifier bi = req.getBlockIdentifier();
TransactionIdentifier ti = req.getTransactionIdentifier();

SnowBlossomNode node = RoseSnow.getNode(id);

ChainHash tx_id = new ChainHash(ti.getHash());

snowblossom.proto.Transaction s_tx = node.getDB().getTransactionMap().get(tx_id.getBytes());

BlockTransactionResponse resp = new BlockTransactionResponse();

resp.setTransaction( RoseUtil.protoToModel(s_tx, node.getDB(), node.getParams()) );

return new ResponseContext().entity( resp );
}

}

1 change: 1 addition & 0 deletions src/main/java/io/swagger/controllers/Network.java
Expand Up @@ -57,6 +57,7 @@ public ResponseContext networkOptions(RequestContext request , JsonNode body )
allow.getOperationTypes().add("SPEND");
allow.getOperationTypes().add("RECEIVE");

allow.getOperationStatuses().add(new OperationStatus().status("OK").successful(true));
allow.getOperationStatuses().add(new OperationStatus().status("CONFIRMED").successful(true));
allow.getOperationStatuses().add(new OperationStatus().status("PENDING").successful(true));
allow.setHistoricalBalanceLookup(true);
Expand Down
28 changes: 27 additions & 1 deletion src/main/java/rosesnow/RoseSnow.java
Expand Up @@ -10,6 +10,9 @@
import java.util.TreeMap;
import snowblossom.lib.Globals;
import snowblossom.lib.LogSetup;
import snowblossom.client.StubHolder;
import snowblossom.client.StubUtil;
import snowblossom.lib.NetworkParams;

import java.util.Enumeration;
import java.util.Properties;
Expand All @@ -19,7 +22,6 @@
import java.util.logging.Logger;



/**
* The idea here is we have a bunch of static methods that can be called
* from the API controller classes. Everything should be thread safe.
Expand All @@ -31,6 +33,8 @@ public class RoseSnow


private static HashMap<NetworkIdentifier, SnowBlossomNode> node_map = new HashMap<>();
private static HashMap<NetworkIdentifier, StubHolder> client_map = new HashMap<>();


/**
* @param id Identifier of network
Expand Down Expand Up @@ -69,21 +73,43 @@ public static SnowBlossomNode getNode(NetworkIdentifier id, boolean start)
cm.put("addr_index", "true");
cm.put("db_path", getBaseDbPath() +"/" + network);


ConfigMem config = new ConfigMem(cm);

NetworkParams params = NetworkParams.loadFromConfig(config);
int port = params.getDefaultPort()*3;

cm.put("service_port", ""+port);

config = new ConfigMem(cm);

LogSetup.setup(config);
LogSetup.fixLevels();

SnowBlossomNode node = new SnowBlossomNode(new ConfigMem(cm));

node_map.put(id, node);

StubHolder stub_holder = new StubHolder( StubUtil.openChannel("grpc://localhost:" + port, params));
client_map.put(id, stub_holder);

return node;

}

}

public static StubHolder getClient(NetworkIdentifier id)
throws Exception
{
getNode(id, true);
synchronized(node_map)
{
return client_map.get(id);
}

}


public static String getBaseDbPath()
{
Expand Down
48 changes: 46 additions & 2 deletions src/main/java/rosesnow/RoseUtil.java
Expand Up @@ -8,13 +8,20 @@
import snowblossom.proto.TransactionInput;
import snowblossom.proto.TransactionOutput;

import snowblossom.lib.db.DB;
import snowblossom.lib.ChainHash;
import snowblossom.lib.AddressSpecHash;
import snowblossom.lib.NetworkParams;

public class RoseUtil
{

public static Transaction protoToModel( snowblossom.proto.Transaction s_tx)
public static Transaction protoToModel( snowblossom.proto.Transaction s_tx, DB snow_db, NetworkParams params)
{
Transaction tx = new Transaction();
tx.setTransactionIdentifier( new TransactionIdentifier().hash( new ChainHash(s_tx.getTxHash()).toString() ));
ChainHash tx_id = new ChainHash(s_tx.getTxHash());

tx.setTransactionIdentifier( new TransactionIdentifier().hash( tx_id.toString() ));

TransactionInner inner = TransactionUtil.getInner(s_tx);

Expand All @@ -26,26 +33,63 @@ public static Transaction protoToModel( snowblossom.proto.Transaction s_tx)
o.setType("SPEND");
o.setStatus("OK");

AddressSpecHash spec_hash = new AddressSpecHash(tx_in.getSpecHash());
ChainHash src_tx_id = new ChainHash(tx_in.getSrcTxId());
int src_idx = tx_in.getSrcTxOutIdx();

o.setAccount( new AccountIdentifier().address( spec_hash.toAddressString(params) ));

snowblossom.proto.Transaction src_tx = snow_db.getTransactionMap().get(src_tx_id.getBytes());
TransactionInner src_tx_inner = TransactionUtil.getInner(src_tx);

long value = src_tx_inner.getOutputs(src_idx).getValue();

// Question, should spent amounts be negative? Probably
o.setAmount( getSnowAmount(-value, params) );

o.setCoinChange(
new CoinChange()
.coinAction(CoinAction.SPENT)
.coinIdentifier(new CoinIdentifier().identifier(src_tx_id.toString()+":" + src_idx))
);

tx.getOperations().add(o);
tx_idx++;
}

int out_idx=0;
for(TransactionOutput tx_out : inner.getOutputsList())
{
Operation o = new Operation();
o.setOperationIdentifier( new OperationIdentifier().index(tx_idx) );
o.setType("RECEIVE");
o.setStatus("OK");

long value = tx_out.getValue();
AddressSpecHash spec_hash = new AddressSpecHash( tx_out.getRecipientSpecHash() );
o.setAmount( getSnowAmount(value, params) );
o.setAccount( new AccountIdentifier().address( spec_hash.toAddressString(params) ));

o.setCoinChange(
new CoinChange()
.coinAction(CoinAction.CREATED)
.coinIdentifier(new CoinIdentifier().identifier(tx_id.toString()+":" + out_idx))
);


tx.getOperations().add(o);
tx_idx++;
out_idx++;
}



return tx;
}
public static Amount getSnowAmount(long value, NetworkParams params)
{
Currency c = new Currency().symbol(params.getAddressPrefix().toUpperCase()).decimals(6);
return new Amount().value("" + value).currency(c);
}

}

0 comments on commit cb9c62d

Please sign in to comment.