Exemplo n.º 1
0
        public Block MapBlock(Core.Block block, bool returnFullTransactionObjects)
        {
            var blockModel = new Block
            {
                Hash              = new Data(block.Hash.Bytes),
                Uncles            = block.Ommers?.Select(x => new Data(x.Hash.Bytes)).ToArray(),
                Transactions      = returnFullTransactionObjects ? block.Transactions?.Select(x => MapTransaction(x, block)).ToArray() : null,
                TransactionHashes = !returnFullTransactionObjects?block.Transactions?.Select(x => new Data(x.Hash.Bytes)).ToArray() : null
            };

            if (block.Header == null)
            {
                return(blockModel);
            }

            blockModel.Number           = new Quantity(block.Header.Number);
            blockModel.ParentHash       = new Data(block.Header.ParentHash.Bytes);
            blockModel.Nonce            = new Data(block.Header.Nonce.ToString());
            blockModel.Sha3Uncles       = new Data(block.Header.OmmersHash.Bytes);
            blockModel.LogsBloom        = new Data(block.Header.Bloom?.Bytes);
            blockModel.TransactionsRoot = new Data(block.Header.TransactionsRoot.Bytes);
            blockModel.StateRoot        = new Data(block.Header.StateRoot.Bytes);
            blockModel.ReceiptsRoot     = new Data(block.Header.ReceiptsRoot.Bytes);
            blockModel.Miner            = block.Header.Beneficiary != null ? new Data(block.Header.Beneficiary.Hex) : null;
            blockModel.Difficulty       = new Quantity(block.Header.Difficulty);
            //TotalDifficulty = new Quantity(block.Header.Difficulty),
            blockModel.ExtraData = new Data(block.Header.ExtraData);
            //Size = new Quantity(block.Header.)
            blockModel.GasLimit  = new Quantity(block.Header.GasLimit);
            blockModel.GasUsed   = new Quantity(block.Header.GasUsed);
            blockModel.Timestamp = new Quantity(block.Header.Timestamp);

            return(blockModel);
        }
Exemplo n.º 2
0
        public Block MapBlock(Core.Block block, bool returnFullTransactionObjects)
        {
            Transaction[] transactions      = null;
            Data[]        transactionHashes = null;
            if (returnFullTransactionObjects)
            {
                transactions = new Transaction[block.Transactions.Length];
            }
            else
            {
                transactionHashes = new Data[block.Transactions.Length];
            }

            for (int i = 0; i < block.Transactions.Length; i++)
            {
                if (returnFullTransactionObjects)
                {
                    transactions[i] = MapTransaction(block.Hash, block.Number, i, block.Transactions[i]);
                }
                else
                {
                    transactionHashes[i] = new Data(block.Transactions[i].Hash);
                }
            }

            var blockModel = new Block
            {
                Hash              = new Data(block.Hash.Bytes),
                Uncles            = block.Ommers?.Select(x => new Data(x.Hash)).ToArray(),
                Transactions      = transactions,
                TransactionHashes = transactionHashes
            };

            if (block.Header == null)
            {
                return(blockModel);
            }

            blockModel.Number           = new Quantity(block.Header.Number);
            blockModel.ParentHash       = new Data(block.Header.ParentHash);
            blockModel.Nonce            = new Data(block.Header.Nonce.ToString());
            blockModel.MixHash          = new Data(block.Header.MixHash?.ToString());
            blockModel.Sha3Uncles       = new Data(block.Header.OmmersHash);
            blockModel.LogsBloom        = new Data(block.Header.Bloom?.Bytes);
            blockModel.TransactionsRoot = new Data(block.Header.TransactionsRoot);
            blockModel.StateRoot        = new Data(block.Header.StateRoot);
            blockModel.ReceiptsRoot     = new Data(block.Header.ReceiptsRoot);
            blockModel.Miner            = block.Header.Beneficiary != null ? new Data(block.Header.Beneficiary) : null;
            blockModel.Difficulty       = new Quantity(block.Header.Difficulty);
            blockModel.TotalDifficulty  = new Quantity(block.Header.TotalDifficulty ?? 0);
            blockModel.ExtraData        = new Data(block.Header.ExtraData);
            //Size = new Quantity(block.Header.)
            blockModel.GasLimit  = new Quantity(block.Header.GasLimit);
            blockModel.GasUsed   = new Quantity(block.Header.GasUsed);
            blockModel.Timestamp = new Quantity(block.Header.Timestamp);

            return(blockModel);
        }
Exemplo n.º 3
0
 private BigInteger GetTransactionIndex(Core.Transaction transaction, Core.Block block)
 {
     for (var i = 0; i < block.Transactions.Length; i++)
     {
         var trans = block.Transactions[i];
         if (trans.Hash.Equals(transaction.Hash))
         {
             return(i);
         }
     }
     throw new Exception($"Cannot find transaction in block transactions based on transaction hash: {transaction.Hash}, blockHash: {block.Hash}.");
 }
Exemplo n.º 4
0
 public Transaction MapTransaction(Core.Transaction transaction, Core.Block block)
 {
     return(new Transaction
     {
         Hash = new Data(transaction.Hash.Bytes),
         Nonce = new Quantity(transaction.Nonce),
         BlockHash = block != null ? new Data(block.Hash.Bytes) : null,
         BlockNumber = block?.Header != null ? new Quantity(block.Header.Number) : null,
         TransactionIndex = block?.Transactions != null ? new Quantity(GetTransactionIndex(transaction, block)) : null,
         From = new Data(_signer.RecoverAddress(transaction, block.Number).Bytes),
         To = new Data(transaction.To.Bytes),
         Value = new Quantity(transaction.Value),
         GasPrice = new Quantity(transaction.GasPrice),
         Gas = new Quantity(transaction.GasLimit),
         Data = new Data(transaction.Data)
     });
 }
Exemplo n.º 5
0
        public Transaction MapTransaction(Core.Transaction transaction, Core.Block block)
        {
            throw new NotImplementedException(); // TODO: look at new transaction recover (that takes block number)

            return(new Transaction
            {
                Hash = new Data(transaction.Hash.Bytes),
                Nonce = new Quantity(transaction.Nonce),
                BlockHash = block != null ? new Data(block.Hash.Bytes) : null,
                BlockNumber = block?.Header != null ? new Quantity(block.Header.Number) : null,
                TransactionIndex = block?.Transactions != null ? new Quantity(GetTransactionIndex(transaction, block)) : null,
                From = new Data(_signer.RecoverAddress(transaction, block.Number).Hex),
                To = new Data(transaction.To.Hex),
                Value = new Quantity(transaction.Value),
                GasPrice = new Quantity(transaction.GasPrice),
                Gas = new Quantity(transaction.GasLimit),
                Data = new Data(transaction.Data)
            });
        }
Exemplo n.º 6
0
        public ResultWrapper <Transaction> eth_getTransactionByBlockNumberAndIndex(BlockParameter blockParameter, Quantity positionIndex)
        {
            if (_blockchainBridge.Head == null)
            {
                return(ResultWrapper <Transaction> .Fail($"Incorrect head block: {(_blockchainBridge.Head != null ? "HeadBlock is null" : "HeadBlock header is null")}"));
            }

            var result = GetBlock(blockParameter);

            if (result.Result.ResultType == ResultType.Failure)
            {
                return(ResultWrapper <Transaction> .Fail(result.Result.Error, result.ErrorType));
            }

            var index = positionIndex.AsNumber();

            if (!index.HasValue)
            {
                return(ResultWrapper <Transaction> .Fail("Position Index is required", ErrorType.InvalidParams));
            }

            if (index.Value < 0 || index.Value > result.Data.Transactions.Length - 1)
            {
                return(ResultWrapper <Transaction> .Fail("Position Index is incorrect", ErrorType.InvalidParams));
            }

            Core.Block block            = result.Data;
            var        transaction      = block.Transactions[(int)index.Value];
            var        transactionModel = _modelMapper.MapTransaction(block.Hash, block.Number, (int)index.Value, transaction);

            if (Logger.IsDebug)
            {
                Logger.Debug($"eth_getTransactionByBlockNumberAndIndex request {blockParameter}, index: {positionIndex.ToJson()}, result: {GetJsonLog(transactionModel.ToJson())}");
            }
            return(ResultWrapper <Transaction> .Success(transactionModel));
        }
Exemplo n.º 7
0
 public ResultWrapper <Data> eth_call(Transaction transactionCall, BlockParameter blockParameter)
 {
     Core.Block block  = GetBlock(blockParameter).Data;
     byte[]     result = _blockchainBridge.Call(block, _modelMapper.MapTransaction(transactionCall));
     return(ResultWrapper <Data> .Success(new Data(result)));
 }
Exemplo n.º 8
0
 public TransactionReceipt MapTransactionReceipt(Core.TransactionReceipt receipt, Core.Transaction transaction, Core.Block block)
 {
     return(new TransactionReceipt
     {
         TransactionHash = new Data(transaction.Hash.Bytes),
         TransactionIndex = block?.Transactions != null ? new Quantity(GetTransactionIndex(transaction, block)) : null,
         BlockHash = block != null ? new Data(block.Hash.Bytes) : null,
         BlockNumber = block?.Header != null ? new Quantity(block.Header.Number) : null,
         //CumulativeGasUsed = new Quantity(receipt.GasUsed),
         GasUsed = new Quantity(receipt.GasUsed),
         ContractAddress = transaction.IsContractCreation && receipt.Recipient != null ? new Data(receipt.Recipient.Hex) : null,
         Logs = receipt.Logs?.Select(MapLog).ToArray(),
         LogsBloom = new Data(receipt.Bloom?.Bytes),
         Status = new Quantity(receipt.StatusCode)
     });
 }