{"id":3934,"date":"2026-10-12T12:02:54","date_gmt":"2026-10-12T12:02:54","guid":{"rendered":"https:\/\/nownodes.io\/blog\/?p=3934"},"modified":"2026-10-12T12:02:55","modified_gmt":"2026-10-12T12:02:55","slug":"transaction-calldata-explained-how-to-decode-input-data","status":"publish","type":"post","link":"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/","title":{"rendered":"Transaction Calldata Explained: How to Decode Input Data"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Every Ethereum transaction that touches a smart contract carries a block of hexadecimal data. That block is the calldata, and it tells the contract which function to run and what arguments to pass. On its own it looks like a wall of random hex \u2014 something like <code>0xa9059cbb000...<\/code>. Decode it, and the wall turns into a plain instruction: send 1 token to this address.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A plain ETH transfer between two wallets has no calldata at all; the data field is empty. The moment a transaction calls a contract \u2014 a token transfer, a swap, an approval \u2014 calldata appears and carries the full intent of the call.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers what transaction calldata is, how it&#8217;s structured, and how to decode it with and without the contract&#8217;s ABI. It also looks at what calldata costs in gas and how it differs from Solidity&#8217;s <code>calldata<\/code> keyword, <code>memory<\/code>, and <code>storage<\/code> \u2014 two things people often mix up.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"what-is-transaction-input-data\">What Is Transaction Input Data?<\/h2>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"972\" height=\"1024\" src=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-74-972x1024.png\" alt=\"\" class=\"wp-image-3936\" srcset=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-74-972x1024.png 972w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-74-285x300.png 285w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-74-767x808.png 767w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-74.png 1222w\" sizes=\"auto, (max-width: 972px) 100vw, 972px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Calldata is the input data attached to a transaction and sent to a smart contract when the transaction runs. In a transaction object it lives in the <code>data<\/code> field. When you fetch a transaction back from an Ethereum endpoint, the same bytes appear under the <code>input<\/code> field.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The contract reads those bytes to decide what to do. Calldata is read-only and exists only for the duration of the call, which makes it the cheapest place a contract can read inputs from.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the data field is empty (<code>0x<\/code>), the transaction simply moves ETH. If it contains bytes, the transaction is calling a function \u2014 and those bytes encode both the function and its arguments.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"how-is-input-data-structured\">How Is Input Data Structured?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Calldata follows a fixed layout defined by the Ethereum <a href=\"https:\/\/docs.soliditylang.org\/en\/latest\/abi-spec.html\" rel=\"nofollow noopener noreferrer\">Contract ABI<\/a> (Application Binary Interface). The first 4 bytes identify the function. Everything after that is the function&#8217;s arguments, encoded in 32-byte chunks.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"what-is-a-function-selector\">What Is a Function Selector?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">The function selector is the first 4 bytes of the calldata, and it&#8217;s how a contract knows which function you want. It&#8217;s calculated as the first 4 bytes of the Keccak-256 hash of the function&#8217;s signature \u2014 the name plus its parameter types, with no spaces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the ERC-20 <code>transfer<\/code> function, the signature is <code>transfer(address,uint256)<\/code>. Hash it, take the first 4 bytes, and you get <code>0xa9059cbb<\/code>. Any transfer on any ERC-20 token starts with those same 4 bytes.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"how-arguments-are-encoded\">How Arguments Are Encoded<\/h3>\n\n\n<p class=\"wp-block-paragraph\">After the selector, each argument is padded to 32 bytes and laid out in order. Fixed-size types like <code>address<\/code> and <code>uint256<\/code> sit inline. Dynamic types like <code>bytes<\/code> or arrays store an offset that points to their real data further along the calldata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s the full calldata for a <code>transfer<\/code> of 1 token (18 decimals) to a sample address, split into its parts:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0xa9059cbb\n0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4\n0000000000000000000000000000000000000000000000000de0b6b3a7640000<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Part<\/th><th>Bytes<\/th><th>Value (trimmed)<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Selector<\/td><td>4<\/td><td><code>a9059cbb<\/code><\/td><td><code>transfer(address,uint256)<\/code><\/td><\/tr><tr><td>Argument 1<\/td><td>32<\/td><td><code>\u202656beddC4<\/code><\/td><td>recipient address, left-padded<\/td><\/tr><tr><td>Argument 2<\/td><td>32<\/td><td><code>\u2026a7640000<\/code><\/td><td>amount: <code>1000000000000000000<\/code> base units<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Read top to bottom: call <code>transfer<\/code>, send to <code>0x5B38\u2026ddC4<\/code>, move one token&#8217;s worth of base units. Nothing is hidden in there. Calldata is complete and deterministic.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"why-does-decoding-input-data-matter\">Why Does Decoding Input Data Matter?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Raw calldata hides intent behind hex. Decoding it is the only reliable way to see what a transaction actually does, before or after it runs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The clearest case is security. Wallet-drainer scams work by getting a user to sign a transaction whose calldata grants a token approval \u2014 often an unlimited one \u2014 to an attacker&#8217;s address. The wallet screen might show a harmless label, but the calldata is the ground truth. Decoding it reveals the real function and the real spender.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Decoding also drives everyday development: working out why a transaction reverted, confirming a contract call was built correctly, and labeling on-chain activity in analytics and explorers. If you&#8217;ve ever seen a wallet preview that reads &#8220;Approve USDC for Uniswap,&#8221; that line came from decoding calldata.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"who-needs-to-read-transaction-input\">Who Needs to Read Transaction Input?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Anyone who needs to know what a transaction does, not just that it happened. In practice that includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Smart-contract developers debugging failed or unexpected transactions.<\/li>\n\n\n\n<li>Security researchers and auditors checking approvals, spender addresses, and malicious payloads.<\/li>\n\n\n\n<li>Wallet engineers building human-readable transaction previews and simulations.<\/li>\n\n\n\n<li>Analytics and indexing teams classifying activity by function and protocol.<\/li>\n\n\n\n<li>Searchers and bot operators reading pending transactions to understand intent.<\/li>\n<\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"how-to-decode-transaction-input-data\">How to Decode Transaction Input Data<\/h2>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-75-1024x683.png\" alt=\"\" class=\"wp-image-3937\" srcset=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-75-1024x683.png 1024w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-75-300x200.png 300w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-75-768x512.png 768w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-75.png 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Decoding follows the same three moves every time: get the input bytes, read the selector, then decode the arguments. How you handle the last step depends on whether you have the contract&#8217;s ABI.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Get the input.<\/strong> Copy it from a block explorer, or fetch it in code \u2014 an Ethereum endpoint&#8217;s <code>eth_getTransactionByHash<\/code> method returns the transaction with its <code>input<\/code> field.<\/li>\n\n\n\n<li><strong>Read the selector.<\/strong> Take the first 10 characters (<code>0x<\/code> plus 8 hex digits). That&#8217;s your function fingerprint.<\/li>\n\n\n\n<li><strong>Decode the arguments.<\/strong> Use the ABI if you have it; look the selector up in a signature database if you don&#8217;t.<\/li>\n<\/ol>\n\n\n<h3 class=\"wp-block-heading\" id=\"decoding-with-the-contract-abi\">Decoding With the Contract ABI<\/h3>\n\n\n<p class=\"wp-block-paragraph\">If you have the contract&#8217;s ABI, decoding is exact and unambiguous. Libraries do the work in a line or two.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With <a href=\"https:\/\/docs.ethers.org\/v6\/\" rel=\"nofollow noopener noreferrer\">ethers.js<\/a> (v6), <code>Interface.parseTransaction<\/code> takes the calldata and returns the function name and typed arguments:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">js<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { Interface } from \"ethers\";\n\nconst abi = &#91;\"function transfer(address to, uint256 amount)\"];\nconst iface = new Interface(abi);\n\nconst data =\n  \"0xa9059cbb0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4\" +\n  \"0000000000000000000000000000000000000000000000000de0b6b3a7640000\";\n\nconst decoded = iface.parseTransaction({ data });\nconsole.log(decoded.name);        \/\/ \"transfer\"\nconsole.log(decoded.args.to);     \/\/ 0x5B38Da...ddC4\nconsole.log(decoded.args.amount); \/\/ 1000000000000000000n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In Python, web3.py exposes <code>contract.decode_function_input(data)<\/code>, and Foundry&#8217;s <code>cast decode-calldata<\/code> does the same from the command line when you supply the signature.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"decoding-without-the-abi\">Decoding Without the ABI<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Unverified contracts don&#8217;t publish an ABI, so you only have the selector to go on. Signature databases map known selectors back to function signatures.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Ethereum Signature Database at <a href=\"https:\/\/www.4byte.directory\/\" rel=\"nofollow noopener noreferrer\">4byte.directory<\/a> holds over 1.4 million signatures contributed by the community. Foundry queries it directly: <code>cast 4byte 0xa9059cbb<\/code> returns <code>transfer(address,uint256)<\/code>, and <code>cast 4byte-calldata<\/code> decodes the whole payload at once.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One catch: a 4-byte selector isn&#8217;t unique. Different function signatures can hash to the same 4 bytes, so a lookup can return several candidates. Treat the result as a strong hint, not proof, and verify against the contract where it matters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To decode at scale, you need the transactions in the first place. Pulling the <code>input<\/code> field for live or historical transactions means calling <code>eth_getTransactionByHash<\/code> against an Ethereum endpoint \u2014 for example, a <a href=\"https:\/\/nownodes.io\/nodes\/ethereum-eth\">NOWNodes Ethereum endpoint<\/a>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl https:\/\/eth.nownodes.io \\\n  -H \"api-key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getTransactionByHash\",\"params\":&#91;\"0xYOUR_TX_HASH\"]}'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The response includes an <code>input<\/code> field \u2014 that&#8217;s the calldata, ready to decode with any tool above. When a transaction reverts and the calldata alone doesn&#8217;t explain why, Debug &amp; Trace methods such as <code>debug_traceTransaction<\/code> expose the internal calls and their calldata step by step. For a quick visual check of a single transaction, the <a href=\"https:\/\/eth-explorer.nownodes.io\/\">NOWNodes Ethereum explorer<\/a> shows the decoded call without any code, and you can test the method against free <a href=\"https:\/\/nownodes.io\/public-endpoints\">public endpoints<\/a> before wiring in an API key.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"what-does-input-data-cost-in-gas\">What Does Input Data Cost in Gas?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Calldata isn&#8217;t free to include in a transaction. Under Ethereum&#8217;s gas rules, each zero byte of calldata costs 4 gas and each non-zero byte costs 16 gas. That&#8217;s why gas-optimized contracts and addresses try to keep calldata small and zero-heavy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Since the Pectra upgrade went live on May 7, 2025, a second rule applies. <a href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-7623\" rel=\"nofollow noopener noreferrer\">EIP-7623<\/a> added a floor cost for calldata: transactions that carry a lot of data but do little computation now pay at least 10 gas per calldata &#8220;token,&#8221; where a zero byte counts as 1 token and a non-zero byte as 4. The aim was to push rollups to store their data in blobs instead of calldata, freeing up block space.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For most everyday transactions \u2014 a transfer, a swap \u2014 the floor changes nothing, because they do enough computation to stay above it. It mainly bites on data-heavy, low-execution transactions.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"where-solidity-keeps-data-during-a-call\">Where Solidity Keeps Data During a Call<\/h2>\n\n\n<p class=\"wp-block-paragraph\">The word calldata also shows up inside Solidity code, where it means something related but narrower. In a contract, <code>calldata<\/code> is one of three data locations, alongside <code>memory<\/code> and <code>storage<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Location<\/th><th>Lifetime<\/th><th>Mutable<\/th><th>Relative cost<\/th><th>Typical use<\/th><\/tr><\/thead><tbody><tr><td><code>calldata<\/code><\/td><td>One call, read-only<\/td><td>No<\/td><td>Cheapest<\/td><td>External function inputs<\/td><\/tr><tr><td><code>memory<\/code><\/td><td>One call<\/td><td>Yes<\/td><td>Moderate<\/td><td>Temporary working data<\/td><\/tr><tr><td><code>storage<\/code><\/td><td>Persistent<\/td><td>Yes<\/td><td>Most expensive<\/td><td>Contract state kept on-chain<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">When a function parameter is marked <code>calldata<\/code>, Solidity reads it straight from the transaction&#8217;s input without copying it, which is the cheapest option for external inputs. <code>memory<\/code> is a mutable scratch space that lasts for a single call. <code>storage<\/code> is the contract&#8217;s permanent state, written to the chain and the most expensive to touch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So &#8220;calldata&#8221; can mean two things: the raw input bytes of a transaction, and the Solidity location that reads them. They point at the same data from different angles.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Decoding calldata is how you turn an opaque hex string into a clear statement of what a transaction does. The method is always the same: isolate the 4-byte selector, then decode the arguments \u2014 exactly with the ABI, or approximately through a signature database when no ABI is available.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a one-off check, a block explorer or a 4byte lookup is enough. For anything programmatic \u2014 monitoring, analytics, auditing \u2014 you&#8217;ll decode in code against an Ethereum endpoint, with Debug &amp; Trace on hand for the transactions that revert. And before you sign anything, decoding the calldata is the surest way to confirm a transaction does what its label claims.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n<h3 class=\"wp-block-heading\" id=\"what-does-the-0x-prefix-on-input-data-mean\">What does the &#8220;0x&#8221; prefix on input data mean?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">It only signals that what follows is hexadecimal. The <code>0x<\/code> is a formatting marker, not part of the data itself. A selector written as <code>0xa9059cbb<\/code> is really the 4 bytes <code>a9 05 9c bb<\/code>.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"is-transaction-input-stored-onchain-permanently\">Is transaction input stored on-chain permanently?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Yes. Calldata is part of the transaction, so it stays in the chain&#8217;s history and can be retrieved later with <code>eth_getTransactionByHash<\/code>, including through archive access for older transactions. It isn&#8217;t the same as contract storage, though \u2014 it was never part of the contract&#8217;s persistent state.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"how-is-input-data-different-from-an-eip4844-blob\">How is input data different from an EIP-4844 blob?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Blobs, introduced by EIP-4844, are a separate and cheaper data space built for rollups. Unlike calldata, blob data isn&#8217;t readable by the EVM \u2014 contracts only see a hash of it \u2014 and the network prunes it after about 18 days. Calldata is readable during execution and kept permanently.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"can-a-function-selector-match-more-than-one-function\">Can a function selector match more than one function?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Yes. A selector is only 4 bytes, so different function signatures can produce the same one, which is called a collision. Signature databases return every known match for a selector, so a decoder can show the wrong name if it picks the wrong candidate. When accuracy matters, verify the signature against the contract&#8217;s own ABI.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Every Ethereum transaction that touches a smart contract carries a block of hexadecimal data. That block is the calldata, and it tells the contract which function to run and what arguments to pass. On its own it looks like a wall of random hex \u2014 something like 0xa9059cbb000&#8230;. Decode it, and the wall turns into [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":3935,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","_lmt_disableupdate":"","_lmt_disable":"","_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[9],"tags":[],"class_list":["post-3934","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-general"],"blocksy_meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Read and Decode Ethereum Calldata (2026)<\/title>\n<meta name=\"description\" content=\"Calldata is the hex input a smart contract reads. Learn to find the function selector, decode the arguments, and check a transaction before signing.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Read and Decode Ethereum Calldata (2026)\" \/>\n<meta property=\"og:description\" content=\"Calldata is the hex input a smart contract reads. Learn to find the function selector, decode the arguments, and check a transaction before signing.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/\" \/>\n<meta property=\"og:site_name\" content=\"NOWNodes Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-12T12:02:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-12T12:02:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/text_1-29.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"\u0410nastasia\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nownodes\" \/>\n<meta name=\"twitter:site\" content=\"@nownodes\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0410nastasia\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/\"},\"author\":{\"name\":\"\u0410nastasia\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8\"},\"headline\":\"Transaction Calldata Explained: How to Decode Input Data\",\"datePublished\":\"2026-10-12T12:02:54+00:00\",\"dateModified\":\"2026-10-12T12:02:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/\"},\"wordCount\":1673,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\"},\"articleSection\":[\"General\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/\",\"url\":\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/\",\"name\":\"How to Read and Decode Ethereum Calldata (2026)\",\"isPartOf\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#website\"},\"datePublished\":\"2026-10-12T12:02:54+00:00\",\"dateModified\":\"2026-10-12T12:02:55+00:00\",\"description\":\"Calldata is the hex input a smart contract reads. Learn to find the function selector, decode the arguments, and check a transaction before signing.\",\"breadcrumb\":{\"@id\":\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Blog\",\"item\":\"https:\/\/nownodes.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"General\",\"item\":\"https:\/\/nownodes.io\/blog\/category\/general\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Transaction Calldata Explained: How to Decode Input Data\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/nownodes.io\/blog\/#website\",\"url\":\"https:\/\/nownodes.io\/blog\/\",\"name\":\"NOWNodes Blog\",\"description\":\"Your first-to-go source of development guides, web3 analytics and most recent news about NOWNodes\",\"publisher\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/nownodes.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\",\"name\":\"NOWNodes Blog\",\"url\":\"https:\/\/nownodes.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png\",\"contentUrl\":\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png\",\"width\":1164,\"height\":1164,\"caption\":\"NOWNodes Blog\"},\"image\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/twitter.com\/nownodes\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8\",\"name\":\"\u0410nastasia\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g\",\"caption\":\"\u0410nastasia\"},\"url\":\"https:\/\/nownodes.io\/blog\/author\/nasty-nownodes\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Read and Decode Ethereum Calldata (2026)","description":"Calldata is the hex input a smart contract reads. Learn to find the function selector, decode the arguments, and check a transaction before signing.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/","og_locale":"en_US","og_type":"article","og_title":"How to Read and Decode Ethereum Calldata (2026)","og_description":"Calldata is the hex input a smart contract reads. Learn to find the function selector, decode the arguments, and check a transaction before signing.","og_url":"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/","og_site_name":"NOWNodes Blog","article_published_time":"2026-10-12T12:02:54+00:00","article_modified_time":"2026-10-12T12:02:55+00:00","og_image":[{"width":2400,"height":1200,"url":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/text_1-29.jpg","type":"image\/jpeg"}],"author":"\u0410nastasia","twitter_card":"summary_large_image","twitter_creator":"@nownodes","twitter_site":"@nownodes","twitter_misc":{"Written by":"\u0410nastasia","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/#article","isPartOf":{"@id":"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/"},"author":{"name":"\u0410nastasia","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8"},"headline":"Transaction Calldata Explained: How to Decode Input Data","datePublished":"2026-10-12T12:02:54+00:00","dateModified":"2026-10-12T12:02:55+00:00","mainEntityOfPage":{"@id":"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/"},"wordCount":1673,"commentCount":0,"publisher":{"@id":"https:\/\/nownodes.io\/blog\/#organization"},"articleSection":["General"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/","url":"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/","name":"How to Read and Decode Ethereum Calldata (2026)","isPartOf":{"@id":"https:\/\/nownodes.io\/blog\/#website"},"datePublished":"2026-10-12T12:02:54+00:00","dateModified":"2026-10-12T12:02:55+00:00","description":"Calldata is the hex input a smart contract reads. Learn to find the function selector, decode the arguments, and check a transaction before signing.","breadcrumb":{"@id":"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nownodes.io\/blog\/transaction-calldata-explained-how-to-decode-input-data\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog","item":"https:\/\/nownodes.io\/blog"},{"@type":"ListItem","position":2,"name":"General","item":"https:\/\/nownodes.io\/blog\/category\/general"},{"@type":"ListItem","position":3,"name":"Transaction Calldata Explained: How to Decode Input Data"}]},{"@type":"WebSite","@id":"https:\/\/nownodes.io\/blog\/#website","url":"https:\/\/nownodes.io\/blog\/","name":"NOWNodes Blog","description":"Your first-to-go source of development guides, web3 analytics and most recent news about NOWNodes","publisher":{"@id":"https:\/\/nownodes.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nownodes.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/nownodes.io\/blog\/#organization","name":"NOWNodes Blog","url":"https:\/\/nownodes.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png","contentUrl":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png","width":1164,"height":1164,"caption":"NOWNodes Blog"},"image":{"@id":"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/twitter.com\/nownodes"]},{"@type":"Person","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8","name":"\u0410nastasia","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g","caption":"\u0410nastasia"},"url":"https:\/\/nownodes.io\/blog\/author\/nasty-nownodes"}]}},"modified_by":"\u0410nastasia","_links":{"self":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3934","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/comments?post=3934"}],"version-history":[{"count":1,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3934\/revisions"}],"predecessor-version":[{"id":3938,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3934\/revisions\/3938"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/media\/3935"}],"wp:attachment":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/media?parent=3934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/categories?post=3934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/tags?post=3934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}