//Copied from https://en.bitcoin.it/wiki/Protocol_specification (19/04/2014) public void CanParseMessages() { TimeZoneInfo EST; try { EST = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); } catch (TimeZoneNotFoundException) { EST = TimeZoneInfo.FindSystemTimeZoneById("America/New_York"); } var tests = new[] { new { Version = 209U, Message = "f9beb4d976657273696f6e0000000000550000009c7c00000100000000000000e615104d00000000010000000000000000000000000000000000ffff0a000001208d010000000000000000000000000000000000ffff0a000002208ddd9d202c3ab457130055810100", Test = new Action <object>(o => { var version = (VersionPayload)o; Assert.Equal((ulong)0x1357B43A2C209DDD, version.Nonce); Assert.Equal("", version.UserAgent); Assert.Equal("::ffff:10.0.0.2", version.AddressFrom.Address.ToString()); Assert.Equal(8333, version.AddressFrom.Port); Assert.Equal(0x00018155, version.StartHeight); Assert.Equal <uint>(31900, version.Version); }) }, new { Version = 60002U, Message = "f9beb4d976657273696f6e000000000064000000358d493262ea0000010000000000000011b2d05000000000010000000000000000000000000000000000ffff000000000000000000000000000000000000000000000000ffff0000000000003b2eb35d8ce617650f2f5361746f7368693a302e372e322fc03e0300", Test = new Action <object>(o => { var version = (VersionPayload)o; Assert.Equal("/Satoshi:0.7.2/", version.UserAgent); Assert.Equal(0x00033EC0, version.StartHeight); }) }, new { Version = 70012U, Message = "f9beb4d976657261636b000000000000000000005df6e0e2", Test = new Action <object>(o => { var verack = (VerAckPayload)o; }) }, new { Version = 60002U, Message = "f9beb4d96164647200000000000000001f000000ed52399b01e215104d010000000000000000000000000000000000ffff0a000001208d", Test = new Action <object>(o => { var addr = (AddrPayload)o; Assert.Equal(1, addr.Addresses.Length); //"Mon Dec 20 21:50:10 EST 2010" var date = TimeZoneInfo.ConvertTime(addr.Addresses[0].Time, EST); Assert.Equal(20, date.Day); Assert.Equal(12, date.Month); Assert.Equal(2010, date.Year); Assert.Equal(21, date.Hour); }) }, }; foreach (var test in tests) { var message = Network.Main.ParseMessage(TestUtils.ParseHex(test.Message), test.Version); test.Test(message.Payload); var bytes = message.ToBytes(test.Version); var old = message; message = new Message(); message.FromBytes(bytes, test.Version); test.Test(message.Payload); Assert.Equal(test.Message, Encoders.Hex.EncodeData(message.ToBytes(test.Version))); } }