[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-6-yul-memori-gwanli-mstore-mload":3},{"article":4,"author":54},{"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":34,"related_articles":35},"d5000000-0000-0000-0000-000000000106","a0000000-0000-0000-0000-000000000052","Deep EVM #6: Yul 메모리 관리 — mstore, mload, 프리 메모리 포인터","deep-evm-6-yul-memori-gwanli-mstore-mload","Yul에서 EVM 메모리 관리 마스터: 프리 메모리 포인터, 수동 ABI 인코딩, 외부 호출 데이터 구축, 가스 중요 컨트랙트를 위한 메모리 효율 패턴.","## 가비지 컬렉터 없는 메모리 관리\n\nYul에서는 당신이 메모리 관리자입니다. 할당자도, 가비지 컬렉터도, 경계 검사도 없습니다. 메모리는 MLOAD와 MSTORE를 사용하여 읽고 쓰는 평면 바이트 배열입니다. 잘못된 오프셋에 쓰면 자체 데이터가 손상됩니다. 초기화되지 않은 오프셋에서 읽으면 쓰레기 값을 얻습니다.\n\n이 수준의 제어가 바로 Yul을 가스 최적화에 강력하게 만드는 것이며 — 또한 위험하게 만드는 것입니다.\n\n## MSTORE, MLOAD, MSTORE8\n\n세 옵코드가 메모리 접근을 처리합니다:\n\n```yul\nmstore(0x00, 0xdeadbeef)  \u002F\u002F 오프셋 0에 32바이트 저장\nlet value := mload(0x00)  \u002F\u002F 오프셋 0에서 32바이트 읽기\nmstore8(0x00, 0xff)       \u002F\u002F 오프셋 0에 1바이트 저장\n```\n\n## 프리 메모리 포인터 (0x40)\n\nSolidity는 오프셋 0x40의 프리 메모리 포인터를 0x80으로 초기화합니다. 사용 가능한 메모리는 0x80부터 시작합니다.\n\n### Yul에서 메모리 할당\n\n```yul\nfunction allocate(size) -> ptr {\n    ptr := mload(0x40)\n    mstore(0x40, add(ptr, size))\n}\n```\n\n## Yul에서 ABI 인코딩된 콜데이터 구축\n\n가장 흔한 Yul 작업 중 하나는 외부 호출을 위한 콜데이터 구축입니다:\n\n```yul\nfunction doTransfer(token, to, amount) {\n    mstore(0x00, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n    mstore(0x04, to)\n    mstore(0x24, amount)\n    let success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n    if iszero(and(success, or(\n        iszero(returndatasize()),\n        and(gt(returndatasize(), 31), mload(0x00))\n    ))) { revert(0, 0) }\n}\n```\n\n## 메모리 효율적 해싱\n\n```yul\nfunction getMappingSlot(key, baseSlot) -> slot {\n    mstore(0x00, key)\n    mstore(0x20, baseSlot)\n    slot := keccak256(0x00, 0x40)\n}\n```\n\n## Returndata 포워딩 패턴\n\n```yul\nlet success := call(gas(), target, value, inOffset, inSize, 0, 0)\nlet size := returndatasize()\nreturndatacopy(0x00, 0x00, size)\nswitch success\ncase 0 { revert(0x00, size) }\ndefault { return(0x00, size) }\n```\n\n## 결론\n\nYul의 메모리 관리는 수동적이고 정밀하며 강력합니다. 이 글의 패턴들 — 스크래치 공간 사용, 콜데이터 구축, 해시 계산, returndata 포워딩 — 은 모든 가스 최적화 스마트 컨트랙트의 기본 구성 요소입니다.","\u003Ch2 id=\"\">가비지 컬렉터 없는 메모리 관리\u003C\u002Fh2>\n\u003Cp>Yul에서는 당신이 메모리 관리자입니다. 할당자도, 가비지 컬렉터도, 경계 검사도 없습니다. 메모리는 MLOAD와 MSTORE를 사용하여 읽고 쓰는 평면 바이트 배열입니다. 잘못된 오프셋에 쓰면 자체 데이터가 손상됩니다. 초기화되지 않은 오프셋에서 읽으면 쓰레기 값을 얻습니다.\u003C\u002Fp>\n\u003Cp>이 수준의 제어가 바로 Yul을 가스 최적화에 강력하게 만드는 것이며 — 또한 위험하게 만드는 것입니다.\u003C\u002Fp>\n\u003Ch2 id=\"mstore-mload-mstore8\">MSTORE, MLOAD, MSTORE8\u003C\u002Fh2>\n\u003Cp>세 옵코드가 메모리 접근을 처리합니다:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yul\">mstore(0x00, 0xdeadbeef)  \u002F\u002F 오프셋 0에 32바이트 저장\nlet value := mload(0x00)  \u002F\u002F 오프셋 0에서 32바이트 읽기\nmstore8(0x00, 0xff)       \u002F\u002F 오프셋 0에 1바이트 저장\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"0x40\">프리 메모리 포인터 (0x40)\u003C\u002Fh2>\n\u003Cp>Solidity는 오프셋 0x40의 프리 메모리 포인터를 0x80으로 초기화합니다. 사용 가능한 메모리는 0x80부터 시작합니다.\u003C\u002Fp>\n\u003Ch3>Yul에서 메모리 할당\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-yul\">function allocate(size) -&gt; ptr {\n    ptr := mload(0x40)\n    mstore(0x40, add(ptr, size))\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"yul-abi\">Yul에서 ABI 인코딩된 콜데이터 구축\u003C\u002Fh2>\n\u003Cp>가장 흔한 Yul 작업 중 하나는 외부 호출을 위한 콜데이터 구축입니다:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yul\">function doTransfer(token, to, amount) {\n    mstore(0x00, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n    mstore(0x04, to)\n    mstore(0x24, amount)\n    let success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n    if iszero(and(success, or(\n        iszero(returndatasize()),\n        and(gt(returndatasize(), 31), mload(0x00))\n    ))) { revert(0, 0) }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">메모리 효율적 해싱\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yul\">function getMappingSlot(key, baseSlot) -&gt; slot {\n    mstore(0x00, key)\n    mstore(0x20, baseSlot)\n    slot := keccak256(0x00, 0x40)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"returndata\">Returndata 포워딩 패턴\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yul\">let success := call(gas(), target, value, inOffset, inSize, 0, 0)\nlet size := returndatasize()\nreturndatacopy(0x00, 0x00, size)\nswitch success\ncase 0 { revert(0x00, size) }\ndefault { return(0x00, size) }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">결론\u003C\u002Fh2>\n\u003Cp>Yul의 메모리 관리는 수동적이고 정밀하며 강력합니다. 이 글의 패턴들 — 스크래치 공간 사용, 콜데이터 구축, 해시 계산, returndata 포워딩 — 은 모든 가스 최적화 스마트 컨트랙트의 기본 구성 요소입니다.\u003C\u002Fp>\n","ko","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:27.834297Z","Yul 메모리 관리 마스터: 프리 메모리 포인터, 수동 ABI 인코딩, 콜데이터 구축, 가스 중요 EVM 컨트랙트를 위한 메모리 효율 패턴.","Yul 메모리 관리",null,"index, follow",[21,26,30],{"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-000000000018","Yul","yul","블록체인",[36,42,48],{"id":37,"title":38,"slug":39,"excerpt":40,"locale":12,"category_name":34,"published_at":41},"d0000000-0000-0000-0000-000000000605","Ethereum 상호운용성 레이어: 55개 이상의 L2가 하나의 체인이 되는 방법","ethereum-sangho-unyongseong-layer-55-l2-hana-chain","Ethereum에는 55개 이상의 Layer 2 롤업이 있어 유동성과 사용자 경험이 파편화되어 있습니다. Ethereum 상호운용성 레이어 — 크로스 롤업 메시징, 공유 시퀀서, 베이스드 롤업을 결합하여 — 하나의 조합 가능한 네트워크로 통합하는 것을 목표로 합니다.","2026-03-28T10:44:44.895917Z",{"id":43,"title":44,"slug":45,"excerpt":46,"locale":12,"category_name":34,"published_at":47},"d0000000-0000-0000-0000-000000000604","롤업을 넘어선 ZK 증명: Ethereum에서의 검증 가능한 AI 추론","rolleob-eul-neomeo-zk-jeungmyeong-ethereum-geomjeung-ai-churon","영지식 증명은 더 이상 단순한 스케일링 도구가 아닙니다. 2026년, zkML은 온체인에서 검증 가능한 AI 추론을 가능하게 하고, ZK 코프로세서는 무거운 연산을 오프체인으로 이동시키며 온체인에서 검증하고, SP1과 Jolt 같은 새로운 증명 시스템이 이를 실용적으로 만들고 있습니다.","2026-03-28T10:44:44.890168Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":34,"published_at":53},"d0000000-0000-0000-0000-000000000581","EIP-7702 실전 가이드: Pectra 이후 스마트 계정 플로우 구축","eip-7702-siljeon-gaideu-pectra-ihu-seumateu-gyejeong-peulro-guchuk","EIP-7702는 모든 Ethereum EOA가 단일 트랜잭션 내에서 스마트 컨트랙트로 임시 동작할 수 있게 합니다. 새로운 계정 추상화 프리미티브를 사용한 배치 트랜잭션, 가스 후원, 소셜 리커버리 구현 방법을 소개합니다.","2026-03-28T10:44:43.377765Z",{"id":13,"name":55,"slug":56,"bio":57,"photo_url":18,"linkedin":18,"role":58,"created_at":59,"updated_at":59},"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"]