Skip to content

Instantly share code, notes, and snippets.

@cassc
Created November 5, 2024 09:44
Show Gist options
  • Save cassc/f2205b9276610abfd2dab3414fce23c6 to your computer and use it in GitHub Desktop.
Save cassc/f2205b9276610abfd2dab3414fce23c6 to your computer and use it in GitHub Desktop.
opcode_frequency_word_cloud
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# Mapping of hex opcodes to user-friendly names based on https://www.evm.codes/
opcode_map = {
"60": "PUSH1", "52": "MSTORE", "36": "CALLDATASIZE", "10": "LT", "61": "PUSH2", "57": "JUMPI",
"35": "CALLDATALOAD", "1C": "SHR", "80": "DUP1", "63": "PUSH4", "11": "GT", "14": "EQ",
"5B": "JUMPDEST", "03": "SUB", "81": "DUP2", "01": "ADD", "90": "SWAP1", "91": "SWAP2",
"56": "JUMP", "88": "DUP9", "8A": "DUP11", "12": "SLT", "15": "ISZERO", "82": "DUP3",
"8B": "DUP12", "50": "POP", "73": "PUSH20", "16": "AND", "92": "SWAP3", "97": "SWAP8",
"96": "SWAP7", "95": "SWAP6", "94": "SWAP5", "93": "SWAP4", "98": "SWAP9", "33": "CALLER",
"20": "SHA3", "54": "SSTORE", "86": "DUP7", "83": "DUP4", "43": "BLOCKHASH", "42": "COINBASE",
"87": "DUP8", "51": "MLOAD", "1B": "SHL", "3B": "EXTCODESIZE", "5A": "GAS", "FA": "STATICCALL",
"3D": "RETURNDATASIZE", "19": "NOT", "0B": "SDIV", "89": "DUP10", "85": "DUP6", "84": "DUP5",
"7E": "REVERT", "1A": "SAR", "53": "MSTORE8", "8C": "DUP13", "30": "ADDRESS", "8F": "DUP16",
"8E": "DUP15", "F1": "CALL", "00": "STOP", "34": "CALLVALUE", "04": "DIV", "F3": "RETURN",
"64": "PUSH5", "02": "MUL", "17": "OR", "7F": "PUSH32", "55": "SSTORE", "13": "SLT",
"05": "SDIV", "07": "DIV", "1D": "SAR", "67": "PUSH24", "62": "PUSH3", "70": "SWAP16",
"6F": "SWAP15", "6E": "SWAP14", "06": "MOD", "8D": "DUP14", "09": "SUB", "7B": "REVERT",
"77": "PUSH15", "9C": "SWAP28", "9E": "SWAP30", "9D": "SWAP29", "9B": "SWAP27", "9A": "SWAP26",
"99": "SWAP25", "66": "PUSH22", "69": "PUSH25", "6A": "PUSH26", "0A": "EXP", "3E": "RETURNDATASIZE",
"37": "CALLDATASIZE", "A3": "LOG3", "7C": "PUSH28", "32": "CALLDATALOAD", "38": "CODESIZE",
"74": "PUSH27", "18": "OR", "39": "CODECOPY", "6D": "SWAP13", "A1": "LOG1", "F4": "DELEGATECALL",
"6C": "SWAP12", "3F": "RETURNDATASIZE", "68": "PUSH9", "47": "BLOCKHASH", "A2": "LOG2",
"FD": "REVERT", "46": "BLOCKHASH", "65": "PUSH6", "A4": "LOG4", "6B": "SWAP11", "58": "GASPRICE",
"7D": "PUSH31", "71": "SWAP1", "79": "PUSH30", "75": "PUSH16", "76": "PUSH17", "78": "PUSH29",
"3A": "EXTCODEHASH", "9F": "SWAP31", "31": "CALLDATALOAD", "5F": "PUSH0", "40": "BLOCKHASH",
"48": "BLOCKHASH", "41": "BLOCKHASH", "08": "ADD", "72": "PUSH18", "F5": "CALLCODE",
"7A": "REVERT", "45": "BLOCKHASH", "44": "BLOCKHASH", "59": "MSIZE", "FE": "SELFDESTRUCT",
"F0": "CREATE", "FF": "SELFDESTRUCT"
}
# Original data (hex opcode and frequency)
# Complete opcode data with all given frequencies
opcode_data = {
"60": 153.0, "52": 32.0, "36": 5.0, "10": 7.0, "61": 99.0, "57": 48.0, "35": 7.0, "1C": 4.0,
"80": 43.0, "63": 28.0, "11": 11.0, "14": 24.0, "5B": 80.0, "03": 19.0, "81": 50.0, "01": 39.0,
"90": 61.0, "91": 28.0, "56": 47.0, "88": 10.0, "8A": 10.0, "12": 4.0, "15": 29.0, "82": 31.0,
"8B": 7.0, "50": 79.0, "73": 16.0, "16": 29.0, "92": 16.0, "97": 5.0, "96": 6.0, "95": 12.0,
"94": 9.0, "93": 17.0, "98": 5.0, "33": 4.0, "20": 7.0, "54": 11.0, "86": 18.0, "83": 23.0,
"43": 1.0, "42": 2.0, "87": 8.0, "51": 19.0, "1B": 22.0, "3B": 4.0, "5A": 7.0, "FA": 4.0,
"3D": 10.0, "19": 6.0, "0B": 38.0, "89": 12.0, "85": 10.0, "84": 16.0, "7E": 1.0, "1A": 3.0,
"53": 14.0, "8C": 4.0, "30": 5.0, "8F": 2.0, "8E": 2.0, "F1": 4.0, "00": 1.0, "34": 2.0,
"04": 8.0, "F3": 3.0, "64": 4.0, "02": 14.0, "17": 9.0, "7F": 5.0, "55": 3.0, "13": 3.0,
"05": 1.0, "07": 2.0, "1D": 3.0, "67": 9.0, "62": 1.0, "70": 2.0, "6F": 15.0, "6E": 5.0,
"06": 4.0, "8D": 5.0, "09": 9.0, "7B": 8.0, "77": 1.0, "9C": 4.0, "9E": 1.0, "9D": 3.0,
"9B": 3.0, "9A": 3.0, "99": 3.0, "66": 6.0, "69": 1.0, "6A": 1.0, "0A": 3.0, "3E": 2.0,
"37": 3.0, "A3": 1.0, "7C": 3.0, "32": 1.0, "38": 4.0, "74": 1.0, "18": 2.0, "39": 1.0,
"6D": 19.0, "A1": 1.0, "F4": 1.0, "6C": 2.0, "3F": 1.0, "68": 1.0, "47": 1.0, "A2": 1.0,
"FD": 1.0, "46": 1.0, "65": 1.0, "A4": 1.0, "6B": 1.0, "58": 8.0, "7D": 1.0, "71": 1.0,
"79": 1.0, "75": 1.0, "76": 2.0, "78": 2.0, "3A": 1.0, "9F": 2.0, "31": 1.0, "5F": 38.0,
"40": 1.0, "48": 1.0, "41": 1.0, "08": 84.0, "72": 1.0, "F5": 1.0, "7A": 2.0, "45": 1.0,
"44": 1.0, "59": 5.0, "FE": 1.0, "F0": 50.5, "FF": 1.0
}
# Convert the data to a dictionary with user-friendly opcodes
friendly_data = {opcode_map.get(k, k): v for k, v in opcode_data.items()}
# Generate the word cloud
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(friendly_data)
# Display the word cloud
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment