In this track: Dynamic ABI and nested layouts
advanced · 5 MIN READ

Empty strings and empty arrays

Empty content still has a valid dynamic encoding.

LET’S PICTURE IT

An empty attachment has a location and a zero-item declaration.

SEE IT FOR YOURSELF
Follow a dynamic string from head to tailStep 1 / 4
Follow a dynamic string from head to tailArgument headbyte 0 · offset 32hex word ends in 20String tailstarts at byte 32length + contentPositions are measured from argument byte zero, excluding any selectorOffset destinationargument byte 32read a length wordLength = 5hello is five UTF-8 bytescontent starts at byte 64A length word and an offset word have different jobsContent word · argument byte 6468 65 6c 6c 6f5 payload bytes27 padding bytesBlocks are schematic; their drawn widths do not represent the exact byte ratioHeadoffset: 32argument byte 0Tail lengthlength: 5argument byte 32Tail contenthello + paddingargument byte 6432 + 32 + 32 = 96 bytesWith a four-byte selector, total calldata length is 100 bytes

This example encodes one string parameter with value hello. A dynamic argument uses an offset in its head, even when it is the only argument.

Animated local teaching model. No wallet, RPC or live blockchain data. Some labels and hashes are abbreviated for readability.

Keep the pointer

An empty string is still a string. A single top-level string argument therefore retains its offset word pointing to the tail at byte 32.

Write zero length

The empty tail has a zero length word and no payload bytes. It does not need a content padding word because zero content bytes are already a multiple of thirty-two.

Handle an empty array similarly

A dynamic array with no elements contains its zero count and no element encodings. Its top-level parameter still needs the offset into that array body.

Separate empty from absent

An empty value is not a missing parameter or a failed call. The ABI schema determines how many parameters exist and how each empty value is represented.

Trace a local example

types: string,uint256[]
values: ["",[]]
no function selector prefix

word 0 · argument offset 0 bytes
0x0000000000000000000000000000000000000000000000000000000000000040

word 1 · argument offset 32 bytes
0x0000000000000000000000000000000000000000000000000000000000000060

word 2 · argument offset 64 bytes
0x0000000000000000000000000000000000000000000000000000000000000000

word 3 · argument offset 96 bytes
0x0000000000000000000000000000000000000000000000000000000000000000

Two pointers each lead to a zero length word; neither tail has a content word.

TURN UNDERSTANDING INTO PRACTICEOpen the ABI encoder →
QUICK CHECK · NO PRESSURE

How many words encode one empty string parameter?

Your progress stays in this browser.
Keep exploring the original referenceSolidity documentation ↗

Original explanations by EtherTools. Examples are educational and source-linked; this site is independent of the Ethereum Foundation. Our approach.