public void Create() { // create the first part. using (var stream = new MemoryStream()) { stream.WriteValueU32(Version.LittleEndian()); // write version if (PoolConfig.Coin.Options.IsProofOfStakeHybrid) // if coin is a proof-of-stake coin { stream.WriteValueU32(BlockTemplate.CurTime); // include time-stamp in the transaction. } // write transaction input stream.WriteBytes(Serializers.VarInt(InputsCount)); stream.WriteBytes(Inputs.First().PreviousOutput.Hash.Bytes); stream.WriteValueU32(Inputs.First().PreviousOutput.Index.LittleEndian()); // write signature script lenght var signatureScriptLenght = (UInt32)(Inputs.First().SignatureScript.Initial.Length + ExtraNonce.ExtraNoncePlaceholder.Length + Inputs.First().SignatureScript.Final.Length); stream.WriteBytes(Serializers.VarInt(signatureScriptLenght).ToArray()); stream.WriteBytes(Inputs.First().SignatureScript.Initial); Initial = stream.ToArray(); } /* The generation transaction must be split at the extranonce (which located in the transaction input * scriptSig). Miners send us unique extranonces that we use to join the two parts in attempt to create * a valid share and/or block. */ // create the second part. using (var stream = new MemoryStream()) { // transaction input stream.WriteBytes(Inputs.First().SignatureScript.Final); stream.WriteValueU32(Inputs.First().Sequence); // transaction inputs end here. // transaction output var outputBuffer = Outputs.GetBuffer(); stream.WriteBytes(outputBuffer); // transaction output ends here. stream.WriteValueU32(LockTime.LittleEndian()); if (PoolConfig.Coin.Options.TxMessageSupported) { stream.WriteBytes(TxMessage); } Final = stream.ToArray(); } }
public void TestOutputs() { var outputs = new Outputs(_daemonClient); // setup the outputs based on the sample. double blockReward = 5000000000; // the amount rewarded by the block. // sample recipient const string recipient = "mrwhWEDnU6dUtHZJ2oBswTpEdbBHgYiMji"; var amount = blockReward * 0.01; blockReward -= amount; outputs.AddRecipient(recipient, amount); // sample pool wallet const string poolWallet = "mk8JqN1kNWju8o3DXEijiJyn7iqkwktAWq"; outputs.AddPoolWallet(poolWallet, blockReward); // test the recipient rewards outputs.List.Last().Value.Should().Equal((UInt64)0x0000000002faf080); // packInt64LE: 80f0fa0200000000 outputs.List.Last().PublicKeyScriptLenght.Should().Equal(new byte[] { 0x19 }); outputs.List.Last().PublicKeyScript.ToHexString().Should().Equal("76a9147d576fbfca48b899dc750167dd2a2a6572fff49588ac"); // test the pool wallet outputs.List.First().Value.Should().Equal((UInt64)0x00000001270b0180); // packInt64LE: 80010b2701000000 outputs.List.First().PublicKeyScriptLenght.Should().Equal(new byte[] { 0x19 }); outputs.List.First().PublicKeyScript.ToHexString().Should().Equal("76a914329035234168b8da5af106ceb20560401236849888ac"); // test the outputs buffer. outputs.GetBuffer().ToHexString().Should().Equal("0280010b27010000001976a914329035234168b8da5af106ceb20560401236849888ac80f0fa02000000001976a9147d576fbfca48b899dc750167dd2a2a6572fff49588ac"); }