/// <summary>
        /// The create.
        /// </summary>
        /// <param name="leftNode">
        /// The left node.
        /// </param>
        /// <param name="rightNode">
        /// The right node.
        /// </param>
        /// <returns>
        /// The <see cref="MerkleNode"/>.
        /// </returns>
        public MerkleNode Create(MerkleNode leftNode, MerkleNode rightNode = null)
        {
            var  hashTrits     = new int[Constants.TritHashLength];
            var  leftNodeTrits = leftNode.Hash.ToTrits();
            Hash hash;

            if (rightNode != null)
            {
                this.Curl.Reset();
                this.Curl.Absorb(leftNodeTrits);
                this.Curl.Absorb(rightNode.Hash.ToTrits());
                this.Curl.Squeeze(hashTrits);
                hash = new Hash(Converter.TritsToTrytes(hashTrits));
            }
            else
            {
                hash = leftNode.Hash;
            }

            return(new MerkleNode(leftNode, rightNode)
            {
                Hash = hash
            });
        }