Пример #1
0
        internal override byte[] GenerateBytes()
        {
            var builder = new FlatBufferBuilder(1);


            // create vectors
            var signatureVector = SecretLockTransactionBuffer.CreateSignatureVector(builder, new byte[64]);
            var signerVector    = SecretLockTransactionBuffer.CreateSignerVector(builder, GetSigner());
            var feeVector       = SecretLockTransactionBuffer.CreateMaxFeeVector(builder, MaxFee?.ToUInt8Array());
            var deadlineVector  =
                SecretLockTransactionBuffer.CreateDeadlineVector(builder, Deadline.Ticks.ToUInt8Array());
            var mosaicIdVector     = SecretLockTransactionBuffer.CreateMosaicIdVector(builder, Mosaic.Id.Id.ToUInt8Array());
            var mosaicAmountVector =
                SecretLockTransactionBuffer.CreateMosaicAmountVector(builder, Mosaic.Amount.ToUInt8Array());
            var durationVector  = SecretLockTransactionBuffer.CreateDurationVector(builder, Duration.ToUInt8Array());
            var secretVector    = SecretLockTransactionBuffer.CreateSecretVector(builder, Secret.DecodeHexString());
            var recipientVector =
                SecretLockTransactionBuffer.CreateRecipientVector(builder, Recipient.Plain.FromBase32String());

            var version = int.Parse(NetworkType.GetValueInByte().ToString("X") + "0" + Version.ToString("X"),
                                    NumberStyles.HexNumber);

            // mosaicID, amount, duration, hash algo, secret, recipient
            var totalSize = GetSerializedSize();

            SecretLockTransactionBuffer.StartSecretLockTransactionBuffer(builder);
            SecretLockTransactionBuffer.AddSize(builder, (uint)totalSize);
            SecretLockTransactionBuffer.AddSignature(builder, signatureVector);
            SecretLockTransactionBuffer.AddSigner(builder, signerVector);
            SecretLockTransactionBuffer.AddVersion(builder, (uint)version);
            SecretLockTransactionBuffer.AddType(builder, TransactionType.GetValue());
            SecretLockTransactionBuffer.AddMaxFee(builder, feeVector);
            SecretLockTransactionBuffer.AddDeadline(builder, deadlineVector);
            SecretLockTransactionBuffer.AddMosaicId(builder, mosaicIdVector);
            SecretLockTransactionBuffer.AddMosaicAmount(builder, mosaicAmountVector);
            SecretLockTransactionBuffer.AddDuration(builder, durationVector);
            SecretLockTransactionBuffer.AddHashAlgorithm(builder, HashType.GetValueInByte());
            SecretLockTransactionBuffer.AddSecret(builder, secretVector);
            SecretLockTransactionBuffer.AddRecipient(builder, recipientVector);

            // end build
            var codedTransfer = SecretLockTransactionBuffer.EndSecretLockTransactionBuffer(builder);

            builder.Finish(codedTransfer.Value);

            var output = new SecretLockTransactionSchema().Serialize(builder.SizedByteArray());

            if (output.Length != totalSize)
            {
                throw new SerializationException("Serialized form has incorrect length");
            }

            return(output);
        }
        internal override byte[] GenerateBytes()
        {
            var builder = new FlatBufferBuilder(1);


            // create vectors
            var signatureVector = SecretProofTransactionBuffer.CreateSignatureVector(builder, new byte[64]);
            var signerVector    = SecretProofTransactionBuffer.CreateSignerVector(builder, GetSigner());
            var feeVector       = SecretProofTransactionBuffer.CreateMaxFeeVector(builder, MaxFee?.ToUInt8Array());
            var deadlineVector  =
                SecretProofTransactionBuffer.CreateDeadlineVector(builder, Deadline.Ticks.ToUInt8Array());
            var secretVector = SecretLockTransactionBuffer.CreateSecretVector(builder, Secret.DecodeHexString());
            var proofVector  = SecretProofTransactionBuffer.CreateProofVector(builder, Proof.DecodeHexString());
            var version      = int.Parse(NetworkType.GetValueInByte().ToString("X") + "0" + Version.ToString("X"),
                                         NumberStyles.HexNumber);
            var recipientVector = SecretProofTransactionBuffer.CreateRecipientVector(builder, Recipient.GetBytes());

            int totalSize = GetSerializedSize();


            SecretProofTransactionBuffer.StartSecretProofTransactionBuffer(builder);
            SecretProofTransactionBuffer.AddSize(builder, (uint)totalSize);
            SecretProofTransactionBuffer.AddSignature(builder, signatureVector);
            SecretProofTransactionBuffer.AddSigner(builder, signerVector);
            SecretProofTransactionBuffer.AddVersion(builder, (uint)version);
            SecretProofTransactionBuffer.AddType(builder, TransactionType.GetValue());
            SecretProofTransactionBuffer.AddMaxFee(builder, feeVector);
            SecretProofTransactionBuffer.AddDeadline(builder, deadlineVector);
            SecretProofTransactionBuffer.AddHashAlgorithm(builder, HashType.GetValueInByte());
            SecretProofTransactionBuffer.AddRecipient(builder, recipientVector);
            SecretProofTransactionBuffer.AddSecret(builder, secretVector);
            SecretProofTransactionBuffer.AddProofSize(builder, Convert.ToUInt16(Proof.DecodeHexString().Length));
            SecretProofTransactionBuffer.AddProof(builder, proofVector);

            var codedSecretProof = SecretProofTransactionBuffer.EndSecretProofTransactionBuffer(builder);

            builder.Finish(codedSecretProof.Value);

            var output = new SecretProofTransactionSchema().Serialize(builder.SizedByteArray());

            if (output.Length != totalSize)
            {
                throw new SerializationException("Serialized form has incorrect length");
            }

            return(output);
        }
Пример #3
0
        /// <summary>
        ///     Creates address from public key
        /// </summary>
        /// <param name="publicKey"></param>
        /// <param name="networkType"></param>
        /// <returns></returns>
        public static Address CreateFromPublicKey(string publicKey, NetworkType networkType)
        {
            // step 1) sha-3(256) public key
            var digestSha3 = new Sha3Digest(256);
            var stepOne    = new byte[Key];

            digestSha3.BlockUpdate(publicKey.FromHex(), 0, Key);
            digestSha3.DoFinal(stepOne, 0);

            // step 2) perform ripemd160 on previous step
            var digestRipeMd160 = new RipeMD160Digest();
            var stepTwo         = new byte[Ripemd160];

            digestRipeMd160.BlockUpdate(stepOne, 0, Key);
            digestRipeMd160.DoFinal(stepTwo, 0);

            // step3) prepend network byte
            var stepThree = new[] { networkType.GetValueInByte() }.Concat(stepTwo).ToArray();

            // step 4) perform sha3 on previous step
            var stepFour = new byte[Key];

            digestSha3.BlockUpdate(stepThree, 0, Ripemd160 + 1);
            digestSha3.DoFinal(stepFour, 0);

            // step 5) retrieve checksum
            var stepFive = new byte[Checksum];

            Array.Copy(stepFour, 0, stepFive, 0, Checksum);

            // step 6) append stepFive to result of stepThree
            var stepSix = new byte[AddressDecoded];

            Array.Copy(stepThree, 0, stepSix, 0, Ripemd160 + 1);
            Array.Copy(stepFive, 0, stepSix, Ripemd160 + 1, Checksum);

            // step 7) return base 32 encode address byte array
            return(CreateFromRawAddress(stepSix.ToBase32String()));
        }
 private static void NetworkTypeValueInByteIsX(NetworkType networkType, byte expectedValue)
 {
     networkType.GetValueInByte().Should().Be(expectedValue);
 }