MetaMask Snaps ist der Fahrplan, um MetaMask zur erweiterbarsten Wallet der Welt zu machen. Als Entwickler kannst du deine Features und APIs auf völlig neue Weise in MetaMask einbringen. Web3-Entwickler sind der Kern dieses Wachstums, und diese Serie zielt darauf ab, die innovativen MetaMask Snaps vorzustellen, die heute entwickelt werden.
Smart Account Sessions
Snap-Repo: https://github.com/livingrockrises/snap-auto-approvals
Warum hast du es gebaut?
Um eine nahtlose Benutzererfahrung für Gaming-Dapps zu schaffen und ihnen eine Möglichkeit für automatische Genehmigungen auf sichere Weise zu bieten.
Kannst du uns durch die technische Implementierung führen?
Die App
Unser Snap besteht aus zwei Teilen. Der erste ist eine Website, mit der Benutzer interagieren. Der zweite ist der eigentliche Snap. Diese beiden Elemente funktionieren ähnlich wie eine Client-Server-Architektur, wobei der Snap der Server und die Website der Client ist.
Die Website hat folgenden Benutzerablauf:
Verbinde deine EOA und installiere den Smart Account Session Snap.
Aktiviere Smart Account auf der MetaMask-Adresse. MetaMask EOA wird der Controller dieses Smart Accounts sein.
Aktiviere das Session Module auf deinem Smart Account. Module ermöglichen zusätzliche Zugriffssteuerungslogik für deinen Smart Safe Account. Im Wesentlichen wird jeder Smart Account auf zwei Arten kontrolliert: durch den MetaMask-Account-Inhaber mit seinen Signer-Keys und durch optionale Module mit eigener benutzerdefinierter Zugriffslogik.
Erstelle eine Session.
Dadurch werden temporäre Session Keys auf deinem Smart Account erstellt, die autorisiert sind, Transaktionen über das Modul in deiner Wallet durchzuführen. Sessions können Parameter wie startTime, endTime und Berechtigungen für benutzerdefinierte Aktionen auf Dapp-Contracts haben.
Sende automatisch genehmigte Transaktionen mit dem obigen Session Key ohne MetaMask-Popup für Gas oder Signaturen.
Die MetaMask API
MetaMask stellt API-Aufrufe bereit, die von MetaMask Snaps verwendet werden können, sofern vom Benutzer genehmigt.
In diesem Fall haben wir Folgendes genutzt:
snap_manageState – ermöglicht es uns, verschlüsselte Daten in MetaMask zu speichern. Zum Beispiel verwenden wir es, um das erstellte Session Key Pair zu speichern.
export type SessionKeyStorage = {
owner: string;
sessionKey: string;
pk: string;
};
export const storeSessionInfo = async (data: SessionKeyStorage) => {
await wallet.request({
method: 'snap_manageState',
params: ['update', data],
});
};
export const clearSessionInfo = async () => {
const result = await wallet.request({
method: 'snap_manageState',
params: ['clear'],
});
return result;
};
export const getSessionInfo = async () => {
const result = await wallet.request({
method: 'snap_manageState',
params: ['get'],
});
return result;
};
snap_confirm – ermöglicht es uns, verschlüsselte Daten in MetaMask zu speichern. Zum Beispiel verwenden wir es, um erstellte Accounts zu speichern.
export const promptUser = async (
prompt: string,
description: string,
content: string,
): Promise<boolean> => {
const response: any = await wallet.request({
method: 'snap_confirm',
params: [
{
prompt,
description,
textAreaContent: content,
},
],
});
console.log('Prompt user response', response);
if (response) {
return response;
}
return false;
};
promptUser(getMessage(origin),
'Do you want to use Smart Account',
`Your Smart Account Address is ${_smartAccount.address}`,
).then((approval) => {
if (approval) {
console.log('Sending smart acccount response ', _smartAccount);
resolve({
address: _smartAccount.address,
owner: _smartAccount.owner,
});
} else {
reject(new Error('EOA user'));
}
});
Der Snap verarbeitet eingehende JSON-RPC-Anfragen, die über wallet_invokeSnap von der Website gesendet werden.
Für den oben beschriebenen App-Ablauf haben wir benutzerdefinierte Request-Methoden wie connect, enable_session_module, create_session und interact erstellt. Ein Beispiel ist unten aufgeführt und der Code ist hier zu finden.
export const useSmartAccount = async () => {
console.log('invoke Snap...');
const smartAccountResponse: any = await window.ethereum.request({
method: 'wallet_invokeSnap',
params: [
defaultSnapOrigin,
{
method: 'connect',
params: [],
},
],
});
return smartAccountResponse;
};
Session Key Module
Wir haben ein Gnosis-Safe-ähnliches Modul geschrieben, um die Funktionalität der Smart Contract Wallet mithilfe von Zugriffssteuerung mit Session Keys zu erweitern.
Den Code findest du hier für Modul- und Wallet-Contracts.
struct Session {
address smartAccount;
address sessionKey;
uint256 startTimestamp;
uint256 nonce;
uint256 endTimestamp;
bool enable;
PermissionStorage permission;
}
struct PermissionStorage {
address[] whitelistDestinations;
mapping(address => bool) whitelistDestinationMap;
mapping(address => bytes4[]) whitelistMethods;
mapping(address => mapping(bytes4 => bool)) whitelistMethodsMap;
mapping(address => TokenApproval) tokenApprovals;
}
Wenn eine Session durch Aufrufen des Snaps und damit des Smart Accounts erstellt wird, wird die folgende Methode über einen Relayer vom Smart Account auf dem Session Key Module aufgerufen.
function createSession(
address sessionKey,
PermissionParam[] calldata permissions,
SessionParam calldata sessionParam
) external {
require(
!sessionMap[sessionKey].enable,
"Session for key is already enabled"
);
Session storage _session = sessionMap[sessionKey];
...
txHash: https://goerli.etherscan.io/tx/0x8b45f4cb0a7527bb7c44f6923eb9bb391faa656e212829ce0fd9c733ca71352b
Sobald die Session erstellt wurde, kann ein Relayer eine Transaktion auf dem Session Key Module mit einem gültigen Session Key und einer Signatur aufrufen.
function executeTransaction(
address _sessionKey,
address payable _to,
uint256 _value,
bytes calldata _data,
bytes calldata signature
) external returns (bool success) {
Session storage session = sessionMap[_sessionKey];
require(session.enable, "Session is not active");
require(
session.startTimestamp <= block.timestamp,
"Session has not yet started"
);
require(session.endTimestamp >= block.timestamp, "Session has expired");
...
txHash: https://goerli.etherscan.io/tx/0xf6d40bf9c74cff266f8bc26dabcf7a44ca1c0e85387f297f43fa5cb89bbea1a0
Das SDK
Das Biconomy SDK ist die ultimative Web3-Suite für Entwickler, um Smart Accounts zu nutzen und Benutzerreisen von komplexen mehrstufigen Prozessen in ein einfaches Ein-Klick-Erlebnis zu vereinfachen.
Jeder Benutzer erhält eine Smart Contract Wallet anstelle eines einfachen kryptografischen Schlüsselpaars, und dApps können mithilfe von Transaktions-Bundles über diese SC-Wallet alle möglichen nahtlosen Interaktionen für den Benutzer anpassen.
Wir haben die folgende Funktion mit dem 'connect' RPC-Aufruf durch Aufrufen des Snaps verknüpft.
import SmartAccount from '@biconomy-sdk/smart-account';
async function getsmartAccount(): Promise<SmartAccount> {
smartAccount = new SmartAccount(wallet, {
activeNetworkId: Number(wallet.chainId),
});
smartAccount = await smartAccount.init();
console.log('initialized');
console.log(smartAccount);
return smartAccount;
}
Was sind die nächsten Schritte, wenn du dies implementieren würdest?
Wir freuen uns auf das Keyrings-Feature und die Möglichkeit, Smart Account-Informationen anstelle von EOAs in der MetaMask-Benutzeroberfläche anzuzeigen.
Wir werden das Biconomy SDK veröffentlichen, das mit MetaMask Snaps kompatibel ist, damit Entwickler es nutzen können.
Hinzufügen eines Social Recovery Module und Ein-Klick-Cross-Chain-Batched-Transaktionen mithilfe von Smart Accounts sowie Anzeige von Benachrichtigungen, sobald die Transaktion auf der Ziel-Chain ausgeführt wird.
Kannst du uns etwas über dich und dein Team erzählen?
Sachin ist CTO und Mitgründer bei Biconomy. Mit einem Hintergrund in Informatik verfügt er über 6 Jahre Web2- und 5 Jahre Web3-Erfahrung. Er liebt es, strukturiert an die Problemlösung heranzugehen, und arbeitet gerne hands-on, um seine Ideen schnell umzusetzen und zu testen.
Chirag ist Blockchain-Ingenieur bei Biconomy. Er liebt das Programmieren und lernt alles rund um Web3 durch Forschung und Entwicklung.
Wann wurdest du zum ersten Mal mit MetaMask Snaps bekannt und wie war deine Erfahrung?
Wir haben kurz vor dem ETHBogota-Hackathon von MetaMask Snaps erfahren. Wir waren sehr beeindruckt von der Dokumentation und den Möglichkeiten durch die Snap-Methoden.
Was unterscheidet MetaMask Snaps von anderen Wallets?
Die Möglichkeit, die Features der MetaMask Wallet zu erweitern, ohne vom MetaMask-Core-Team abhängig zu sein, und schnelleres Wachstum zu ermöglichen. Entwickler können auf bestehende MetaMask-Features wie das JSON-RPC-Calls-Interface und den Speicher zugreifen.
Erzähl uns, wie es für dich und dein Team ist, MetaMask Snaps mit MetaMask zu entwickeln?
Die grundlegende Entwicklung war sehr intuitiv, aber wir haben viel Zeit damit verbracht, einige der Berechtigungsanforderungen für bestimmte Methoden herauszufinden. Die Möglichkeit, benutzerdefinierte UI-Elemente zu erstellen – zum Beispiel um das Guthaben von Smart Contract Wallets genauso wie bei EOAs anzuzeigen – ist momentan noch etwas knifflig.
Was bedeuten MetaMask Snaps für dich?
Es ist eine Geheimwaffe, die es uns ermöglicht, ERC4337 Smart Contract Wallets innerhalb von MetaMask zu unterstützen, ohne ein benutzerdefiniertes Widget entwickeln oder dApps dazu bringen zu müssen, es in ihr Frontend zu integrieren.
Welche Möglichkeiten siehst du mit MetaMask Snaps und was sie für den Web3-Bereich erschließen?
Dapp-spezifische, angepasste MetaMask Snaps können eine bessere Benutzererfahrung bieten und Multichain-Interaktionen ermöglichen. Einführung von Fee Abstraction, Account Abstraction und Wallet-Sicherheitsfunktionen auf Basis der bestehenden Web3-Nutzerbasis.
Hast du Ratschläge für Entwickler, die MetaMask Snaps ausprobieren möchten?
Schau dir die GitHub-Diskussionen und Discord an, die dabei helfen können, viele Hindernisse in deiner Entwicklung zu überwinden. Jeder, der mit JavaScript und JSON-RPC-Aufrufen vertraut ist, kann entwickeln. Snap-Monorepos und Beispiel-MetaMask-Snaps sind ein guter Ausgangspunkt, um deine Entwicklung zu beschleunigen.
Wenn du etwas speichern möchtest, kann nur ein einzelnes Objekt gespeichert werden, sodass du mehrere Schlüssel-Wert-Paare in einem einzigen Objekt verschachteln kannst. Wenn du Antworten von benutzerdefinierten aufgerufenen Snap-Methoden zurückgeben musst, stelle sicher, dass ein einfaches JSON-Objekt zurückgegeben wird.
Mit MetaMask Snaps entwickeln
So startest du mit MetaMask Snaps:
Schau dir die Entwicklerdokumentation an
Installiere MetaMask Flask
Schau dir einen MetaMask Snaps-Leitfaden an
Bleib mit uns in Kontakt auf Twitter, GitHub-Diskussionen und Discord
Halte Ausschau nach unserem Team beim nächsten Hackathon in deiner Nähe! Happy BUIDLing ⚒️
Haftungsausschluss: MetaMask Snaps werden in der Regel von Dritten entwickelt, die nicht zu Consensys Software gehören. Die Nutzung von durch Dritte entwickelten MetaMask Snaps erfolgt nach eigenem Ermessen und auf eigenes Risiko, und du stimmst zu, dass du allein für etwaige Verluste oder Schäden verantwortlich bist, die aus solchen Aktivitäten resultieren. Consensys gibt keine ausdrücklichen oder stillschweigenden Garantien, weder mündlich noch schriftlich, in Bezug auf durch Dritte entwickelte MetaMask Snaps und lehnt jegliche Haftung für durch Dritte entwickelte MetaMask Snaps ab. Die Nutzung von Blockchain-bezogener Software birgt Risiken, die du bei der Verwendung von MetaMask Snaps vollständig übernimmst.