[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-5-einfuehrung-yul-solidity-assemblersprache":3},{"article":4,"author":58},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":16,"focus_keyword":17,"og_image":18,"canonical_url":18,"robots_meta":19,"created_at":15,"updated_at":15,"tags":20,"category_name":38,"related_articles":39},"d7000000-0000-0000-0000-000000000105","a0000000-0000-0000-0000-000000000072","Deep EVM #5: Einfuehrung in Yul — Soliditys geheime Assemblersprache","deep-evm-5-einfuehrung-yul-solidity-assemblersprache","Eine praktische Einfuehrung in Yul: Syntax, Inline-Assembly in Solidity, wann man es verwendet, und praktische Beispiele zum Lesen von Storage, Emittieren von Events und Umgehen von Soliditys Overhead.","## Was ist Yul?\n\nYul ist eine Zwischensprache, die vom Solidity-Team entwickelt wurde und zu EVM-Bytecode kompiliert. Sie liegt zwischen Solidity und rohen Opcodes: Sie erhalten direkten Zugriff auf jeden EVM-Opcode ueber eine lesbare, strukturierte Syntax mit Variablen, Funktionen und Kontrollflusskonstrukten.\n\nWarum Yul verwenden?\n\n- **Gasoptimierung** — Soliditys Compiler fuegt Sicherheitspruefungen und Overhead hinzu. In Yul kontrollieren Sie jede Gasausgabe.\n- **Direkter Opcode-Zugriff** — Opcodes wie MSTORE, SLOAD, CALLDATACOPY sind direkt ansprechbar.\n- **Feingranulare Kontrolle** — Memory-Layout, Storage-Zugriffsmuster und Aufrufkonventionen liegen vollstaendig in Ihrer Hand.\n\n## Yul-Syntax-Grundlagen\n\nYul verwendet eine einfache, blockorientierte Syntax:\n\n```yul\n\u002F\u002F Variablen deklarieren\nlet x := 42\nlet y := add(x, 1)  \u002F\u002F y = 43\n\n\u002F\u002F Funktionen definieren\nfunction double(val) -> result {\n    result := mul(val, 2)\n}\n\n\u002F\u002F Kontrollfluss\nif gt(x, 10) {\n    \u002F\u002F x > 10\n}\n\nfor { let i := 0 } lt(i, 10) { i := add(i, 1) } {\n    \u002F\u002F Schleife 0..9\n}\n\nswitch x\ncase 0 { \u002F* x == 0 *\u002F }\ncase 1 { \u002F* x == 1 *\u002F }\ndefault { \u002F* sonst *\u002F }\n```\n\nAlle arithmetischen Operationen sind EVM-Opcodes: `add`, `sub`, `mul`, `div`, `mod`, `exp`. Vergleiche: `lt`, `gt`, `eq`, `iszero`. Bitweise: `and`, `or`, `xor`, `not`, `shl`, `shr`.\n\n## Inline-Assembly in Solidity\n\nDer haeufigste Einsatz von Yul ist als Inline-Assembly in Solidity-Funktionen:\n\n```solidity\nfunction getStorageAt(uint256 slot) external view returns (uint256 value) {\n    assembly {\n        value := sload(slot)\n    }\n}\n\nfunction efficientTransfer(address to, uint256 amount) external {\n    assembly {\n        \u002F\u002F ERC-20 Transfer-Event emittieren ohne Soliditys Overhead\n        let ptr := mload(0x40)  \u002F\u002F Free Memory Pointer\n        mstore(ptr, amount)\n        log3(\n            ptr,\n            32,\n            0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, \u002F\u002F Transfer(address,address,uint256) topic\n            caller(),\n            to\n        )\n    }\n}\n```\n\n## Wann Yul verwenden?\n\n### Ja:\n- Hot Paths mit vielen Ausfuehrungen (DEX-Router, MEV-Bots)\n- Kryptographische Operationen (Hashing, Signaturverifikation)\n- Benutzerdefinierte Memory-Layouts fuer komplexe Datenstrukturen\n- Wenn Sie Soliditys Overhead fuer Bounds-Checking umgehen muessen\n\n### Nein:\n- Standard-Geschaeftslogik (Soliditys Sicherheitspruefungen sind wertvoll)\n- Wenn Auditierbarkeit wichtiger ist als Gasersparnis\n- Wenn das Team keine EVM-Erfahrung hat\n\n## Praktisches Beispiel: Storage-Slot-Lesevorgang\n\n```solidity\nfunction readPackedSlot(uint256 slot) external view returns (\n    uint128 valueA,\n    uint128 valueB\n) {\n    assembly {\n        let packed := sload(slot)\n        valueA := and(packed, 0xffffffffffffffffffffffffffffffff) \u002F\u002F Untere 128 Bit\n        valueB := shr(128, packed) \u002F\u002F Obere 128 Bit\n    }\n}\n```\n\nDiese Funktion liest einen einzelnen Storage-Slot und extrahiert zwei gepackte uint128-Werte in einem einzigen SLOAD — halb so teuer wie zwei separate Lesevorgaenge.\n\n## Sicherheitsueberlegungen\n\nYul umgeht Soliditys Sicherheitsnetz:\n\n- **Kein Overflow-Schutz** — Sie muessen Ueberlaeufe selbst pruefen\n- **Kein Bounds-Checking** — Array-Zugriffe werden nicht validiert\n- **Kein Typ-System** — Alles ist ein 256-Bit-Wort\n- **Memory-Korruption** — Fehlerhaftes Memory-Management kann Daten ueberschreiben\n\nJede Zeile Yul-Code erfordert sorgfaeltige Pruefung und umfassende Tests.\n\n## Fazit\n\nYul ist ein maaechtiges Werkzeug im Arsenal des Smart-Contract-Entwicklers. Es bietet direkten Zugriff auf die EVM und ermoeglicht Optimierungen, die in reinem Solidity nicht moeglich sind. Aber mit grosser Macht kommt grosse Verantwortung — Yul-Code erfordert tiefes EVM-Verstaendnis und gruendliche Tests. In den naechsten Artikeln werden wir Yul fuer konkrete Anwendungsfaelle einsetzen: Memory-Management, gaseffiziente Schleifen und schliesslich einen vollstaendigen Token-Swap in reinem Yul.","\u003Ch2 id=\"was-ist-yul\">Was ist Yul?\u003C\u002Fh2>\n\u003Cp>Yul ist eine Zwischensprache, die vom Solidity-Team entwickelt wurde und zu EVM-Bytecode kompiliert. Sie liegt zwischen Solidity und rohen Opcodes: Sie erhalten direkten Zugriff auf jeden EVM-Opcode ueber eine lesbare, strukturierte Syntax mit Variablen, Funktionen und Kontrollflusskonstrukten.\u003C\u002Fp>\n\u003Cp>Warum Yul verwenden?\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Gasoptimierung\u003C\u002Fstrong> — Soliditys Compiler fuegt Sicherheitspruefungen und Overhead hinzu. In Yul kontrollieren Sie jede Gasausgabe.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Direkter Opcode-Zugriff\u003C\u002Fstrong> — Opcodes wie MSTORE, SLOAD, CALLDATACOPY sind direkt ansprechbar.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Feingranulare Kontrolle\u003C\u002Fstrong> — Memory-Layout, Storage-Zugriffsmuster und Aufrufkonventionen liegen vollstaendig in Ihrer Hand.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"yul-syntax-grundlagen\">Yul-Syntax-Grundlagen\u003C\u002Fh2>\n\u003Cp>Yul verwendet eine einfache, blockorientierte Syntax:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yul\">\u002F\u002F Variablen deklarieren\nlet x := 42\nlet y := add(x, 1)  \u002F\u002F y = 43\n\n\u002F\u002F Funktionen definieren\nfunction double(val) -&gt; result {\n    result := mul(val, 2)\n}\n\n\u002F\u002F Kontrollfluss\nif gt(x, 10) {\n    \u002F\u002F x &gt; 10\n}\n\nfor { let i := 0 } lt(i, 10) { i := add(i, 1) } {\n    \u002F\u002F Schleife 0..9\n}\n\nswitch x\ncase 0 { \u002F* x == 0 *\u002F }\ncase 1 { \u002F* x == 1 *\u002F }\ndefault { \u002F* sonst *\u002F }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Alle arithmetischen Operationen sind EVM-Opcodes: \u003Ccode>add\u003C\u002Fcode>, \u003Ccode>sub\u003C\u002Fcode>, \u003Ccode>mul\u003C\u002Fcode>, \u003Ccode>div\u003C\u002Fcode>, \u003Ccode>mod\u003C\u002Fcode>, \u003Ccode>exp\u003C\u002Fcode>. Vergleiche: \u003Ccode>lt\u003C\u002Fcode>, \u003Ccode>gt\u003C\u002Fcode>, \u003Ccode>eq\u003C\u002Fcode>, \u003Ccode>iszero\u003C\u002Fcode>. Bitweise: \u003Ccode>and\u003C\u002Fcode>, \u003Ccode>or\u003C\u002Fcode>, \u003Ccode>xor\u003C\u002Fcode>, \u003Ccode>not\u003C\u002Fcode>, \u003Ccode>shl\u003C\u002Fcode>, \u003Ccode>shr\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"inline-assembly-in-solidity\">Inline-Assembly in Solidity\u003C\u002Fh2>\n\u003Cp>Der haeufigste Einsatz von Yul ist als Inline-Assembly in Solidity-Funktionen:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">function getStorageAt(uint256 slot) external view returns (uint256 value) {\n    assembly {\n        value := sload(slot)\n    }\n}\n\nfunction efficientTransfer(address to, uint256 amount) external {\n    assembly {\n        \u002F\u002F ERC-20 Transfer-Event emittieren ohne Soliditys Overhead\n        let ptr := mload(0x40)  \u002F\u002F Free Memory Pointer\n        mstore(ptr, amount)\n        log3(\n            ptr,\n            32,\n            0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, \u002F\u002F Transfer(address,address,uint256) topic\n            caller(),\n            to\n        )\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"wann-yul-verwenden\">Wann Yul verwenden?\u003C\u002Fh2>\n\u003Ch3>Ja:\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Hot Paths mit vielen Ausfuehrungen (DEX-Router, MEV-Bots)\u003C\u002Fli>\n\u003Cli>Kryptographische Operationen (Hashing, Signaturverifikation)\u003C\u002Fli>\n\u003Cli>Benutzerdefinierte Memory-Layouts fuer komplexe Datenstrukturen\u003C\u002Fli>\n\u003Cli>Wenn Sie Soliditys Overhead fuer Bounds-Checking umgehen muessen\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Nein:\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Standard-Geschaeftslogik (Soliditys Sicherheitspruefungen sind wertvoll)\u003C\u002Fli>\n\u003Cli>Wenn Auditierbarkeit wichtiger ist als Gasersparnis\u003C\u002Fli>\n\u003Cli>Wenn das Team keine EVM-Erfahrung hat\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"praktisches-beispiel-storage-slot-lesevorgang\">Praktisches Beispiel: Storage-Slot-Lesevorgang\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-solidity\">function readPackedSlot(uint256 slot) external view returns (\n    uint128 valueA,\n    uint128 valueB\n) {\n    assembly {\n        let packed := sload(slot)\n        valueA := and(packed, 0xffffffffffffffffffffffffffffffff) \u002F\u002F Untere 128 Bit\n        valueB := shr(128, packed) \u002F\u002F Obere 128 Bit\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Diese Funktion liest einen einzelnen Storage-Slot und extrahiert zwei gepackte uint128-Werte in einem einzigen SLOAD — halb so teuer wie zwei separate Lesevorgaenge.\u003C\u002Fp>\n\u003Ch2 id=\"sicherheitsueberlegungen\">Sicherheitsueberlegungen\u003C\u002Fh2>\n\u003Cp>Yul umgeht Soliditys Sicherheitsnetz:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Kein Overflow-Schutz\u003C\u002Fstrong> — Sie muessen Ueberlaeufe selbst pruefen\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Kein Bounds-Checking\u003C\u002Fstrong> — Array-Zugriffe werden nicht validiert\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Kein Typ-System\u003C\u002Fstrong> — Alles ist ein 256-Bit-Wort\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Memory-Korruption\u003C\u002Fstrong> — Fehlerhaftes Memory-Management kann Daten ueberschreiben\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Jede Zeile Yul-Code erfordert sorgfaeltige Pruefung und umfassende Tests.\u003C\u002Fp>\n\u003Ch2 id=\"fazit\">Fazit\u003C\u002Fh2>\n\u003Cp>Yul ist ein maaechtiges Werkzeug im Arsenal des Smart-Contract-Entwicklers. Es bietet direkten Zugriff auf die EVM und ermoeglicht Optimierungen, die in reinem Solidity nicht moeglich sind. Aber mit grosser Macht kommt grosse Verantwortung — Yul-Code erfordert tiefes EVM-Verstaendnis und gruendliche Tests. In den naechsten Artikeln werden wir Yul fuer konkrete Anwendungsfaelle einsetzen: Memory-Management, gaseffiziente Schleifen und schliesslich einen vollstaendigen Token-Swap in reinem Yul.\u003C\u002Fp>\n","de","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:29.928066Z","Praktische Einfuehrung in Yul-Assembly: Syntax, Inline-Assembly in Solidity, wann man es verwendet, und praktische Beispiele fuer gaskritische Smart Contracts.","Yul Assemblersprache",null,"index, follow",[21,26,30,34],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000020","Gas Optimization","gas-optimization",{"id":31,"name":32,"slug":33,"created_at":25},"c0000000-0000-0000-0000-000000000014","Solidity","solidity",{"id":35,"name":36,"slug":37,"created_at":25},"c0000000-0000-0000-0000-000000000018","Yul","yul","Blockchain",[40,46,52],{"id":41,"title":42,"slug":43,"excerpt":44,"locale":12,"category_name":38,"published_at":45},"d0000000-0000-0000-0000-000000000611","Die Ethereum-Interoperabilitaetsschicht: Wie 55+ L2s zu einer Chain werden","ethereum-interoperabilitaetsschicht-55-l2s-eine-chain","Ethereum hat 55+ Layer-2-Rollups, die Liquiditaet und Nutzererfahrung fragmentieren. Die Ethereum-Interoperabilitaetsschicht — bestehend aus Cross-Rollup-Messaging, Shared Sequencern und Based Rollups — zielt darauf ab, sie zu einem einzigen komponierbaren Netzwerk zu vereinen.","2026-03-28T10:44:45.264352Z",{"id":47,"title":48,"slug":49,"excerpt":50,"locale":12,"category_name":38,"published_at":51},"d0000000-0000-0000-0000-000000000610","ZK-Beweise jenseits von Rollups: Verifizierbare KI-Inferenz auf Ethereum","zk-beweise-jenseits-von-rollups-verifizierbare-ki-inferenz-ethereum","Zero-Knowledge-Beweise sind nicht mehr nur ein Skalierungswerkzeug. Im Jahr 2026 ermoeglicht zkML verifizierbare KI-Inferenz on-chain, ZK-Coprozessoren verlagern schwere Berechnungen off-chain mit On-Chain-Verifizierung, und neue Beweissysteme wie SP1 und Jolt machen es praktikabel.","2026-03-28T10:44:45.257775Z",{"id":53,"title":54,"slug":55,"excerpt":56,"locale":12,"category_name":38,"published_at":57},"d0000000-0000-0000-0000-000000000587","EIP-7702 in der Praxis: Smart-Account-Flows nach Pectra erstellen","eip-7702-in-der-praxis-smart-account-flows-nach-pectra-erstellen","EIP-7702 ermoeglicht jedem Ethereum-EOA, innerhalb einer einzelnen Transaktion voruebergehend als Smart Contract zu agieren. So implementieren Sie Batch-Transaktionen, Gas-Sponsoring und Social Recovery mit dem neuen Account-Abstraction-Primitiv.","2026-03-28T10:44:43.781201Z",{"id":13,"name":59,"slug":60,"bio":61,"photo_url":18,"linkedin":18,"role":62,"created_at":63,"updated_at":63},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]