지능형 프로파일
스마트 구조기는 Upgradable 또는 Proxy라고 불리는 기법이 있다.여기서 상세한 설명을 생략할 수 있도록 허락해 주십시오. 간단하게 말하면, 실제로 호출된 프레임 뒷면에 실제 장착된 프레임이 있습니다.
현재 제가 도와드린 N Suite 키 관리 제품의 개선 일환은'설정된 주소가 주어지면 그 Proxy가 자동으로 그 이후의 정보를 얻을 수 있습니다'가 필요합니다.
이를 위한 조사 결과는 보기 드물기 때문에 여기서 공유하고 싶다.
동기와 전제
그 전에 왜 N Suite 이 조사를 진행했는지 설명해 봅시다.관심 없는 사람은 조사 결과를 읽는 것을 건너뛸 수 있다.
모티프
N Suite는 작성된 작성자를 네트워크에 배치하거나 네트워크에 이미 존재하는 작성기에 로그인하여 임의의 메소드를 호출할 수 있는 팀 관리 및 실행 작성기 제품입니다.
이 때 등록할 구조기가 Proxy라면 사용자가 Proxy 이전의 정보를 가져와 등록하는 것이 불편할 수 있습니다.
또 이더산 등에서 버라이프가 완성되면 그곳API에서는 쉽게 프록시 주소를 얻을 수 있지만 기업의 폐쇄적인 설정에서 버라이프가 없는 상황에서 프록시 주소를 자동으로 표시할 수만 있다면 된다.
전제 조건
즉, verify가 없는 설정이 Proxy인지 아닌지를 자동으로 판단하는 것이다.사용자가build-info 상태에서 원본 코드 등을 전면적으로 업로드하지만 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 목적지를 획득해야 합니다.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
예0x4Fabb145d64652a948d72533023f6E7A623C7C53SLOT에 저장되지 않은 모드
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
의 읽기 방법을 호출하는 방법은 실행하기 쉬우며 스스로 실행해도 대응할 가능성이 있기 때문에 시도할 가치가 있다.그러나 ABI
implementation
의 읽기 방법이 있어도 Proxy를 가리키는 확실한 증거는 없다.Proxy 인식 여부
etherscan에
delegatecall
바이트 코드가 포함되어 있는지 확인하는 것 같습니다.(이 메디엄 기사에 따르면)
바이트 코드의 획득은 가능하지만 그 분석 등을 감안하면 대부분의 구조기가 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.주식회사동반자 모집.
Reference
이 문제에 관하여(지능형 프로파일), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sawatani/articles/1a25e64bbe8cb2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)