コード例 #1
0
        public async Task <AdmissionControl.SubmitTransactionResponse> SendTransactionAsync(
            byte[] privateKey, RawTransaction rawTransaction)
        {
            var         bytesTrx    = rawTransaction.ToByteArray();
            LibraHasher libraHasher = new LibraHasher(EHashType.RawTransaction);
            var         hash        = libraHasher.GetHash(bytesTrx);

            var key = Key.Import(SignatureAlgorithm.Ed25519, privateKey, KeyBlobFormat.RawPrivateKey);

            AdmissionControl.SubmitTransactionRequest req =
                new AdmissionControl.SubmitTransactionRequest();

            req.SignedTxn                 = new SignedTransaction();
            req.SignedTxn.RawTxnBytes     = ByteString.CopyFrom(bytesTrx);
            req.SignedTxn.SenderPublicKey =
                ByteString.CopyFrom(key.Export(KeyBlobFormat.RawPublicKey));
            var sig = SignatureAlgorithm.Ed25519.Sign(key, hash);

            req.SignedTxn.SenderSignature = ByteString.CopyFrom(sig);

            var result = await _client.SubmitTransactionAsync(
                req, new Metadata());

            return(result);
        }
コード例 #2
0
        // public async Task<bool> TransferCoins(Account sender, string receiverAddress, ulong amount, ulong gasUnitPrice = 0, ulong maxGasAmount = 1000000)
        public async Task <bool> TransferCoins(Account sender, string receiverAddress, ulong amount, ulong gasUnitPrice = 0, ulong maxGasAmount = 1000000)
        {
            try
            {
                var program = new Program();
                program.Code = Convert.FromBase64String(Constant.ProgamBase64Codes.PeerToPeerTxn).ToByteString();
                program.Arguments.Add(new TransactionArgument {
                    Type = TransactionArgument.Types.ArgType.Address, Data = receiverAddress.ToByteString()
                });
                program.Arguments.Add(new TransactionArgument {
                    Type = TransactionArgument.Types.ArgType.U64, Data = amount.ToBytes().Reverse().ToByteString()
                });

                var transaction = new RawTransaction();
                transaction.ExpirationTime = (ulong)Math.Floor((decimal)DateTimeOffset.Now.ToUnixTimeMilliseconds() / 1000) + 100;
                transaction.GasUnitPrice   = gasUnitPrice;
                transaction.MaxGasAmount   = maxGasAmount;
                var accountState = await QueryBalance(sender.Address);

                transaction.SequenceNumber = accountState.SequenceNumber;
                transaction.Program        = program;
                transaction.SenderAccount  = sender.Address.ToByteString();

                var hash            = new SHA3_256().ComputeVariable(Constant.HashSaltValues.RawTransactionHashSalt.FromHexToBytes().Concat(transaction.ToByteArray()).ToArray());
                var senderSignature = sender.KeyPair.Sign(hash);

                var request = new SubmitTransactionRequest
                {
                    SignedTxn = new SignedTransaction
                    {
                        RawTxnBytes     = transaction.ToByteString(),
                        SenderPublicKey = sender.PublicKey,
                        SenderSignature = senderSignature.ToByteString()
                    }
                };

                var response = await acClient.SubmitTransactionAsync(request);

                return(response.AcStatus.Code == AdmissionControlStatusCode.Accepted);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }