// messageSummary returns a human-readable string which summarizes a message. // Not all messages have or need a summary. This is used for debug logging. func messageSummary(msg btcwire.Message) string { switch msg := msg.(type) { case *btcwire.MsgVersion: return fmt.Sprintf("agent %s, pver %d, block %d", msg.UserAgent, msg.ProtocolVersion, msg.LastBlock) case *btcwire.MsgVerAck: // No summary. case *btcwire.MsgGetAddr: // No summary. case *btcwire.MsgAddr: return fmt.Sprintf("%d addr", len(msg.AddrList)) case *btcwire.MsgPing: // No summary - perhaps add nonce. case *btcwire.MsgPong: // No summary - perhaps add nonce. case *btcwire.MsgAlert: // No summary. case *btcwire.MsgMemPool: // No summary. case *btcwire.MsgTx: hash, _ := msg.TxSha() return fmt.Sprintf("hash %s, %d inputs, %d outputs, lock %s", hash, len(msg.TxIn), len(msg.TxOut), formatLockTime(msg.LockTime)) case *btcwire.MsgBlock: header := &msg.Header hash, _ := msg.BlockSha() return fmt.Sprintf("hash %s, ver %d, %d tx, %s", hash, header.Version, len(msg.Transactions), header.Timestamp) case *btcwire.MsgInv: return invSummary(msg.InvList) case *btcwire.MsgNotFound: return invSummary(msg.InvList) case *btcwire.MsgGetData: return invSummary(msg.InvList) case *btcwire.MsgGetBlocks: return locatorSummary(msg.BlockLocatorHashes, &msg.HashStop) case *btcwire.MsgGetHeaders: return locatorSummary(msg.BlockLocatorHashes, &msg.HashStop) case *btcwire.MsgHeaders: return fmt.Sprintf("num %d", len(msg.Headers)) case *btcwire.MsgReject: // Ensure the variable length strings don't contain any // characters which are even remotely dangerous such as HTML // control characters, etc. Also limit them to sane length for // logging. rejCommand := sanitizeString(msg.Cmd, btcwire.CommandSize) rejReason := sanitizeString(msg.Reason, maxRejectReasonLen) summary := fmt.Sprintf("cmd %v, code %v, reason %v", rejCommand, msg.Code, rejReason) if rejCommand == btcwire.CmdBlock || rejCommand == btcwire.CmdTx { summary += fmt.Sprintf(", hash %v", msg.Hash) } return summary } // No summary for other messages. return "" }
// messageSummary returns a human-readable string which summarizes a message. // Not all messages have or need a summary. This is used for debug logging. func messageSummary(msg btcwire.Message) string { switch msg := msg.(type) { case *btcwire.MsgVersion: return fmt.Sprintf("agent %s, pver %d, block %d", msg.UserAgent, msg.ProtocolVersion, msg.LastBlock) case *btcwire.MsgVerAck: // No summary. case *btcwire.MsgGetAddr: // No summary. case *btcwire.MsgAddr: return fmt.Sprintf("%d addr", len(msg.AddrList)) case *btcwire.MsgPing: // No summary - perhaps add nonce. case *btcwire.MsgPong: // No summary - perhaps add nonce. case *btcwire.MsgAlert: // No summary. case *btcwire.MsgMemPool: // No summary. case *btcwire.MsgTx: hash, _ := msg.TxSha() return fmt.Sprintf("hash %s, %d inputs, %d outputs, lock %s", hash, len(msg.TxIn), len(msg.TxOut), formatLockTime(msg.LockTime)) case *btcwire.MsgBlock: header := &msg.Header hash, _ := msg.BlockSha() return fmt.Sprintf("hash %s, ver %d, %d tx, %s", hash, header.Version, header.TxnCount, header.Timestamp) case *btcwire.MsgInv: return invSummary(msg.InvList) case *btcwire.MsgNotFound: return invSummary(msg.InvList) case *btcwire.MsgGetData: return invSummary(msg.InvList) case *btcwire.MsgGetBlocks: return locatorSummary(msg.BlockLocatorHashes, &msg.HashStop) case *btcwire.MsgGetHeaders: return locatorSummary(msg.BlockLocatorHashes, &msg.HashStop) case *btcwire.MsgHeaders: return fmt.Sprintf("num %d", len(msg.Headers)) } // No summary for other messages. return "" }