/// <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)); }