지갑을 불러올 때의 혼란
지갑 연결은 웹3.0의 세계에서 중요한 단계로, 일부 디앱 사이트에서는 지갑을 연결해야 하는 경우가 종종 있습니다. 하지만 이 간단한 작업만으로도 사용자에게 심각한 불편을 초래할 수 있습니다.
지갑 연결
웹3.0 초보 사용자(호기심에 여러 플러그인 지갑을 설치한)가 특정 디앱 웹사이트에 방문하여 자신의 지갑을 사용하여 연결하려는 시나리오를 상상해 보십시오. 호기심에 많은 플러그인 지갑을 설치한 초보 Web3 사용자가 특정 DApp 웹사이트를 방문하여 브라우저 플러그인 지갑을 사용하여 연결하려고 하는데, 해당 웹사이트에서 제공하는 "지갑 연결" 버튼을 클릭하고 지갑을 선택하면 팝업으로 표시되는 지갑이 자신이 선택한 지갑이 아닌 것을 발견할 수 있습니다. 이 경우 컴퓨터가 바이러스에 감염되어 예상치 못한 작업을 수행했다고 생각하여 당황하고 숨이 막힐 수 있습니다.
블록체인 지갑은 블록체인의 중요한 진입점이며, 그 진입점을 차지하기 위해 개별 지갑은 생각할 수 있는 모든 방법을 동원해왔습니다. 디앱 개발자와 디앱 사용자에게 가장 큰 골칫거리 중 하나는 지갑에 의한 글로벌 변수 변조입니다.
현재 브라우저 지갑 구현에서 지갑은 브라우저에 전역 변수를 삽입하여 기능을 노출합니다(예: 이더리움 지갑은 " window.ethereum;"에 기능을 삽입), DApp이 지갑이 제공하는 메서드를 호출하여 포털에 액세스할 수 있도록 합니다. 지갑이 제공하는 메소드를 호출하여 상호 작용할 수 있습니다.
단, 많은 지갑이 동일한 window.ethereum 변수에 자신을 주입하기 때문에 나중에 등록하는 지갑이 먼저 등록한 지갑을 덮어쓰므로 마지막으로 등록한 지갑만 이런 방식으로 호출할 수 있습니다.
따라서 디앱 사용자는 원하는 지갑을 사용하기 위해 다른 지갑 플러그인을 일시적으로 비활성화하거나 지갑만 설치해야 하는 경우가 있습니다. 이는 지갑 개발자가 의도한 바가 아닙니다. 또한 새 지갑이 더 나은 기능을 제공하더라도 이미 다른 지갑을 사용하고 있는 사용자를 끌어들이기 어려울 것입니다.
왜 굳이 같은 변수를 주입해야 하는지 궁금해하시는 분들도 계실 것입니다. A와 B라는 두 개의 지갑이 있다고 가정해봅시다. 실제로 A는 "window.a"에, B는 "window.b"에 자신을 주입하고 원하는 지갑을 호출하려면 해당 객체에 제공된 메서드를 호출하면 되며, A를 호출하려다가 대신 B를 호출하는 문제가 발생하지 않습니다. 이렇게 하면 경쟁 문제는 해결되지만, 디앱이 여러 지갑 연결을 지원하려면 개발자가 코드에 적용하고자 하는 모든 지갑의 이름을 미리 정의하고 사용자가 지갑을 선택할 때 해당 지갑의 메서드를 호출해야 한다는 문제가 있습니다. 이는 코드 유지 관리에 많은 어려움을 초래합니다. 지갑을 동일한 객체에 주입하면 이러한 문제를 피할 수 있습니다.
해결 방법
위의 딜레마에서 벗어나기 위해 커뮤니티에는 두 가지 유사한 표준이 있습니다.
이더넷의 솔루션: EIP-6963
EIP-6963 제안은 2023년 5월 이더넷 커뮤니티에서 도입되었습니다.
이 제안의 기본 논리는 간단합니다. 글로벌 변수를 버리고 합의된 이벤트를 사용해 지갑 등록 및 검색 문제를 해결하자는 것입니다.
특히, 플러그인 지갑이 성공적으로 로드되면 통합된 "eip6963:announceProvider" 이벤트가 트리거되어 새로운 지갑을 사용할 수 있음을 DApp에 알립니다. 디앱은 이 이벤트를 수신하여 현재 사용 가능한 지갑을 파악합니다.
이렇게 하면 전역 변수를 직접 사용하는 문제를 피할 수 있으며, 추상적인 이벤트 수신 로직을 통해 사용자 환경에서 현재 사용 가능한 지갑을 자동으로 파악할 수 있습니다. 이런 식으로 딜레마가 해결됩니다.
커뮤니티 표준: 지갑 표준
EIP-6963은 이더리움 에코 표준이지만, 이더뿐만 아니라 다른 체인 플랫폼도 비슷한 문제를 겪을 수 있습니다. 예를 들어, 솔라나 체인 지갑은 일반적으로 "window.solana" 변수에 자신을 주입하여 다시 경쟁 상황을 만듭니다.
그렇다면 솔라나 생태계에서도 이 표준을 구현할 수 있을까요? EIP-6963은 이더리움 생태계에서 지갑 검색을 다루기 위한 것이지만, 그 안에 포함된 아이디어는 실제로 모든 체인 플랫폼에 적용될 수 있습니다. 그렇다면 한 걸음 더 나아가 모든 블록체인 플랫폼의 지갑과 디앱이 구현할 수 있는 공통의 표준을 제공하여 모든 체인 플랫폼의 개발자와 사용자가 EIP-6963이 제공하는 편리함을 누릴 수 있도록 할 수 있을까요?
월렛 표준이 하는 일의 핵심은 두 가지 기능, 즉 "registerWallet"과 "getWallet", "registerWallet"과 "registerWallet"을 제공하는 것입니다. "전자는 지갑용, 후자는 디앱용입니다.
월렛은 " getWallets"를 호출하여 지갑에서 제공하는 기능을 캡슐화하는 지갑 객체(예: Connect 메서드, 예를 들어 예를 들어, 지갑에 연결하는 데 사용되는 Connect 메서드). 함수 내부에서 RegisterWalletEvent 이벤트가 트리거되고, 이벤트의 매개변수는 실제로 디앱이 RegisterWalletEvent 이벤트를 수신하는 데 사용되는 콜백 함수이며, 이 콜백 함수는 실제로 지갑 객체를 전달하므로 디앱은 지갑 객체에 대한 참조를 얻고 지갑과 상호 작용할 수 있습니다. 따라서 디앱은 지갑 객체에 대한 참조를 가져와서 지갑과 상호작용할 수 있습니다.
댑 지갑 객체를 수신하고 수신하기 위해 개발자가 직접 코드를 작성할 필요가 없는데, 이 부분은 Wallet Standard에 "getWallets"라는 이름으로 내장되어 있기 때문입니다. 그러나 getWallets는 이벤트만 수신 대기하므로 개발자는 여전히 이벤트를 처리하는 방법을 고려해야 합니다. 예를 들어, 가져온 지갑을 어디에 넣어야 할까요? 어떤 지갑은 DApp이 로드되기 전에 로드되고 어떤 지갑은 나중에 로드될 수 있는데, 이러한 지갑의 상태를 어떻게 유지할 것인가? 위의 문제에 대한 자세한 내용은 Wallet Standard에서 "@wallet-standard/react;" 패키지를 제공하면서 개발자가 직접 이를 사용하여 React Hook을 통해 지갑 목록, 현재 연결된 지갑, 지갑에서 제공하는 메소드 등 원하는 데이터를 가져올 수 있습니다.
지갑 표준 기능
지갑 객체의 기본 가져오는 것 외에도, Wallet Standard는 여러 가지 기능 형식도 정의합니다.
사실 지갑에는 연결, 지갑 이벤트 수신 등과 같은 몇 가지 기본 기능이 있습니다. 지갑 표준은 "standard:connect", "standard:events " 등과 같은 기능을 제공합니다. 지갑 표준은 "standard:connect", "standard:events" 등과 같은 기능을 제공합니다. 지갑 공급자가 이러한 기능을 구현하면, 디앱은 이 값을 기반으로 지갑이 특정 작업을 지원하는지 여부를 결정할 수 있습니다.
위에서 언급한 "표준:*"는 기본으로 정의된 기능으로, 사실 그 값이 특별히 까다롭지 않기 때문에 마음대로 확장할 수 있습니다. 솔라나와 같이 각기 다른 체인 플랫폼에서도 "솔라나:*"가 될 수 있는 고유한 기능이 있습니다. 솔라나 플랫폼의 공통 기능으로는 "solana:signTransaction", "solana:signMessage" 등이 있습니다.
월렛 표준 상태
현재 월렛 표준을 구현한 곳은 많지 않습니다.
안트 디자인 웹3용 솔라나 어댑터는 월렛 표준이 적용된 지갑의 자동 감지 기능도 지원하며, 개발자는 기본적으로 "autoAddRegistered" 버튼을 통해 어댑터에 월렛 표준을 추가하기만 하면 됩니다. 자동 추가 등록 지갑'을 켜면 많은 지갑 메타데이터를 구성할 필요 없이 개발 환경과 사용자 환경을 바로 설정할 수 있습니다.
ZAN.TOP의 지갑 연결 로직도 초기에는 같은 문제가 있었지만, 지금은 Ant Design Web3에서 제공하는 구성 덕분에 EIP-6963 표준에 쉽게 적응할 수 있습니다. https://zan.top/personal/account?chInfo=ch_wxdyh 바인딩 주소에서 이미 경험하셨을 것입니다.
블록체인 생태계 전반의 구현
현재 블록체인 플랫폼이 모두 월렛 표준(또는 EIP-6963) 표준에 대해 동일한 태도를 취하고 있지는 않습니다.
비트코인
비트코인은 아직까지 비슷한 표준이 없는 것으로 보이며, 월렛 표준을 구현하는 프로젝트가 있지만 큰 주목을 받지 못했고 한동안 새로운 코드가 제출되지도 않았습니다. 월렛 표준 표준을 구현하는 프로젝트가 있지만 큰 관심을 끌지 못했고 오랫동안 새로운 코드가 제출되지 않았습니다.
현재 개발자는 수동으로 상태를 유지하거나 일부 패키지를 사용하여 도움을 받아야 합니다. 예를 들어, Ant Design Web3의 비트코인 어댑터 구현에서는 서로 다른 지갑에 대해 서로 다른 전역 변수에서 가져와 통합된 상태로 저장합니다. 이는 사실상 라이브러리 개발자가 상태를 유지하는 지루한 작업을 대신하는 것입니다. 또한 지갑 충돌 문제만 해결할 뿐, 사용 가능한 지갑을 자동으로 감지하지 못하는 문제는 여전히 존재합니다.
이더리움
이더리움 플랫폼에는 이미 EIP-6963 표준이 있으며, 대부분의 관련 라이브러리와 지갑이 이를 지원합니다.
솔라나
위와 같이 공식 구현은 https://github.com/solana-labs/wallet-standard
Ether 플랫폼은 이미 EIP-6963 표준을 가지고 있습니다. p>수이
수이는 이제 공식 문서에서 확인할 수 있는 월렛 표준 구현을 제공했습니다: https://docs.sui.io/. standards/wallet-standard
앱 라이브러리 지원
wagmi
wagmi는 문서화된 대로 mipd(https://github.com/wevm/mipd) 라이브러리를 통해 EIP-6963에 대한 지원을 제공합니다.
RainbowKit
RainbowKit(https://www.rainbowkit.com/)은 wagmi의 내부 로직을 기반으로 하기 때문에 이미 EIP-6963을 기본 지원합니다.
Ant Design Web3
Ant Design Web3용 이더리움 및 솔라나 어댑터(https://web3.ant.design/)는 두 표준을 모두 지원합니다. 솔라나 어댑터는 두 표준을 모두 지원하며 개발자가 쉽게 사용할 수 있도록 이식성이 뛰어납니다.
이더넷 DApp 개발자의 경우, 23-25줄의 EIP-6963과 관련된 구성만 추가하면 됩니다:
솔라나 생태계의 디앱 개발자의 경우 접근 방식도 비슷합니다. 자동 추가 등록 지갑 속성을 제공합니다.
요약
EIP-6963과 월렛 표준은 지갑에 연결하는 사용자 경험을 크게 개선하고 새로운 지갑 제공자의 진입 장벽을 낮출 수 있습니다. 앞으로 더 많은 체인 플랫폼과 지갑 및 디앱 개발자들이 이러한 표준을 제공하거나 구현하여 Web3가 더 나은 방향으로 발전할 수 있기를 바랍니다.