use of neo.model.core.TransactionOutput in project neo-java by coranos.
the class AbstractJsonMockBlockDb method getUnspentTransactionOutputListMap.
@Override
public Map<UInt256, Map<TransactionOutput, CoinReference>> getUnspentTransactionOutputListMap(final UInt160 account) {
final Map<UInt256, Map<TransactionOutput, CoinReference>> assetIdTxoMap = new TreeMap<>();
final JSONArray mockBlockDb = getMockBlockDb();
for (int ix = 0; ix < mockBlockDb.length(); ix++) {
final JSONObject mockBlock = mockBlockDb.getJSONObject(ix);
final Block block = getBlock(mockBlock, true);
for (int txIx = 0; txIx < block.getTransactionList().size(); txIx++) {
final Transaction transaction = block.getTransactionList().get(txIx);
for (final TransactionOutput output : transaction.outputs) {
if (output.scriptHash.equals(account)) {
if (!assetIdTxoMap.containsKey(output.assetId)) {
assetIdTxoMap.put(output.assetId, new TreeMap<>());
}
final CoinReference cr = new CoinReference(transaction.getHash(), new UInt16(txIx));
assetIdTxoMap.get(output.assetId).put(output, cr);
}
}
}
}
return assetIdTxoMap;
}
use of neo.model.core.TransactionOutput in project neo-java by coranos.
the class MockUtil method getTransactionOutput001.
public static TransactionOutput getTransactionOutput001() {
final int minSize = UInt256.SIZE + UInt160.SIZE + Fixed8.SIZE;
final byte[] ba = new byte[minSize];
final UInt256 neoHash = ModelUtil.NEO_HASH;
final byte[] neoBytes = neoHash.getBytesCopy();
ArrayUtils.reverse(neoBytes);
System.arraycopy(neoBytes, 0, ba, 0, neoBytes.length);
return new TransactionOutput(ByteBuffer.wrap(ba));
}
use of neo.model.core.TransactionOutput in project neo-java by coranos.
the class TestRpcServer method test022CityOfZionGetClaims.
/**
* test CoZ gethistory.
*/
@Test
public void test022CityOfZionGetClaims() {
final JSONArray params = new JSONArray();
final Block block = CONTROLLER.getLocalNodeData().getBlockDb().getFullBlockFromHeight(0);
final Transaction transaction = block.getTransactionList().get(block.getTransactionList().size() - 1);
final TransactionOutput to = transaction.outputs.get(0);
final String address = ModelUtil.scriptHashToAddress(to.scriptHash);
final String uri = CityOfZionCommandEnum.CLAIMS.getUriPrefix() + address;
final String method = CoreRpcCommandEnum.UNKNOWN.getName();
final String expectedStrRaw = TestUtil.getJsonTestResourceAsString(TEST_PACKAGE, getClass().getSimpleName(), "test022CityOfZionGetClaims");
CityOfZionCommandEnum.getCommandStartingWith(uri);
final String actualStrRaw = TestRpcServerUtil.getResponse(CONTROLLER, uri, RpcServerUtil.VERSION_2_0, params, method);
final String expectedStr = new JSONObject(expectedStrRaw).toString(2);
final String actualStr = new JSONObject(actualStrRaw).toString(2);
Assert.assertEquals(TestUtil.RESPONSES_MUST_MATCH, expectedStr, actualStr);
}
use of neo.model.core.TransactionOutput in project neo-java by coranos.
the class TestRpcServer method test020CityOfZionGetBalance.
/**
* test CoZ getbalance.
*/
@Test
public void test020CityOfZionGetBalance() {
final JSONArray params = new JSONArray();
final Block block = CONTROLLER.getLocalNodeData().getBlockDb().getFullBlockFromHeight(0);
final Transaction transaction = block.getTransactionList().get(block.getTransactionList().size() - 1);
final TransactionOutput to = transaction.outputs.get(0);
final String address = ModelUtil.scriptHashToAddress(to.scriptHash);
final String uri = CityOfZionCommandEnum.BALANCE.getUriPrefix() + address;
final String method = CoreRpcCommandEnum.UNKNOWN.getName();
final String expectedStrRaw = TestUtil.getJsonTestResourceAsString(TEST_PACKAGE, getClass().getSimpleName(), "test020CityOfZionGetBalance");
CityOfZionCommandEnum.getCommandStartingWith(uri);
final String actualStrRaw = TestRpcServerUtil.getResponse(CONTROLLER, uri, RpcServerUtil.VERSION_2_0, params, method);
final String expectedStr = new JSONObject(expectedStrRaw).toString(2);
final String actualStr = new JSONObject(actualStrRaw).toString(2);
Assert.assertEquals(TestUtil.RESPONSES_MUST_MATCH, expectedStr, actualStr);
}
use of neo.model.core.TransactionOutput in project neo-java by coranos.
the class TestAccountPng method test001GetAccountSankey.
@Test
public void test001GetAccountSankey() throws JSONException, IOException {
LOG.debug("STARTED png");
final LocalNodeData localNodeData = CONTROLLER.getLocalNodeData();
final BlockDb blockDb = localNodeData.getBlockDb();
final long maxIndex = blockDb.getHeaderOfBlockWithMaxIndex().getIndexAsLong();
final CoinData neoData = new CoinData();
final CoinData gasData = new CoinData();
final Map<UInt256, CoinData> coinDataMap = new TreeMap<>();
coinDataMap.put(ModelUtil.NEO_HASH, neoData);
coinDataMap.put(ModelUtil.GAS_HASH, gasData);
final File dir = new File("/Users/dps/git-coranos.github.io/neo/charts");
final Map<UInt256, File> coinFileMap = new TreeMap<>();
coinFileMap.put(ModelUtil.NEO_HASH, new File(dir, "neo-account.png"));
coinFileMap.put(ModelUtil.GAS_HASH, new File(dir, "gas-account.png"));
long startMs = -1;
for (long blockIx = 0; blockIx <= maxIndex; blockIx++) {
LOG.debug("STARTED png {} of {} ", blockIx, maxIndex);
final Block block = blockDb.getFullBlockFromHeight(blockIx);
for (final Transaction t : block.getTransactionList()) {
// update assets based on tx inputs.
for (final CoinReference cr : t.inputs) {
final TransactionOutput ti = ModelUtil.getTransactionOutput(blockDb, cr);
if (coinDataMap.containsKey(ti.assetId)) {
final CoinData coinData = coinDataMap.get(ti.assetId);
final UInt160 input = ti.scriptHash;
if (!coinData.accountValueMap.containsKey(input)) {
coinData.accountValueMap.put(input, ModelUtil.FIXED8_ZERO);
coinData.newAccountSet.add(input);
}
final Fixed8 oldValue = coinData.accountValueMap.get(input);
final Fixed8 newValue = ModelUtil.subtract(ti.value, oldValue);
if (newValue.equals(ModelUtil.FIXED8_ZERO)) {
coinData.accountValueMap.remove(input);
} else {
coinData.accountValueMap.put(input, newValue);
}
}
}
// update assets based on tx outputs.
for (int outputIx = 0; outputIx < t.outputs.size(); outputIx++) {
final TransactionOutput to = t.outputs.get(outputIx);
final UInt160 output = to.scriptHash;
if (coinDataMap.containsKey(to.assetId)) {
final CoinData coinData = coinDataMap.get(to.assetId);
coinData.txAccountSet.add(output);
if (!coinData.accountValueMap.containsKey(output)) {
coinData.accountValueMap.put(output, ModelUtil.FIXED8_ZERO);
coinData.newAccountSet.add(output);
}
final Fixed8 oldValue = coinData.accountValueMap.get(output);
final Fixed8 newValue = ModelUtil.add(oldValue, to.value);
if (newValue.equals(ModelUtil.FIXED8_ZERO)) {
coinData.accountValueMap.remove(output);
} else {
coinData.accountValueMap.put(output, newValue);
}
}
}
for (final UInt256 assetId : coinDataMap.keySet()) {
final CoinData coinData = coinDataMap.get(assetId);
for (final UInt160 txAccount : coinData.txAccountSet) {
MapUtil.increment(coinData.newAccountTxCountMap, txAccount);
}
coinData.txAccountSet.clear();
}
}
final Timestamp blockTs = block.getTimestamp();
if (startMs < 0) {
startMs = blockTs.getTime();
}
final long ms = blockTs.getTime() - startMs;
if (ms > (86400 * 1000)) {
final String targetDateStr = DATE_FORMAT.format(blockTs);
for (final UInt256 assetId : coinDataMap.keySet()) {
final CoinData coinData = coinDataMap.get(assetId);
final List<UInt160> accountList = new ArrayList<>();
accountList.addAll(coinData.accountValueMap.keySet());
Collections.sort(accountList, new Comparator<UInt160>() {
@Override
public int compare(final UInt160 account1, final UInt160 account2) {
final Long value1 = coinData.accountValueMap.get(account1).value;
final Long value2 = coinData.accountValueMap.get(account2).value;
return value1.compareTo(value2);
}
});
Collections.reverse(accountList);
long maxTx = 0;
long totalValue = 0;
{
final List<DrawingData> drawingData = new ArrayList<>();
coinData.drawingDataList.add(drawingData);
int startDayPixel = 0;
int visibleAccountCount = 0;
for (final UInt160 account : accountList) {
totalValue += coinData.accountValueMap.get(account).value;
}
for (final UInt160 account : accountList) {
final int scaleLength = getScaleLength(coinData.accountValueMap, account, totalValue);
if (scaleLength != 0) {
visibleAccountCount++;
}
MapUtil.touch(coinData.newAccountTxCountMap, account);
maxTx = Math.max(maxTx, coinData.newAccountTxCountMap.get(account));
}
final float greenStep = 1.0f / visibleAccountCount;
final float redStep = 1.0f / maxTx;
float green = 1.0f;
for (final UInt160 account : accountList) {
final int scaleLength = getScaleLength(coinData.accountValueMap, account, totalValue);
if (scaleLength != 0) {
final float blue;
if (coinData.newAccountSet.contains(account)) {
blue = 1.0f;
} else {
blue = 0.0f;
}
float red = 0.0f;
if (coinData.newAccountTxCountMap.containsKey(account)) {
red = redStep * coinData.newAccountTxCountMap.get(account);
} else {
red = 0.0f;
}
drawingData.add(new DrawingData(startDayPixel, scaleLength, red, green, blue));
}
green -= greenStep;
startDayPixel += scaleLength;
}
}
final BufferedImage im = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
final Graphics2D g = (Graphics2D) im.getGraphics();
g.scale((WIDTH * 1.0) / coinData.drawingDataList.size(), 1.0 / HEIGHT_SUBPIXELS);
for (int x = 0; x < coinData.drawingDataList.size(); x++) {
final List<DrawingData> drawingData = coinData.drawingDataList.get(x);
for (final DrawingData drawing : drawingData) {
g.setColor(new Color(drawing.r, drawing.g, drawing.b));
g.fillRect(x, drawing.y, 1, drawing.h);
g.setColor(Color.black);
g.drawLine(x, drawing.y, x + 1, drawing.y);
}
}
g.dispose();
final File file = coinFileMap.get(assetId);
ImageIO.write(im, "png", file);
LOG.info("INTERIM file {}, {} of {}, date {}, accountList {}, tx {}, value {}", file.getName(), INTEGER_FORMAT.format(blockIx), INTEGER_FORMAT.format(maxIndex), targetDateStr, INTEGER_FORMAT.format(accountList.size()), INTEGER_FORMAT.format(maxTx), INTEGER_FORMAT.format(totalValue / ModelUtil.DECIMAL_DIVISOR));
startMs = blockTs.getTime();
coinData.newAccountSet.clear();
coinData.newAccountTxCountMap.clear();
}
}
}
LOG.debug("SUCCESS png");
}
Aggregations