지능형 프로파일

이더머 등 EVM 계열이 움직이는 스마트 구조기에 관한 이야기다.
스마트 구조기는 Upgradable 또는 Proxy라고 불리는 기법이 있다.여기서 상세한 설명을 생략할 수 있도록 허락해 주십시오. 간단하게 말하면, 실제로 호출된 프레임 뒷면에 실제 장착된 프레임이 있습니다.
현재 제가 도와드린 N Suite 키 관리 제품의 개선 일환은'설정된 주소가 주어지면 그 Proxy가 자동으로 그 이후의 정보를 얻을 수 있습니다'가 필요합니다.
이를 위한 조사 결과는 보기 드물기 때문에 여기서 공유하고 싶다.

동기와 전제


그 전에 왜 N Suite 이 조사를 진행했는지 설명해 봅시다.관심 없는 사람은 조사 결과를 읽는 것을 건너뛸 수 있다.

모티프


N Suite는 작성된 작성자를 네트워크에 배치하거나 네트워크에 이미 존재하는 작성기에 로그인하여 임의의 메소드를 호출할 수 있는 팀 관리 및 실행 작성기 제품입니다.
이 때 등록할 구조기가 Proxy라면 사용자가 Proxy 이전의 정보를 가져와 등록하는 것이 불편할 수 있습니다.
또 이더산 등에서 버라이프가 완성되면 그곳API에서는 쉽게 프록시 주소를 얻을 수 있지만 기업의 폐쇄적인 설정에서 버라이프가 없는 상황에서 프록시 주소를 자동으로 표시할 수만 있다면 된다.

전제 조건


즉, verify가 없는 설정이 Proxy인지 아닌지를 자동으로 판단하는 것이다.사용자가build-info 상태에서 원본 코드 등을 전면적으로 업로드하지만 ABI 제공은 가능하다.
총괄은 아래와 같다.
  • 목적
  • Proxy인지 여부를 판별합니다.
  • Proxy라면 이전 주소를 찾으세요.
  • 제한 사항
  • 구조기는verify에 의해 만들어지지 않았다.
  • 소스 코드가 없습니다.
  • 도 ABI를 업그레이드할 수 있다.
  • 조사 결과


    (이하, 조사 결과는'예'로 진행됨)

    분류하다


    Proxy 자체는 delegatecall만 사용하면 독립적으로 설치할 수 있습니다.
    여기서는 일반적인 실시 방식을 조사했다.
    크게 특정 SLOT에 Proxy 목적지를 저장하는 모델과 그렇지 않은 모델로 나뉜다.

    특정 SLOT에 Proxy 대상 저장 모드


    SLOT는 주소와 연관된 32바이트의 저장 장소로 JSON-PRPC의eth_getStorageAt에서 얻을 수 있다.

    EIP-1822: Universal Upgradeable Proxy Standard (UUPS)


    낡았지만 UUPS로 불린다는 생각 자체가 계승됐다.
    Proxy 타겟 변경 시 호환성 확인proxiable 등을 권장합니다.
    Proxy 이전의 설정에서도 의식적으로'Proxy에 의해 이루어졌다'는 것을 요구한다.
    SLOT = keccak256("PROXIABLE")
    0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7
    

    EIP-1967: Standard Proxy Storage Slots


    아마도 현재 가장 보편적으로 사용되고 있는 것일 것이다. OpenZeppelin을 사용하면 자동으로 이것으로 변할 것이다.
    SLOT로서implementation,beacon,admin의 주소를 정의하는 3개입니다.
    SLOT에 대한 값 업데이트를 알리는 이벤트가 필요합니다.
    Proxy로 먼저, implementation과 beacon의 임의의 규격을 선택할 수 있으며, beacon을 사용할 때 implementation이 비어 있습니다.
  • implementation의 경우 이 주소는Proxy목적지가 된다.(OpenZeppelin의 기본값)
  • beacon의 경우 이 주소의 읽기 방법implementation()을 호출하여Proxy 목적지를 획득해야 합니다.
  • SLOT = bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1))
    0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
    
    SLOT = bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)
    0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50
    

    OpenZeppelin’s Unstructured Storage Proxies


    정의란 SLOT에 저장된 물건을 가리키기 때문에 EIP-11822 또는 EIP-167에 저장된 SLOT에도 이 기준에 포함된다.
    Open Zeppelin이 사용했던 Slot은 이거예요.
    SLOT = keccak256("org.zeppelinos.proxy.implementation")
    0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3
    
    0x4Fabb145d64652a948d72533023f6E7A623C7C53

    SLOT에 저장되지 않은 모드


    OpenZeppelin’s Eternal Storage


    오래되다.최신 OpenZeppelin 문서에는 없습니다.
    Proxy 목표의 획득은 표준화되지 않기 때문에 통용할 수 없습니다.

    EIP-897: DelegateProxy


    낡았어, 이렇게 Draft로 변해서 보급됐다고 할 수는 없어.
    읽기 방법implementation은 Proxy로 돌아가는 주소의 규격이 됩니다.

    기타


    EIP-2532: Diamonds, Multi-Facet Proxy


    현재(2022년 3월) 협의 중이다.
    협상 중이라지만 채택할 수 있는 프레임도 있지만 고려하지 않는다.

    Poxy 먼저 가져오기


    SLOT에 저장할 때


    SLOT를 알면 쉽게 얻을 수 있지만, ABI로부터 어떤 SLOT 등을 판정할 수 없다.
    주류로 꼽히는 SLOT를 방문해보는 것은 현실적이다.
    SLOT의 우선도는 다음과 같다.
  • eip1967.proxy.implementation
  • eip1967.proxy.beacon
  • org.zeppelinos.proxy.implementation
  • PROXIABLE (EIP-1822)
  • 하지만 마지막PROXIABLE은 구체적인 사례를 만난 뒤 검토해 도입하는 것만으로도 충분하다.

    SLOT에 저장되지 않은 경우


    표준화되지 않은 것에 대해서는 우선 대응이 불가능하다고 볼 수 있다.
    DelegateProxy 모드implementation의 읽기 방법을 호출하는 방법은 실행하기 쉬우며 스스로 실행해도 대응할 가능성이 있기 때문에 시도할 가치가 있다.
    그러나 ABIimplementation의 읽기 방법이 있어도 Proxy를 가리키는 확실한 증거는 없다.

    Proxy 인식 여부


    etherscan에 delegatecall 바이트 코드가 포함되어 있는지 확인하는 것 같습니다.
    (이 메디엄 기사에 따르면)
    https://medium.com/etherscan-blog/and-finally-proxy-contract-support-on-etherscan-693e3da0714b
    바이트 코드의 획득은 가능하지만 그 분석 등을 감안하면 대부분의 구조기가 Proxy가 아닌 것을 감안하면 효율이 떨어진다.그리고 Uniswap V3: Router 2처럼 delegatecall만 사용하면 Proxy로 오판될 수 있습니다.
    OpenZeppelin을 직접 사용하는 경우 ABI를 통해 판정할 수 있지만, EIP-667 등 기준에서는 방법명을 정의하지 않아 불확실하다.
    실용적인 측면에서 Proxy의 미래를 모르면 Proxy가 아닌 것으로 판정해도 문제없다.그러나 이 경우 사용자가 지정한 Proxy 목적지의 선택을 선택합니다.

    결론


    구성 주소를 지정하면 SLOT의 우선 순위 1-3을 확인하고 Proxy를 찾으면 해당 구성이 Proxy인 것으로 판단합니다.이때는 ABI를 고려하지 않는다.
    Proxy임에도 불구하고 Proxy가 아닌 오류 판정일 수 있습니다.하지만 반대는 없다.
    Proxy가 아니라고 판정되더라도 사용자가 Proxy로 Proxy의 목적지를 지정하는 방법을 연구해야 한다.

    최후


    이상은 조사 결과입니다.
    결국 ABI가 필요 없고 주소만 있으면 여기까지 할 수 있다는 것을 알게 되었다.반면 ABI만 판정하기 어렵다.
    나는 개인적으로 EIP-2532의 보완에 따라 복잡한 배치도 증가할 것이라고 생각한다.
    만약 당신이 주의할 만한 곳이 있다면, 그것은 나에게 큰 도움이 될 것입니다.
    여러분들이 Proxy 구조물에 대해 고민하실 때 이 자료를 참고로 해주시면 감사하겠습니다.
    N Suite개발 중double jump.주식회사동반자 모집.
    https://www.wantedly.com/projects/721528

    좋은 웹페이지 즐겨찾기