Ejemplo n.º 1
0
        /// <summary>
        /// Deterministically derive channel keys from the seed. that means it does not depend on `startingTime` you
        /// passed in constructor.
        /// </summary>
        /// <param name="channelValueSatoshis"></param>
        /// <param name="param1"></param>
        /// <param name="param2"></param>
        /// <returns></returns>
        public ChannelKeys DeriveChannelKeys(ulong channelValueSatoshis, ulong param1, ulong param2)
        {
            var channelId    = (uint)((param1 & 0xFFFF_FFFF_0000_0000) >> 32);
            var childPrivKey = _channelMasterKey.Derive(channelId);
            var uniqueStart  =
                param2.GetBytesBigEndian()
                .Concat(((uint)param1).GetBytesBigEndian())
                .Concat(_seed)
                .Concat(childPrivKey.PrivateKey.ToBytes());
            var seed           = Hashes.SHA256(uniqueStart.ToArray());
            var commitmentSeed = Hashes.SHA256(seed.Concat(_ascii.DecodeData("commitment seed")).ToArray());

            var fundingKey            = Hashes.SHA256(commitmentSeed.Concat(_ascii.DecodeData("funding key")).ToArray());
            var revocationBaseKey     = Hashes.SHA256(fundingKey.Concat(_ascii.DecodeData("revocation base key")).ToArray());
            var paymentKey            = Hashes.SHA256(revocationBaseKey.Concat(_ascii.DecodeData("payment key")).ToArray());
            var delayedPaymentBaseKey = Hashes.SHA256(paymentKey.Concat(_ascii.DecodeData("delayed payment base key")).ToArray());
            var htlcBaseKey           = Hashes.SHA256(delayedPaymentBaseKey.Concat(_ascii.DecodeData("HTLC base key")).ToArray());

            return(new ChannelKeys(new Key(fundingKey), new Key(revocationBaseKey), new Key(paymentKey), new Key(delayedPaymentBaseKey), new Key(htlcBaseKey), new uint256(commitmentSeed), channelValueSatoshis, param1, param2));
        }