Close Menu
    Trending
    • Bitcoin Price Crashes 6% To $84,000 In Sharp Sell-Off
    • Bitcoin Price Plunges to 6-Week Low as Liquidations Explode Amid Iran Strike Fears
    • OSL Group Raises $200M to Expand Stablecoin, Payments Business
    • Pundit Says XRP Price Is Not A ‘Crypto’ Question, But A Systemically Important Liquidity Asset
    • Ethereum Foundation is hiring an Executive Director
    • Why Is Crypto Down Today? Bitcoin Coils Below $88k As Market Waits For Q4 GDP Data
    • Is Bitcoin Repeating Its Darkest Bear Market History?
    • Tom Lee Says Crypto Not Keeping Up With Improving Fundamentals, Sees Precious Metals ‘Sucking the Oxygen’ out of the Room
    CryptoGate
    • Home
    • Bitcoin News
    • Cryptocurrency
    • Crypto Market Trends
    • Altcoins
    • Ethereum
    • Blockchain
    • en
      • en
      • fr
      • de
      • it
      • ja
    CryptoGate
    Home»Ethereum»Smart Contract Security | Ethereum Foundation Blog
    Ethereum

    Smart Contract Security | Ethereum Foundation Blog

    CryptoGateBy CryptoGateJanuary 8, 2026No Comments8 Mins Read
    Share
    Facebook Twitter LinkedIn Pinterest Email


    Solidity was began in October 2014 when neither the Ethereum community nor the digital machine had any real-world testing, the gasoline prices at the moment had been even drastically completely different from what they’re now. Moreover, a few of the early design choices had been taken over from Serpent. Over the last couple of months, examples and patterns that had been initially thought of best-practice had been uncovered to actuality and a few of them truly turned out to be anti-patterns. On account of that, we lately up to date a few of the Solidity documentation, however as most individuals in all probability don’t observe the stream of github commits to that repository, I want to spotlight a few of the findings right here.

    I cannot discuss concerning the minor points right here, please learn up on them within the documentation.

    Sending Ether

    Sending Ether is meant to be one of many easiest issues in Solidity, however it seems to have some subtleties most individuals don’t realise.

    It’s important that at greatest, the recipient of the ether initiates the payout. The next is a BAD instance of an public sale contract:

    // THIS IS A NEGATIVE EXAMPLE! DO NOT USE!
    contract public sale {
      deal with highestBidder;
      uint highestBid;
      operate bid() {
        if (msg.worth  highestBid) throw;
        if (highestBidder != 0)
          highestBidder.ship(highestBid); // refund earlier bidder
        highestBidder = msg.sender;
        highestBid = msg.worth;
      }
    }

    Due to the maximal stack depth of 1024 the brand new bidder can at all times improve the stack dimension to 1023 after which name bid() which can trigger the ship(highestBid) name to silently fail (i.e. the earlier bidder won’t obtain the refund), however the brand new bidder will nonetheless be highest bidder. One option to verify whether or not ship was profitable is to verify its return worth:

    /// THIS IS STILL A NEGATIVE EXAMPLE! DO NOT USE!
    if (highestBidder != 0)
      if (!highestBidder.ship(highestBid))
        throw;

    The

    throw

    assertion causes the present name to be reverted. This can be a dangerous thought, as a result of the recipient, e.g. by implementing the fallback operate as

    operate() { throw; }

    can at all times drive the Ether switch to fail and this is able to have the impact that no one can overbid her.

    The one option to stop each conditions is to transform the sending sample right into a withdrawing sample by giving the recipient management over the switch:

    /// THIS IS STILL A NEGATIVE EXAMPLE! DO NOT USE!
    contract public sale {
      deal with highestBidder;
      uint highestBid;
      mapping(deal with => uint) refunds;
      operate bid() {
        if (msg.worth  highestBid) throw;
        if (highestBidder != 0)
          refunds[highestBidder] += highestBid;
        highestBidder = msg.sender;
        highestBid = msg.worth;
      }
      operate withdrawRefund() {
        if (msg.sender.ship(refunds[msg.sender]))
          refunds[msg.sender] = 0;
      }
    }
     

    Why does it nonetheless say “damaging instance” above the contract? Due to gasoline mechanics, the contract is definitely effective, however it’s nonetheless not an excellent instance. The reason being that it’s unattainable to forestall code execution on the recipient as a part of a ship. Because of this whereas the ship operate remains to be in progress, the recipient can name again into withdrawRefund. At that time, the refund quantity remains to be the identical and thus they’d get the quantity once more and so forth. On this particular instance, it doesn’t work, as a result of the recipient solely will get the gasoline stipend (2100 gasoline) and it’s unattainable to carry out one other ship with this quantity of gasoline. The next code, although, is susceptible to this assault: msg.sender.name.worth(refunds[msg.sender])().

    Having thought of all this, the next code must be effective (in fact it’s nonetheless not an entire instance of an public sale contract):

    contract public sale {
      deal with highestBidder;
      uint highestBid;
      mapping(deal with => uint) refunds;
      operate bid() {
        if (msg.worth  highestBid) throw;
        if (highestBidder != 0)
          refunds[highestBidder] += highestBid;
        highestBidder = msg.sender;
        highestBid = msg.worth;
      }
      operate withdrawRefund() {
        uint refund = refunds[msg.sender];
        refunds[msg.sender] = 0;
        if (!msg.sender.ship(refund))
         refunds[msg.sender] = refund;
      }
    }

    Word that we didn’t use throw on a failed ship as a result of we’re capable of revert all state modifications manually and never utilizing throw has lots much less side-effects.

    Utilizing Throw

    The throw assertion is usually fairly handy to revert any modifications made to the state as a part of the decision (or entire transaction relying on how the operate known as). You must remember, although, that it additionally causes all gasoline to be spent and is thus costly and can doubtlessly stall calls into the present operate. Due to that, I want to suggest to make use of it solely within the following conditions:

    1. Revert Ether switch to the present operate

    If a operate will not be meant to obtain Ether or not within the present state or with the present arguments, it’s best to use throw to reject the Ether. Utilizing throw is the one option to reliably ship again Ether due to gasoline and stack depth points: The recipient may need an error within the fallback operate that takes an excessive amount of gasoline and thus can not obtain the Ether or the operate may need been referred to as in a malicious context with too excessive stack depth (maybe even previous the calling operate).

    Word that by accident sending Ether to a contract will not be at all times a UX failure: You possibly can by no means predict wherein order or at which era transactions are added to a block. If the contract is written to solely settle for the primary transaction, the Ether included within the different transactions must be rejected.

    2. Revert results of referred to as features

    When you name features on different contracts, you may by no means know the way they’re carried out. Because of this the consequences of those calls are additionally not know and thus the one option to revert these results is to make use of throw. In fact it’s best to at all times write your contract to not name these features within the first place, if you recognize you’ll have to revert the consequences, however there are some use-cases the place you solely know that after the actual fact.

    Loops and the Block Gasoline Restrict

    There’s a restrict of how a lot gasoline might be spent in a single block. This restrict is versatile, however it’s fairly laborious to extend it. Because of this each single operate in your contract ought to keep under a specific amount of gasoline in all (affordable) conditions. The next is a BAD instance of a voting contract:

    /// THIS IS STILL A NEGATIVE EXAMPLE! DO NOT USE!
    contract Voting {
      mapping(deal with => uint) voteWeight;
      deal with[] yesVotes;
      uint requiredWeight;
      deal with beneficiary;
      uint quantity;
      operate voteYes() { yesVotes.push(msg.sender); }
      operate tallyVotes() {
        uint yesVotes;
        for (uint i = 0; i  yesVotes.size; ++i)
          yesVotes += voteWeight[yesVotes[i]];
        if (yesVotes > requiredWeight)
          beneficiary.ship(quantity);
      }
    }

    The contract truly has a number of points, however the one I want to spotlight right here is the issue of the loop: Assume that vote weights are transferrable and splittable like tokens (consider the DAO tokens for instance). This implies which you can create an arbitrary variety of clones of your self. Creating such clones will improve the size of the loop within the tallyVotes operate till it takes extra gasoline than is offered inside a single block.

    This is applicable to something that makes use of loops, additionally the place loops aren’t explicitly seen within the contract, for instance while you copy arrays or strings inside storage. Once more, it’s effective to have arbitrary-length loops if the size of the loop is managed by the caller, for instance if you happen to iterate over an array that was handed as a operate argument. However by no means create a state of affairs the place the loop size is managed by a celebration that may not be the one one affected by its failure.

    As a aspect be aware, this was one motive why we now have the idea of blocked accounts contained in the DAO contract: Vote weight is counted on the level the place the vote is solid, to forestall the truth that the loop will get caught, and if the vote weight wouldn’t be mounted till the top of the voting interval, you can solid a second vote by simply transferring your tokens after which voting once more.

    Receiving Ether / the fallback operate

    In order for you your contract to obtain Ether by way of the common ship() name, it’s important to make its fallback operate low cost. It will probably solely use 2300, gasoline which neither permits any storage write nor operate calls that ship alongside Ether. Principally the one factor it’s best to do contained in the fallback operate is log an occasion in order that exterior processes can react on the actual fact. In fact any operate of a contract can obtain ether and isn’t tied to that gasoline restriction. Features truly need to reject Ether despatched to them if they don’t need to obtain any, however we’re enthusiastic about doubtlessly inverting this behaviour in some future launch.



    Source link

    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    CryptoGate
    • Website
    • Pinterest

    Related Posts

    Ethereum Foundation is hiring an Executive Director

    January 29, 2026

    Ethereum And Solana Are Flashing Caution Signals With Negative Buy/Sell Pressure Data – What This Means

    January 29, 2026

    Ethereum Holders Jump 3% In January, Clear 175 Mil Milestone

    January 29, 2026

    Ethereum Foundation Open Call re: Board Selection

    January 28, 2026
    Add A Comment
    Leave A Reply Cancel Reply

    Top Posts

    ETH Bulls Eye $4,000 But Consolidation Seems More Likely

    July 20, 2025

    Ethereum Is Positioned As The Backbone Of AI-Powered Finance, Here’s Why

    August 26, 2025

    Bitcoin Is Draining The Value Out Of Real Estate

    July 14, 2025

    Bitcoin 2026: Early Signs Point to a Liquidity-Led Rebound

    January 3, 2026

    Wellgistics Launches XRP Payments for US Pharmacies

    August 16, 2025
    Categories
    • Altcoins
    • Bitcoin News
    • Blockchain
    • Crypto Market Trends
    • Crypto Mining
    • Cryptocurrency
    • Ethereum
    About us

    Welcome to cryptogate.info — your trusted gateway to the latest and most reliable news in the world of cryptocurrency. Whether you’re a seasoned trader, a blockchain enthusiast, or just curious about the future of digital finance, we’re here to keep you informed and ahead of the curve.

    At cryptogate.info, we are passionate about delivering timely, accurate, and insightful updates on everything crypto — from market trends, new coin launches, and regulatory developments to expert analysis and educational content. Our mission is to empower you with knowledge that helps you navigate the fast-paced and ever-evolving crypto landscape with confidence.

    Top Insights

    HBAR ETF Door Cracks Open Amid US Government Restart

    October 23, 2025

    Dormant Whale Sells $80,000 BTC, But Bitcoin Bulls Still In Control

    July 27, 2025

    Microsoft signs $9.7B deal with BTC miner IREN

    November 4, 2025
    Categories
    • Altcoins
    • Bitcoin News
    • Blockchain
    • Crypto Market Trends
    • Crypto Mining
    • Cryptocurrency
    • Ethereum
    YouTube
    • Privacy Policy
    • Disclaimer
    • Terms and Conditions
    • Impressum
    • About us
    • Contact us
    Copyright © 2025 CryptoGate All Rights Reserved.

    Type above and press Enter to search. Press Esc to cancel.