Friday, April 10, 2026
The BLOCKCHAIN Page
No Result
View All Result
  • Home
  • Cryptocurrency
  • Blockchain
  • Bitcoin
  • Market & Analysis
  • Altcoins
  • DeFi
  • Ethereum
  • Dogecoin
  • XRP
  • Regulations
  • NFTs
The BLOCKCHAIN Page
No Result
View All Result
Home Ethereum

Serpent upgrades: More Fun Stuff

by admin
May 21, 2024
in Ethereum
0
Dodging a bullet: Ethereum State Problems
0
SHARES
4
VIEWS
Share on FacebookShare on Twitter


Over the previous two weeks our major focus has been getting the entire purchasers up to date to PoC5 compatibility, and it positively has been an extended street. Among the many adjustments to the VM embrace:

  • The brand new init/code mechanism: principally, while you create a contract, the code supplied will execute instantly, after which the return worth of that code will probably be what turns into the contract’s code. This enables us to have contract initialization code, however nonetheless hold to the identical format of [nonce, price, gas, to, value, data] for each transactions and contract creation, additionally making it simpler to create new contracts through forwarding contracts
  • Reordering transaction and contract information: the order is now [nonce, price, gas, to, value, data] in transactions and [gas, to, value, datain, datainsz, dataout, dataoutsz] in messages. Observe that Serpent retains the ship(to, worth, gasoline), o = msg(to, worth, gasoline, datain, datainsz) and o = msg(to, worth, gasoline, datain, datainsz, dataoutsz) parameters.
  • Payment changes: transaction creation now has a charge of 500 gasoline, and a number of other different charges have been up to date.
  • The CODECOPY and CALLDATACOPY opcodes: CODECOPY takes code_index, mem_index, len as arguments, and copies the code from code_index … code_index+len-1 to reminiscence mem_index … mem_index+len-1. These are very helpful when mixed with init/code. There’s additionally now CODESIZE.

The biggest adjustments, nevertheless, have been to the structure surrounding the protocol. On the GUI facet, the C++ and Go purchasers are evolving quickly, and we’ll see extra updates from that facet coming very shortly. If in case you have been following Ethereum carefully, you might have probably seen Denny’s Lotto, a full implementation of a lottery, plus GUI, written and executed contained in the C++ consumer. From right here on, the C++ consumer will shift towards being a extra developer-oriented software, whereas the Go consumer will begin to give attention to being a user-facing utility (or fairly, meta-application). On the compiler facet, Serpent has undergone a variety of substantial enhancements.

First, the code. You may peek into the Serpent compiler beneath the hood and it is possible for you to to see all of the functionsaccessible, along with their exact translations into EVM code. For instance, we have now:

72:     [‘access’, 2, 1,
73:         [”, ”, 32, ‘MUL’, ‘ADD’, ‘MLOAD’]],

Which means that what entry(x,y) is definitely doing beneath the hood is it’s recursively compiling no matter x and y really are, after which loading the reminiscence at index x + y * 32; therefore, x is the pointer to the beginning of the array and y is the index. This code construction has been round since PoC4, however now I’ve upgraded the meta-language used to explain translations even additional, in order to incorporate even when, whereas and init/code on this development (earlier than they have been particular circumstances); now, solely set and seq stay as particular circumstances, and if I needed to I may even take away seq by reimplementing it as a rewrite rule.

The biggest adjustments to date have been for PoC5 compatibility. For instance, when you run serpent compile_to_assembly ‘return(msg.information[0]*2)’, you will notice:

[“begincode0.endcode0“,“DUP“,“MSIZE“,“SWAP“,“MSIZE“,“begincode_0.endcode_0″, “DUP”, “MSIZE”, “SWAP”, “MSIZE”, “begincode0​.endcode0​“,“DUP“,“MSIZE“,“SWAP“,“MSIZE“,“begincode_0″, “CALLDATACOPY”, “RETURN”, “~begincode_0”, “#CODE_BEGIN”, 2, 0, “CALLDATALOAD”, “MUL”, “MSIZE”, “SWAP”, “MSIZE”, “MSTORE”, 32, “SWAP”, “RETURN”, “#CODE_END”, “~endcode_0”]

The precise code there may be simply:

[2, 0, “CALLDATALOAD”, “MUL”, “MSIZE”, “SWAP”, “MSIZE”, “MSTORE”, 32, “SWAP”, “RETURN”]

If you wish to see what’s happening right here, suppose {that a} message is coming in with its first datum being 5. We thus have:

2 -> Stack: [2]
0 -> Stack: [2, 0]
CALLDATALOAD -> Stack: [2,5]
MUL -> Stack: [10]
MSIZE -> Stack: [10, 0]
SWAP -> Stack: [0, 10]
MSIZE -> Stack: [0, 10, 0]
MSTORE -> Stack: [0], Reminiscence: [0, 0, 0 … 10]
32 -> Stack: [0, 32], Reminiscence: [0, 0, 0 … 10]
SWAP -> Stack: [32, 0], Reminiscence: [0, 0, 0 … 10]
RETURN

The final RETURN returns the 32 reminiscence bytes ranging from 0, or [0, 0, 0 … 10], or the quantity 10.

Now, let’s analyze the wrapper code.

[“begincode0.endcode0“,“DUP“,“MSIZE“,“SWAP“,“MSIZE“,“begincode_0.endcode_0″, “DUP”, “MSIZE”, “SWAP”, “MSIZE”, “begincode0​.endcode0​“,“DUP“,“MSIZE“,“SWAP“,“MSIZE“,“begincode_0″, “CALLDATACOPY”, “RETURN”, “~begincode_0”, “#CODE_BEGIN”, ….. , “#CODE_END”, “~endcode_0”]

I elided the interior code defined above to make issues clearer. The very first thing we see are two labels, begincode_0 andendcode_0, and the #CODE_BEGIN and #CODE_END guards. The labels mark the start and finish of the interior code, and the guards are there for the later phases of the compiler, which understands that every thing between the guards ought to be compiled as if it’s a separate program. Now, let’s take a look at the primary elements of the code. On this case, we have now ~begincode_0 at place 10 and ~endcode_0 at place 24 within the closing code. begincode0andbegincode_0 and begincode0​andendcode_0 are used to refer to those positions, and $begincode_0.endcode_0 refers back to the size of the interval between them, 14. Now, do not forget that throughout contract initialization the decision information is the code that you simply’re feeding in. Thus, we have now:

14 -> Stack: [14]
DUP -> Stack: [14, 14]
MSIZE -> Stack: [14, 14, 0]
SWAP -> Stack: [14, 0, 14]
MSIZE -> Stack: [14, 0, 14, 0]
10 -> Stack: [14, 0, 14, 0, 10]
CALLDATACOPY -> Stack: [14, 0] Reminiscence: [ … ]
RETURN

Discover how the primary half of the code cleverly arrange the stack in order that it might push the interior code into reminiscence indices 0…13, after which instantly return that chunk of reminiscence. Within the closing compiled code,600e515b525b600a37f26002600035025b525b54602052f2, the interior code sits properly to the correct of the initializer code that merely returns it. In additional complicated contracts, initializers may serve capabilities like setting sure storage slots to values, and even calling or creating different contracts.

Now, allow us to introduce the newest and most enjoyable function of Serpent: imports. One frequent use case in contract land is that you simply wish to give a contract the flexibility to spawn off new contracts. Downside is, the way to you set the code for the spawned contracts into the spawner contracts? Earlier than, the one resolution was the uncomfortable strategy of compiling the newer contracts first, after which placing the compiled code into an array. Now, we have now a greater resolution: import.

Put the next into returnten.se:

x = create(tx.gasoline – 100, 0, import(mul2.se))
return(msg(x,0,tx.gas-100,[5],1))

Now, put the next into mul2.se:

return(msg.information[0]*2)

Now, when you serpent compile returnten.se and run the contract, you discover that, voila, it returns ten. The rationale why is apparent. The returnten.se contract creates an occasion of the mul2.se contract, after which calls it with the worth 5. mul2.se, because the title suggests, is a doubler, and so it returns 5*2 = 10. Observe that import isn’t a operate in the usual sense; x = import(‘123.se’) will fail, and import solely works within the very particular context of create.

Now, suppose you’re making a 1000-line monster contract and wish to break up it up into information. To try this, we use inset. Intoouter.se, put:

if msg.information[0] == 1:
inset(interior.se)

And into interior.se, put:

return(3)

Operating serpent compile outer.se provides you a pleasant piece of compiled code that returns 3 if the msg.information[0] argument is the same as one. And that’s all there may be to it.

Upcoming updates to Serpent embrace:

  • An enchancment of this mechanism so it doesn’t load the interior code twice when you attempt to use import twice with the identical filename
  • String literals
  • Area and code-efficiency enhancements for array literals
  • A debugging decorator (ie. a compiling operate which tells you what traces of Serpent correspond to what bytes of compiled code)

Within the brief time period, although, my very own effort will give attention to bugfixes, a cross-client take a look at suite, and continued work on ethereumjs-lib.



Source link

Tags: FunSerpentStuffUpgrades
admin

admin

Recommended

SEC Chair Gary Gensler Standing in the Way of Bitcoin ETFs, Says ARK Invest’s Cathie Wood

SEC Chair Gary Gensler Standing in the Way of Bitcoin ETFs, Says ARK Invest’s Cathie Wood

2 years ago
Venezuelans Turn to Crypto Amid Worst Economic Crisis

Venezuelans Turn to Crypto Amid Worst Economic Crisis

2 years ago

Popular News

  • Protocol-Owned Liquidity: A Sustainable Path for DeFi

    Protocol-Owned Liquidity: A Sustainable Path for DeFi

    0 shares
    Share 0 Tweet 0
  • Cryptocurrency for College: Exploring DeFi Scholarship Models

    0 shares
    Share 0 Tweet 0
  • What are rebase tokens, and how do they work?

    0 shares
    Share 0 Tweet 0
  • What is Velodrome Finance (VELO): why it’s a next-gen AMM

    0 shares
    Share 0 Tweet 0
  • $10 XRP Price Envisioned By Fund Manager As Ripple Mounts Trillion-Dollar Payment Markets ⋆ ZyCrypto

    0 shares
    Share 0 Tweet 0

Latest

AirDrop is coming to older Samsung phones – is yours supported? How to get it early

AirDrop is coming to older Samsung phones – is yours supported? How to get it early

April 10, 2026
Samsung S95H vs. Samsung S95F: I compared the OLED TVs and wasn’t prepared for the upset

Samsung S95H vs. Samsung S95F: I compared the OLED TVs and wasn’t prepared for the upset

April 10, 2026

Categories

  • Altcoins
  • Bitcoin
  • Blockchain
  • Cryptocurrency
  • DeFi
  • Dogecoin
  • Ethereum
  • Market & Analysis
  • NFTs & Metaverse
  • Regulations
  • XRP

Follow us

Recommended

  • AirDrop is coming to older Samsung phones – is yours supported? How to get it early
  • Samsung S95H vs. Samsung S95F: I compared the OLED TVs and wasn’t prepared for the upset
  • How to loan a Kindle book
  • Why I stopped using ‘Modern Standby’ on my Windows laptop to save battery overnight
  • Sonos Play vs Sonos Move 2: Why I’d go with the $200 cheaper Bluetooth speaker
  • About us
  • Privacy Policy
  • Terms & Conditions

© 2023 TheBlockchainPage | All Rights Reserved

No Result
View All Result
  • Home
  • Cryptocurrency
  • Blockchain
  • Bitcoin
  • Market & Analysis
  • Altcoins
  • DeFi
  • Ethereum
  • Dogecoin
  • XRP
  • Regulations
  • NFTs

© 2023 TheBlockchainPage | All Rights Reserved