コード例 #1
0
        public static TransactionForRpc ToTransactionForRpc(this IWeb3EthApi api, DeltaWithCid deltaWithCid, int transactionIndex)
        {
            var(delta, deltaCid) = deltaWithCid;
            var publicEntry = delta.PublicEntries[transactionIndex];
            var deltaNumber = delta.DeltaNumber;

            return(new TransactionForRpc
            {
                GasPrice = publicEntry.GasPrice.ToUInt256(),
                BlockHash = deltaCid,
                BlockNumber = (UInt256)deltaNumber,
                Nonce = publicEntry.Nonce,
                To = ToAddress(publicEntry.ReceiverAddress),
                From = ToAddress(publicEntry.SenderAddress),
                Value = publicEntry.Amount.ToUInt256(),
                Hash = publicEntry.GetHash(api.HashProvider),
                Data = publicEntry.Data.ToByteArray(),
                R = new byte[0],
                S = new byte[0],
                V = UInt256.Zero,
                Gas = publicEntry.GasLimit,
                TransactionIndex = (UInt256)transactionIndex
            });
        }
コード例 #2
0
        public static bool TryGetDeltaWithCid(this IWeb3EthApi api, BlockParameter block, out DeltaWithCid delta)
        {
            Cid cid;

            switch (block.Type)
            {
            case BlockParameterType.Earliest:
                cid = api.DeltaCache.GenesisHash;
                break;

            case BlockParameterType.Latest:
                cid = api.DeltaResolver.LatestDelta;
                break;

            case BlockParameterType.Pending:
                cid = api.DeltaResolver.LatestDelta;
                break;

            case BlockParameterType.BlockNumber:
                var blockNumber = block.BlockNumber.Value;
                if (!api.DeltaResolver.TryResolve(blockNumber, out cid))
                {
                    delta = default;
                    return(false);
                }

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            delta = api.GetDeltaWithCid(cid);
            return(true);
        }
コード例 #3
0
        public static CallOutputTracer CallAndRestore(this IWeb3EthApi api, TransactionForRpc transactionCall, DeltaWithCid deltaWithCid)
        {
            var    parentDelta = deltaWithCid.Delta;
            Keccak root        = parentDelta.StateRoot.ToKeccak();

            if (transactionCall.Gas == null)
            {
                transactionCall.Gas = parentDelta.GasLimit;
            }

            var publicEntry = api.ToPublicEntry(transactionCall, root);

            var newDelta = deltaWithCid.CreateOneOffDelta(publicEntry);

            CallOutputTracer callOutputTracer = new CallOutputTracer();

            api.StateProvider.StateRoot = root;
            api.Executor.CallAndReset(newDelta, callOutputTracer);
            api.StateProvider.Reset();
            api.StorageProvider.Reset();
            return(callOutputTracer);
        }