Björn Assmann, Severin Siffert - Multi-chain Governance: On-Chain Voting with Ethereum
EthereumZuri.ch 2024 · April 2024 · 59:04
Björn Assmann and Severin Siffert present a fully on-chain voting system for ERC-20 governance tokens that pairs Ethereum with the Internet Computer blockchain. High gas fees keep many token holders from voting on Ethereum, while off-chain tools such as Snapshot leave results without direct onchain enforceability. The workshop shows how the multi-chain setup addresses both problems and how it can be adapted for governance decisions across other networks.
Speakers
Topics
From EthereumZuri.ch 2024, hosted by EthereumZuri.ch.
Transcript
yeah thank you very much and welcome can you hear me well perfect good all right yeah so um I'm very excited about this little workshop today uh what we want to show is how we can um work on ethereum and the internet computer jointly re realizing um multi-chain governance in particular onchain voting connecting these two blockchains the idea of this uh Workshop is going to be handson so we start with some sort of overview we show also you a demo that might take maybe 20 minutes or so and then in the second half um you know we invite you to um to connect to a GitHub repository and then you know you can uh download it and deploy it uh and
and play around with it uh and maybe even then sort of deploy on ICP main net um yeah so I think we um haven't done that kind of Workshop in that form U yet for this for this um onchain voting so we see how far we'll get but I'm sure it's going to be fun maybe as a quick uh sort of background so we are um as already mentioned both on the definity foundation which is contributing to the ICP blockchain uh so we are Swiss non for-profit um founded in 2016 our HQ is here in z um but we also have um a lot of people uh dispersed around the globe roughly 250 people in the moment and yeah and today it's sine uh and and me uh who um yeah want to present you like
this multi chain voting application good um yeah maybe just to to motivate then like let's start with a of overview um part so if you look at um a typical blockchain setup uh you have quite often um these main blocks as depicted on this slide where you have a certain amount of information typically the token small clips of data which is on chain then you have quite bit of um logic front end a lot of data typically stally hosted I mean for example on Amazon web services and then you have the users which are um accessing uh this
Services again with their own devices in a decentralized fashion so like you have in the middle like this I mean decentralized blob which um in a way compromis a bit the sort of the story of decentralization right because like you if um if that is shut down um or maybe temper with then uh um yeah you you you can't sort of use like the decentralized application anymore that's a bit sort of the starting point um for ICP but also for the the PC that we want to show you today and hence like the vision is that you um now um connect um uh different um blockchains you know take ethereum
Bitcoin or any other project uh you might be working on uh and hook it up also with IP which um is a decentralized you can think of like is a blockchain but also a decentralized uh cloud provider so you can really run pretty much anything on it games you can run websites enterprise software um you name it and then um you can connect it to other blockchains so I think a big focus is on like this multi-chain um as aspect and all of this then forms uh a v computer and um now let's make it concrete that's the idea of this Workshop so um yeah um we want to connect it to a particular
case study namely onchain voting um so I mean there are many doubts on on ethereum you know that's of course decentralized governance is a core aspect of of blockchains and um but of course like if you uh do transactions directly on ethereum that's um typically quite expensive uh and that's why for example voting often happens offchain so like there's for example like um um snapshot which um um offers actually very nice voting functionality but in order to avoid fees it's done offchain and then you have to bring back somehow the outcome of the result back to the to the to the blockchain to the ethereum blockchain and now uh what we plan to do with you today is like to show how can
you do that actually fully on chain so and and actually without a lot of effort how can you um yeah when you can make an es2 based or other other token that you want to uh set up where you really have um whole voting with the whole logic and all data on chain okay so like that's the motivation so then maybe a quick um uh crash course on the ICP protocol I'm going to be very brief so that we have time really for for the handsome part so um the way uh this um protocol works is I mean it's run on um on on on nodes dispersed around the
globe which are run by um independent node providers so it's not allowed to be run in the cloud so it's really a physical High spec server standardized and um in order to achieve scalability not everything is run on all nodes but sort of you have some charting going on which in uh in the terms of IB protocol is called subnet so you make you you have sub subgroups you partition um the the the network and uh these um uh different subgroups are able to communicate in an efficient way and then on top of these um different um groups then you can run smart contracts called canisters uh in our terminology where um yeah you can as
I mentioned before you can run um pretty much anything really thinking about think about like a decentralized uh cloud service yeah and that's then you know brings like you like a big virtu virtual computer um now and um and and it's it's relatively cheap and efficient to run stuff so I meant just to motivate a little bit so if you want to store one gigabyte of data on chain for one year on the internet computer that costly cost you $5 uh on Solana roughly $110,000 and on ethereum much more of course depending also on gas feeds which might vary um and that's I mean yeah and
that's why you know you can for example host a complete front end on the interet computer because it's much more affordable yeah now let maybe some some key features so um you will see it later you um with the with the application that you are going to deploy um you can interact them with a normal web browser we don't need any particular setup we can a normal um browser would work uh you can access from your phone or from from a laptop uh and um and uh these canister smart contracts then can run web pages Enterprise systems defi applications Games Etc one particular aspect actually is the um what we call like the reverse gas model uh and here
the idea is that if you as a user start using an app you don't have you don't need any tokens up front uh rather so of the canister is pre-charged with with with Cycles which is like the equivalent of gas and um then only when you start using maybe more premium features and so on at some point we might have to pay something but sort of the entry barrier is very low because you have like this reverse gas model that allows you to use stuff straight away yeah um and um maybe to bit I C explain how that works under the hood so um when you talk to um the ICP blockchain uh uh so-called cheny craphy is used uh and um that means like if you
get um message from um the um uh from the uh from the from the IP blockchain it's signed with a single public key of that blockchain and the way the way that works under the hood is actually that um not like the different nodes that underpin the network um they all have a shared part of that key and only collectively you know if they a certain portion of the nodes agree they can sign together uh um uh and uh and confirm a message with the overall public key yeah and now um also bring it a bit closer to ethereum like the the same
thing work also with um elliptic curve keys ecdsa keys so um a canister um that is run smart contact is run on the intern computer can sign um Issa Keys uh and again it's the same principle no no single node will have the full uh key and can for example run away with with know with with with the linked assets or so but rather only collectively can these nodes um using threshold crypto uh sign messages and that's quite cool because um ecsa keys are useful for uh signing Financial transactions right so you that
means like these um canisters can actually own can own crypto cens so you like canisters can own Bitcoin they can own ethereum etc etc and uh they can sign transactions uh and uh and and can they can also use htps out calls to communicate with with other applications and that makes this setup quite powerful uh because you can embed then logic uh in these smart contracts triggering um um actions elsewhere and hence like you can facilitate like a um a very powerful multi-chain setup yes so um let me then um I think that was like the the very beef crash course
and if you have this was of course very brief if you have more questions and so on now very happy to have a chat also later on but let's more Focus now on the on the PC right and and the hands on stuff um for the um multichain uh PC that I mentioned um what um how how the way that looks actually is we have um implemented very simple set of canisters which you see on the left hand side a front end a back end canister and also uh like um what you see here like this RPC canister which is responsible for talking to the ethereum blockchain and we use like another canister uh for the
metamask login um but these are all very most very contained so like the code that we add is quite contained and then as you can see like if you if you like the voting you know the logic and so on happens then 100% on chain and then the RPC canister and you will see that also now in a minute then from time to time actually queries the um ethereum um blockchain for certain data uh um and the way it does actually it talks to a couple of providers listed here like Alchemy anchor and so on and um and I decentralized fashion ask several of those and then sort of combines the received results from them uh to uh yeah come back with a result to to your
application um yeah and you can talk to your main net or zolia that both both Works um yeah so um here is um uh a link to the application I think um uh so you um it's um you you need a metamask login so you probably need like to uh run it on your laptop but I can also show it to you if you only have a uh if if you only have a SmartPhone I I include it like the QR code here that you um can scan it and then also can send it to yourself if you want to run it directly on your laptop but I can also show it you directly so let me switch um actually yeah before maybe before I start with the demo are there any
questions any comments in the moment anything urgent somebody would like to understand okay no it's good then uh let's um let me show you that it works and and this is now the application that that you're also going to uh put your hands on uh in the second half of the of the of the the workshop so you see that's like the the the um the web page starts so it's a multi multi-chain governance thing you can now um sort of sign in here and um it will now connect to my um uh to my U metam mask um and so I will do that and I will sign in now and now um I'm wait a little bit ah okay demo
effect yeah yeah you I see I see okay yes so we have so you must be are you Christopher huh yeah hi Christopher nice to meet you yeah he's actually um uh he is like I mean I had like the slide where we talked about like this uh the one canister which called CV which is like for the login that was written by by Christopher many thanks for that very useful so uh we Ed it directly for for this prototype was super useful for us okay so uh and thank you for your comments like let me try again with Christopher helps we should now be able to to log in there there we go all right so you
see now um so for the time being what happened is just like um I logged in using um um my serum address and it's now linked also to um um uh a principle or like an identity that lives on the inter comput so like now I have sort of built up a session uh that's thanks to Christopher's work where I have like this connection between an identity on the internet computer and an identity address on ethereum so that's very nice and now we are in our um uh little um uh uh voting um application and now I can show you uh what we can do here right so um I can submit a proposal for example and
say uh yeah I mean um uh motion on motion number six for example and then you know uh let's uh give a beer to uh Christopher because he was nice to help me so uh and I you could think about that you could also have different kind of you know proposals here you know you could maybe have token transfers or whatever else your particular Dow on ethereum would like to decide on I mean I think that's uh this just an example here which is easy so it's just a motion proposal for the time being now um I I
click on submit proposal uh and now um what happens you know you like the spinner here in this moment the application is now which sits is hosted on the blockchain ICP chain talks to ethereum zolia and says okay by the way I want to sub I'm you know we have a proposal here at that Tim stamp please tell me what's your current block height and you see now here we have now the motion number six uh it's now recorded under the sort of set of proposals you can vote on you can see that it was me here like this like the this is my internet identity this is my um etherum address like the same stuff you can see here at the top so I was the submitter but you can also uh equally like if you
log in there you could also um um uh see see like the same kind of proposal and now I can vote and the key thing is now the block height that was determined at this particular time stamp here is now the time for which the um the token amount is is counted right so like for what we decided here for the little um demo is that we use seola if so the moreo i e have the more voting power I will have uh and so I can you know since I'm big fan of Christopher I say yeah perfect now let's let's give him some beer so I vote Yes again now in this moment um the application is talking to ethereum is apolia and is essentially asking for this particular ethereum
address how many um um zolar e do you have at this block height and you see now um it determined that um I have a certain amount and now that amount is um allocated to the yes camp and other people people now in the room are invited to to vote as well right and uh you can uh and that that will then you know change it over time uh and uh and then you know in the end we can sort of agree or disagree with that particular motion right yes please um good question so there is no snapshot like that would be um that would be an potential enhancement I mean like what we do in the moment is like we always query theia on the fly but for a
but we we we give the query the block height so that you it's really clear that you can't vote twice for by transferring tokens or so personal enhancement would be at the proposed submission we make a snapshot who has how much zolia then we also know the total Supply Etc store it on ICP and then when somebody votes you just look in the cache instead of caring theoa again just to keep the code simple and also we don't we since we only spent a few days on it uh we we in the moment we carry it on the Fly yes so I think that's um that's actually um what it is um I think it's it's a very simple demo I think but it really shows you like how to like how to build
a bridge between ethereum and the internet computer and then you can sort of do um you connect these two worlds and do for example realize um a dow voting application or maybe something else uh and um yeah and so um yeah I think it's it's it's relatively powerful because um you um now can um do a lot of logic that might have happened before offchain you can do it fully onchain all right so I think that's um all I wanted to say up to now did I forget anything ah one more question yes please M yeah the proposal you mean yes yeah yeah
I mean it's it's indeed it's not um um so I think there are actually two two more things we could do with this PC right um first we could have other kind of proposals which are um even more concrete for example you say uh you know send the Dow decides whether we want to send you 10 po East for example and then you would as part of The Proposal specify the address and then when the proposal is executed then you know the transaction is automatically triggered that would be like uh uh um like um one way to do it and in addition I mean what we didn't Implement yet but also I think a national extension is that you could for example have a timer here that says you know give a proposal has a duration of say four days people have time to
vote on on whether Christopher should get it b or not and then after 4 days the tell is closed and then um the um result is actually written back to um to ethereum I think what's what um what's already what done I mean I think sine just did it I think yesterday or so you can uh you can there's already a backend call where you can say execute proposal uh so that writes back the result of this um to to the to a theum Smart contract that is configured um in the back end um but we didn't I mean I didn't actually to be honest I didn't have time yet to kind of include that also in the front end I'll
MH MH right when the the the the um the back end could have a periodic task that checks for example okay are there any proposals that are past the four days and then if it's true like you close a proposal and then this backend canister already executes um an instruction to ethereum and says please mean write back or execute the token transfer or whatever please write back the result of the tally to your etherum smart
contract so you don't need an admin that's that's a cool thing about it yeah uh did that miss your question or was yeah so um the the canist the canister itself so the smart contract on ICP has an address on ethereum and I sent some e to that address so now it can use those e to execute those transactions is that what you meant right any other questions no cool okay then um I think um let me share this again so um there's
one more link now like for the um let let's now get our hands dirty here's the um giab link I mean either you can type it or again scan the QR code and then um uh send maybe to yourself so that you can exit this so the idea is really to um you go there uh then you you will find a read me which has install instructions and we can know we will have go around and see and and help you and like the idea is like you know you can you can have a look uh and go through instructions step by step uh you know check it out um get it um deployed locally uh and and if you have time even maybe deploy it on the IP mainnet and for those that don't have a
computer here uh I will show you on the big screen of course otherwise it gets a bit boring for you cool all right um do you want to have this thing here okay is the microphone working properly no reaction seems to be it wonderful okay so here for your question
uh can we write the result to ethereum here I have a very simple storage contract uh it just stores the last 10 strings that were submitted um nothing too fancy this is the proposal that uh B just showed um I voted on it as well I voted against it and then I told the backend to execute that and here is the result on ethereum or sepolia in this case
so let's go to the Practical part um this is the repo please clone it and then go to the runbook and start working on it uh first step is to get some seoa e if you uh want any uh it's the most convenient faet I found uh it makes you solve some proof of work or your computer uh just start mining a bit and in a minute or three you should have enough to do everything we do in the workshop uh if you don't want to deploy your own um storage contract you can also use the one that I deployed and just showed
you that works just fine then you don't need to get any SE e yourself so um first step install DFX uh DFX is the command line tool that we use in the ICP world uh it helps you manage your smart contracts uh your your gas uh you can use it to create uh to call your contracts um it's just the tool you use for everything um
I don't quite know how far you guys are I'm just going to talk a bit more so uh the installer in case you're wondering because curling into shell is always a fun experience it's based on the rust up installer and uh if you want to analyze it you will find a lot of similarities did I not add that last [Music] instruction let's fix that um after
installation you may have to [Music] run the fxvm update uh thefx VM the version manager is the thing that actually gets installed and DFX VM updat then installs the latest version of DFX uh sounds bit complicated but uh turns out it's the easiest way to actually get it running uh for for us um I'm on the SDK team so I actually work a lot on the effect so if you have any complaints uh yeah I'm your guy maybe we can just a quick like the I mean the first step in the instructions
is like to get some suppo e if you don't have it is anybody uh you know stuck there or is it fine and the next step then would be installing DFX right so is there any any question there anybody who's stuck me we can also walk around and you know give have a look right if if you're stuck in a particular step everybody happy okay um I'll continue then um this DFX start is how you start your
local instance of ICP um this will spin up one single uh replica on your machine um so you you don't have multiple subnets but uh single subnet is plenty for this case um it doesn't run on or sometimes it's broken on WSL uh on Windows it doesn't run at all so if you are on Windows then you need to deploy straight to main net uh if you need any codes for gas I have some here um if anyone needs just yell at me or come here and get a
code there's instructions for main net down here yeah just to be clear like the like the G like if you you only need this um gas Cycles if you want to deploy on Main net so maybe I think the first step if you just want to run locally um then um you know we would already that that would be already a great achievement can I can we can we make a poll like who's like uh who um has DFX installed perfect and the others do are you do you want to do it or you're still in the process of doing it is there somebody who needs help maybe so
um I'm going to now uh do the same thing here um just stopping the current replica in case I still have one running um uh there we go that's one of the complaints you probably could have uh so okay I I now have a local replica
running and now I can deploy um the whole project here um um we wrote a make file for all that because uh the commands are really annoying to use uh the first time around um this is for example how you install the login provider um just as a mini overview you say deploy this is the name of the the canister you want toy deploy um I'm telling it where in this case automatically on the local
network and then we need to give it some arguments uh for installation uh those init arguments are so that we don't have to compile everything again if we need if we want to change a few small things um it takes a while um but as you can see first it creates the canisters and then um it installs the RPC canister that's the one that actually makes the requests to the ethereum uh RPC providers and
uh yeah here it builds the front end uploads it um and once that is finally uploaded um we can look at it um frontend uploads take quite a while usually especially on mainnet um because there's just many different uh transactions to execute on chain um but uh we can't do much more to speed it up okay here we go now we have the front end running
locally what do here we are on Local Host and I'm going to connect here and then sign in and here you have the interface anyone progressing here as well or are you stuck with other parts so now if we want uh even the local
backend to be able to create uh transactions on ethereum we need to give it some ether um it is not the same account as the main net deployment because it doesn't have have the same private Keys um so we need to ask it for its ethereum address um I'm going to know to give you all a bit more time I'm going to show you how this works um here we call our contract on ICP we call the back end and a function called
get e address this ends up here and uh I tried to put roughly what you would uh write yourself in the lip. RS file and everything else is relatively standard stuff that you can mostly copy paste so you probably wouldn't have to write this yourself you may want to clean up the code a bit because I wrote it for Simplicity and not necessar for correctness but uh yeah um I do some caching because making that call all the time takes
forever and I'm not that patient but uh you can ask ICP for your canisters public key and then you need to do some encoding wrangling because uh if yeah different chains use different formats of course nothing nothing can work the same everywhere and then we just turn it into an East address and this is the address that we got back I'll send that a few um SE East now just to demo it
point1 should be easily plenty and then I'm going to go here and make a just a dummy proposal and then I'm going to vote on this one this hits uh um where is it this hits the vote on proposal function in the back end um we send along the proposal ID which is the one you see
here and and which eror we voted and to figure out who sent that vote we see who made the call every call to the to ICP is signed by either either the anonymous identity which everyone can use or some other identity in this case my back end sees this identity here this is what you get with the caller um we then add
ask um the signin provider which ethereum address is linked to that so here we get for the voter the East address that we actually logged in with uh how that exactly works that mapping Christopher would be the man to ask uh how the mapping works if someone has questions about that they should talk to you um best I can do is point to you you and then we ask what is the E balance this is a function that you probably only have to clean up and not
write yourself but here's roughly how it works um you can make a request to the RPC canister for that you send it some gas um that's the Cycles in ICP and here we have a Jason RPC request um we don't need to sign it since it's only reading the state and not actually submitting a transaction uh this is copied pretty much straight from the documentation and here's uh how we do the snapshotting we just have a string saved uh that contains the block height when
the proposal was created and then the RPC provider uh makes sure it uses or it checks at the correct block height since we don't quite trust a single one um we can uh here add multiple um RPC providers if you want so we can check do they all agree and if they give different answers we can either log an error or we can say we just take the majority of them whatever you guys need for your application we then decode everything
need to do some data wrangling because nothing is easy but then we get back um uh natural number uh I convert it to a net because that's just the uh the type we use in I CP land uh yeah uh it's the equivalent of U 256 in ethereum Land once we have the voting power we just save the vote um that's nothing too fancy I'm not going to walk you through all that it's
just uh rust and then um I bet yep that has been sent uh just to make sure I'm going to check uh if it actually worked um just ask the backand to request its own balance and that looks good so now we
can execute that proposal uh I didn't put any authentication in front of that just to make it easier uh yeah I wouldn't recommend you do that on a real voting application but that's all fine uh not sure if that is enough yeah looks fine I don't need to format the one a bit nicer um in ICP world we use an encoding language called Candid um for anything more advanced than just this basic call we would have to format it a bit nicer but it's smart enough to interpret that
correctly so we get back um a success and an ethereum transaction hash and this is the transaction that is submitted and if we go back here to check we can see now this is the road that we executed um I just made it as short as possible uh to save some gas um but this is the canister ID bky Z2
um that's the address of the back end so you can see that it comes from that proposal one and 100% yes votes matches this here cargo toml of course um no that's that's probably the one you're more interested in Yeah question is uh how uh can we run any rust code we want uh not quite uh we
run on a wasm 32 uh environment there's work going on to make it wasm 64 so we get some more address space but um it is a very plain environment uh we have some special calls uh for which we have the IC cdk for example to make calls to other canisters but uh yeah we don't have random numbers provided to you because uh that's hard in the blockchain world uh yeah but if you can run on pure wasm 32 you can do anything um RPC calls
um yeah um so if the RPC provider supports Solana then yes which I think it does but right now we don't have schnor signatures implemented uh work is ongoing right now and uh I think it's expected Q2 or Q3 and then you can actually sign Solana transactions uh securely right now you have would have to uh have the keys in your canister state which data is not public but technically uh the node providers can still read your State uh there's work going on to stop that but yeah
yes we can sign with ecdsa okay that's check yeah yeah if you want to deploy your own um Solana yeah there we go you talking about salana you can also deploy your own contract to seia um for that we have uh the file here uh solidity contract. uh just throw it in remix
then uh compile with the green button of course and then deploy using the injected provider so you target seia then you get down here the deployed contract and you can copy the contract address go to lip RS and replace the Target contract with that and redeploy then your canister knows which uh which contract to call okay
how's that going um anyone have any problems they run into some things that are not quite clear I know it's a lot of information at once uh but the main things I wanted to show you uh we've gone through now we have either time for questions we can do some main net deployments if someone is interested in that uh as I said I have some guess here or we can turn it into a generic Q&A about ICP whatever you guys want to
right I I totally skipped over that how do we execute the proposals so right now I allow anyone to call execute proposal but that is very easy to get behind either whoever created the proposal or just after a certain amount of time on ICP you can have timers so you can autonomously wake up in 5 minutes or two days and then run a transaction so you don't have to have anyone call your function for that so uh yeah once this function gets triggered we just read the proposal and
then um I generate the summary string here uh you can do whatever you want of course make it more than just storing a string but then to create an e transaction um this is actually all you need to do but in the background um we parse the API so uh over here we import the Jason schema of uh the Target contract uh we compare that it actually matches the right arguments and
then we sign a transaction what this does is it generates um an ethereum transaction according to the RPC spec and then uh here goes deep into the call stack it asks ICP to to sign the transaction hash with the canister private key then all the nodes in the subnet uh do their thing and out comes a valid signature and only if your canister allows someone
to access that then they can actually execute those transactions so uh anywhere in here you can just say if the caller does not match this or whatever um what you can even do is here you can provide a deration path meaning you can have arbitrarily many different private keys in your uh canister so you can have a different ethereum address per user of course then it's on your canister to do access control to these sign
calls but you can actually separate funds by the users or a group of users if you prefer that uh yeah your imagination or your coding skills are the limitation for that yes that's yeah that's so second nature to me but for people coming from ethereum or many other uh chains that's very uh unintuitive on ICP smart contracts are upgradable by default so uh if I say for
example I don't know let's change this string then you can observe it actually in practice um this will now rebuild and uh just change the running code um I actually didn't uh tell it to persist whatever proposals you had but you can store data through upgrades you have up to 400 gab of that storage available
um yeah you can always upgrade uh your code unless you say uh this smart contct contct is now it has no uh controllers anymore or yeah that's what we call admins in ICP land if you delete all controllers uh then the contract is not upgradeable anymore so that allows uh verification that you are yeah then you can show how you build the code you can always check the hash of the installed code even though the code itself is not public but then you can trust that it actually
does what it's supposed to now executing that transaction um so while that's running let's see if I missed anything here yeah you have the signed transaction and then you call the RPC canister in this case we tell it to use three separate uh RPC service providers and since I'm lazy I just told it if only if they all agree we output the result otherwise I just say screw that something went
wrong again Simplicity over uh correctness so we get back again transaction ID I'm not going to look it up but here now we have proposal signed by the ah maybe that's why I should show you this this is the new transaction that we created um as you can see the from 8 D7 C and here the previous transaction that we created same origin so the private Keys stay the same even
through different versions of the same smart contract any other questions problems complaints about DFX okay um I think then we can start wrapping up uh let's see
yeah here we have few more closing slides um what now um you can use a bunch of languages on ICP to do whatever you want so far I've shown you rust but we also have MCO a special purpose language for ICP which makes it pretty simple to work with all things specific to ICP um maybe to show you why that's may be useful this is how we manage state in our rust
canisters we use thread local which basically means a global variable it's not very nice but canisters are single threaded so it just works uh you have to do this to create uh data structures that persist through updates and then use it like this it works but especially if you don't know rust already it's not that nice for that motco is a much better fit then then we also have great people working on JavaScript typescript or python uh um libraries to develop your
canisters um the JavaScript one actually runs a full JavaScript engine in the canister and you upload your code uh I think after installation I'm not even sure probably not here's where you can get started um first link is uh our main documentation second link is where we have a nice uh um Zero to Hero series um where you start with very simple topics about ICP and then slowly build up and get into more and more complicated Parts uh I'm
not sure if they already go into evm uh calls but if it's not there it will be added pretty soon and then last we have the Forum that's the place I suggest you go if you need any help um you will find me there basically every day um then this is how we see it uh smart contracts will grow more and more useful uh whenever people notice that things go down or get taken down uh and if you can run arbitrary
code on the blockchain you will have much fewer problems and that's what we have thanks for paying attention uh if you have any more questions come talk to us we also have small Booth outside I hope to see you then [Applause]