
Une conception astucieuse de contrat : comment stETH distribue-t-il automatiquement les revenus quotidiennement ?
TechFlow SélectionTechFlow Sélection

Une conception astucieuse de contrat : comment stETH distribue-t-il automatiquement les revenus quotidiennement ?
Le nombre de stETH augmente bien que le compte n'ait effectué aucune transaction.
Rédaction : ZAN Team
Après avoir échangé une petite quantité de mes ETH contre du stETH, j'ai remarqué que mon solde en stETH augmentait naturellement chaque jour, générant continuellement des revenus. Pourtant, je ne voyais aucune transaction apparaître sur mon compte. Pourquoi cela ? Cet article vous emmène découvrir la conception ingénieuse derrière ce mécanisme et percer le secret de la distribution des收益.

Un stETH a déjà généré des收益 après quelques jours
Avant d'aller plus loin, présentons brièvement la logique sous-jacente à la génération des收益 par le stETH : le « staking » (mise en gage) d'Ether. Les lecteurs déjà familiers avec ce concept peuvent passer directement à la suite.

Initialement, Ethereum fonctionnait comme Bitcoin selon un mécanisme de consensus Proof of Work (PoW). Toutefois, en raison de sa consommation énergétique élevée ainsi que pour des raisons de sécurité et de performance, Ethereum est passé au Proof of Stake (PoS) en septembre 2022.
Ethereum, qui s'appuyait auparavant sur la puissance de calcul pour inciter les mineurs à valider le réseau, a désormais adopté un modèle où les participants obtiennent des droits de vote en mettant en jeu (« stakant ») des ETH, permettant ainsi de générer des收益 tout en maintenant la sécurité du réseau via PoS.
En misant 32 ETH, on peut rejoindre le réseau Ethereum en tant que validateur, chargé de stocker les données, traiter les transactions et ajouter de nouveaux blocs à la blockchain. En exécutant correctement ces tâches — notamment en proposant de nouveaux blocs valides et en vérifiant le travail des autres validateurs —, on reçoit des récompenses en ETH. Ainsi, le « staking » permet aux détenteurs d’ETH d’obtenir des收益 relativement stables.
Toutefois, cette forme de mise en gage reste peu accessible aux utilisateurs ordinaires : posséder 32 ETH et disposer d’un ordinateur dédié connecté en permanence au réseau Ethereum constitue un seuil élevé. De plus, bloquer ses ETH dans le processus de staking implique une perte de liquidité. C’est pourquoi ont émergé les produits dérivés de staking liquide (Liquid Staking Derivatives, LSD), conçus pour résoudre ces problèmes d’accès et de liquidité. Ces solutions permettent aux utilisateurs de miser moins de 32 ETH sans avoir à gérer eux-mêmes un nœud, en confiant leurs ETH à un tiers (comme Lido ou Rocket Pool), qui leur remet en échange un jeton représentatif (par exemple, le stETH de Lido ou le rETH de Rocket Pool). Ces jetons liquides peuvent ensuite être échangés, prêtés ou utilisés dans divers protocoles financiers décentralisés. Ainsi, les utilisateurs bénéficient des收益 du staking tout en conservant une certaine flexibilité sur leurs fonds.

Le principe fondamental du stETH est donc le suivant : vous envoyez vos ETH à Lido, qui les utilise pour participer au PoS d’Ethereum et générer des收益. En retour, vous recevez des stETH comme preuve de votre part dans ce pool. La question suivante est alors : comment Lido distribue-t-il les收益 aux détenteurs de stETH ?
Nous observons que les收益 du stETH se mettent à jour automatiquement chaque jour. L’image ci-dessous illustre notre test, confirmant que l’on peut vérifier quotidiennement ces variations directement dans son portefeuille cryptographique.

À ce stade, ceux familiarisés avec le développement de contrats intelligents pourraient s’interroger : comment distribuer quotidiennement de si faibles收益, alors que ces montants sont souvent inférieurs aux frais de gaz (GAS) requis pour une transaction ?
Effectivement, si Lido appliquait la méthode la plus simple — envoyer directement les收益 à chaque adresse —, le coût en gaz serait prohibitif. Imaginer effectuer des milliers, voire des millions de transferts quotidiennement semble irréaliste.
Et pourtant, le solde en stETH dans nos portefeuilles augmente bien automatiquement chaque jour, sans qu’aucune transaction soit visible. Comment cela est-il possible ?
Nous avons examiné le contrat de Lido disponible ici : https://etherscan.io/token/0xae7ab96520de3a18e5e111b5eaab095312d7fe84, et nous sommes concentrés sur la méthode balanceOf :

La méthode balanceOf fait partie de la norme ERC20 ; c’est elle que les portefeuilles utilisent pour afficher le nombre de jetons détenus par un utilisateur.
Dans le cas du stETH, cette méthode appelle getPooledEthByShares. Cette dernière prend en paramètre shares, un mapping privé mapping(address => uint256) indiquant la part de chaque utilisateur. Mais cette valeur représente-t-elle directement le nombre de stETH ? Manifestement non, car mettre à jour quotidiennement le solde de chaque adresse coûterait une quantité énorme de gaz, même avec une mise à jour groupée via une seule transaction.
Vous commencez probablement à deviner le truc. Examinons maintenant la méthode getPooledEthByShares.

On constate que le résultat final est calculé en multipliant la part de l’adresse (sharesAmount) par _getTotalPooledEther(), puis en divisant par _getTotalShares.
_getTotalPooledEther correspond au nombre total d’ETH (ou de stETH, étant donné que initialement 1 stETH = 1 ETH) détenus dans le pool. _getTotalShares représente le nombre total de parts attribuées. Ainsi, le solde en stETH de chaque adresse est calculé dynamiquement à la demande.
Par exemple, supposons qu’il y ait 1000 parts au total (_getTotalShares), dont 100 détenues par l’adresse A (sharesAmount). Si ces 1000 parts représentent initialement 1000 stETH (_getTotalPooledEther), alors l’adresse A possède 100 * 1000 / 1000 = 100 stETH. Lorsque Lido gagne 1 ETH supplémentaire grâce au staking, _getTotalPooledEther passe à 1001. Le nouveau solde de l’adresse A devient donc 100 * 1001 / 1000 = 100,1 stETH.
En résumé : la part (« shares ») de chaque adresse reste constante, mais la valeur de chaque part augmente avec le temps. Dès lors, le solde en stETH augmente automatiquement lors du calcul.
Continuons l’analyse du code. La valeur retournée par _getTotalPooledEther est mise à jour par la méthode handleOracleReport, qui modifie les données internes du contrat. Cette mise à jour est déclenchée régulièrement par un autre contrat situé à l’adresse https://etherscan.io/address/0x852deD011285fe67063a08005c71a85690503Cee, qui appelle submitReportData — cette dernière invoquant à son tour handleOracleReport dans le contrat Lido :

On observe que cette mise à jour est effectuée quotidiennement. Voilà pourquoi, bien que nos adresses n’enregistrent aucune transaction apparente, le solde en stETH continue d’évoluer chaque jour.
Ce mécanisme illustre une caractéristique importante des contrats ERC20 sur Ethereum : le solde d’un utilisateur n’est pas nécessairement une valeur statique stockée en dur, mais peut être calculé dynamiquement par une fonction du contrat. Ainsi, il est possible qu’un portefeuille affiche un solde croissant sans aucune transaction entrante. Ce design rend les contrats plus flexibles, mais peut aussi prêter à confusion pour les utilisateurs non avertis. Nous espérons que cet article contribuera à mieux comprendre le fonctionnement des contrats intelligents et à interagir avec eux de manière plus sûre.
Enfin, bien que convertir ses ETH en stETH permette de percevoir des收益 apparemment stables, des risques existent néanmoins. Cet article a uniquement vocation à présenter un aspect technique du contrat de staking et ne constitue en aucun cas un conseil d’investissement.
Bienvenue dans la communauté officielle TechFlow
Groupe Telegram :https://t.me/TechFlowDaily
Compte Twitter officiel :https://x.com/TechFlowPost
Compte Twitter anglais :https://x.com/BlockFlow_News














