From e12cbd0fa9a4c67018f22b6e77bcc8c8880fb6d6 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 27 Jul 2023 00:17:28 +0700 Subject: [PATCH 1/3] agenda_3 transcript --- agenda/agenda_3.md | Bin 515 -> 47935 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/agenda/agenda_3.md b/agenda/agenda_3.md index 4373226390fb2999a293124d096b2295ac99d82f..78a47c70af8dbea2fd32f2e6a0a906569a287560 100644 GIT binary patch literal 47935 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

9%KBNK~f^S=P)3 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 literal 515 zcmb7=O-sW-5Qgvh6)$)(!I&>?X>O&Z&_h9N^kDI@*-V;+&2HEarT^Zw)oY=*VLqOD zW|Cw_ Date: Thu, 27 Jul 2023 11:15:12 +0700 Subject: [PATCH 2/3] agenda_3 transcript --- agenda/agenda_3.md | Bin 47935 -> 103245 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/agenda/agenda_3.md b/agenda/agenda_3.md index 78a47c70af8dbea2fd32f2e6a0a906569a287560..6ad57081fb99d2ec1bc1582a91247940256669b1 100644 GIT binary patch literal 103245 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 U$+M?QW^j!cScdXA^rORn1HaNx3IG5A literal 47935 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

9%KBNK~f^S=P)3 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 From e20569580d0e4ae4bc93ca98028111bb7c1c0c7f Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 27 Jul 2023 11:52:28 +0700 Subject: [PATCH 3/3] added agenda 3, 4, 5, 6, 7 transcript --- agenda/agenda_3.md | 1339 +------------------------------------------- agenda/agenda_4.md | 263 ++++++++- agenda/agenda_5.md | 331 ++++++++++- agenda/agenda_6.md | 341 ++++++++++- agenda/agenda_7.md | 380 ++++++++++++- 5 files changed, 1307 insertions(+), 1347 deletions(-) diff --git a/agenda/agenda_3.md b/agenda/agenda_3.md index 6ad5708..01f464f 100644 --- a/agenda/agenda_3.md +++ b/agenda/agenda_3.md @@ -1,59 +1,47 @@ -# [[Solana Core Community Call - Feb 17th, 2023]{.underline}](https://www.youtube.com/watch?v=XkkxQAF-HhE&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=1) +Solana Core Community Call - Feb 17th, 2023 -- Time: Feb 17th, 2023 +Time: Feb 17th, 2023 -- Link Video: - > [[https://www.youtube.com/watch?v=XkkxQAF-HhE&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=1]{.underline}](https://www.youtube.com/watch?v=XkkxQAF-HhE&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=1) +Link Video: +https://www.youtube.com/watch?v=XkkxQAF-HhE&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=1 -```{=html} - -``` -- **Speakers profiles** +Speakers profiles -**Galactus from the Mango -team:[[https://github.com/godmodegalactus]{.underline}](https://github.com/godmodegalactus)** +Galactus from the Mango team:https://github.com/godmodegalactus Topic: Talking about application account right fees and the introduction of a new kind of fee when interacting with DAPs. -**Philip from Fire Dancer: -[[https://twitter.com/jump_firedancer]{.underline}](https://twitter.com/jump_firedancer)** +Philip from Fire Dancer: https://twitter.com/jump_firedancer Asked a question regarding who can call the rebate for application fees and discussed the ownership of PDAs (Program-Derived Accounts). -**Jerry from Ellipsis: -[[https://www.linkedin.com/in/jerry-francis-8033a8225?originalSubdomain=tz]{.underline}](https://www.linkedin.com/in/jerry-francis-8033a8225?originalSubdomain=tz)** +Jerry from Ellipsis: +https://www.linkedin.com/in/jerry-francis-8033a8225?originalSubdomain=tz Contributed to the discussion about who can call the rebate for application fees and clarified the process for invoking signed instructions for PDAs. -**Zentatsu:** +Zentatsu: Presented on Simd 33, which is about \"timely vote credits\" to address the issue of some validators achieving higher vote credits by delaying votes and surveying forks before voting. -**Richard from Finance JP -Team:[[https://www.linkedin.com/in/rman/]{.underline}](https://www.linkedin.com/in/rman/)** +Richard from Finance JP Team:https://www.linkedin.com/in/rman/ -**Ashwin from Solana -Labs:[[https://github.com/AshwinSekar]{.underline}](https://github.com/AshwinSekar)** +Ashwin from Solana Labs:https://github.com/AshwinSekar -- **Key concepts mentioned:** +Key concepts mentioned: -```{=html} - -``` -- SIMD 16 Application Write Fees - - > [[https://github.com/solana-foundation/]{.underline}](https://github.com/solana-foundation/).. +SIMD 16 Application Write Fees - https://github.com/solana-foundation/.. -- SIMD 33 Timely Vote Credits - - > [[https://github.com/solana-foundation/...]{.underline}](https://github.com/solana-foundation/%E2%80%A6) +SIMD 33 Timely Vote Credits - https://github.com/solana-foundation/... -- Solana runtime - - > [[https://docs.solana.com/developing/programming-model/runtime]{.underline}](https://docs.solana.com/developing/programming-model/runtime) +Solana runtime - +https://docs.solana.com/developing/programming-model/runtime Welcome all to the Core Communitycall this month. Today we\'ll have Galactus from the Mango team talking about 70, 16 which is application @@ -429,1296 +417,3 @@ vote credits and then 16 is what GM Galactus went over with the application right fees we can continue discussion there also if you want to do something more ad hoc there\'s the core technology channel in Salon attack Discord but thank you everyone for coming today. - -# AGENDA 6 [[Core Community Call - May 19, 2023 - Optimistic Cluster Restart Automation]{.underline}](https://www.youtube.com/watch?v=GA5AVg_svj8&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=5) {#agenda-6-core-community-call---may-19-2023---optimistic-cluster-restart-automation .unnumbered} - -- Time: May 19, 2023 - -- Link Video: - > [[https://www.youtube.com/watch?v=GA5AVg_svj8&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=5]{.underline}](https://www.youtube.com/watch?v=GA5AVg_svj8&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=5) - -```{=html} - -``` -- **Speakers profiles** - -> **Will:** Mentioned at the beginning of the text, Will is going to -> talk about the upcoming release changes. -> -> **Wen:** Wen is part of Solana Labs since last September and is -> working on consensus. - -- **Key concepts mentioned:** - -```{=html} - -``` -- **Optimistic Cluster Restart Automation -** - > [[https://github.com/solana-foundation/]{.underline}](https://github.com/solana-foundation/).. - > . - -Welcome, everyone, to this month\'s core Community call. There are a -couple of things on the agenda. So, the first thing that we\'re going to -hear from Will, before you, Will, will be about the upcoming release -changes that they have or that they\'re pushing. And then, we\'ll hear -from Wen on 7046. - -Before I get started, I wanted to first call out that if you ever want -to see the agenda for the meeting, you can always go to the core -Community call repo, which I just linked in the chat. And then, there -are two PRs that would be or are getting close to consensus on. So, -it\'d be great if people could find time to give their review on them. -The first one is PR #33, which is the timely vote credits. And then, the -previous one, which we actually already merged in, but would love to -have any extra eyes on it, would be PR #15, which is partition Epoch -Rewards. - -Go ahead, well, you can go and see your spiel real quick. Thanks. So, as -you probably all know, the upgrade of mainnet to 11417 is underway. We -asked for 25 at the beginning of this week, and we\'re currently at 27. -Thank you; we appreciate the overachievement there. Everything\'s -looking good. Our plan is to ask for general adoption at the start of -next week. So you can anticipate that request in case anyone hasn\'t -seen it yet. I would encourage you to read the outage report from the -February outage. At the time, it was widely believed that the outage was -caused by the 114 upgrade. That was definitely not the case. I\'ll drop -a link to that report in just a moment in the chat here. It\'s also -linked in the MB announcements channel on Discord. - -We also have some audit reports that we\'ll be publishing later today -related to 114. Feel free to peruse those. There\'s nothing scary in -them. If there were, we wouldn\'t be shipping the release. But you know, -I might give you some peace of mind and some interesting reading. So, -thanks to everyone who\'s already upgraded, and looking forward to -getting the rest of the questions on 114 soon. - -All right, Wen, you\'re up. Oh, okay, let\'s share my slides first, and -I can present my slide show and share screens. Sorry, what I should -explain\... Oh my, so hello, and to those who I haven\'t met yet, I\'m -Wen, joined Solana Labs last September. And personally, I\'m working on -consensus, and I\'m interested in high-performance and high-reliability -system design. - -So, how come I don\'t see my slides to share? Oops, no, sorry. Why -don\'t I have my slides to share? I have it previously, and let me do it -again. Sorry for wasting time. I don\'t see my slides to share. I can -share my whole screen. Maybe that\'ll work. Okay, do you see the slide -now? Yep. - -Motivation Requirements. Okay, sounds good. So, motivation and -requirements. We are interested in making Solana more reliable, of -course. So, for high reliability, there are many things you can do. -First of all, you can write very high-quality code. Then you have fewer -outages. But no code is ever perfect, so you need testing to improve it. -But testing couldn\'t catch all problems, so you need monitoring to tell -you what problems you have and when. - -Monitoring tells you there is a big outage; you kind of need outage -handling to get the cluster back to the same state. So, there are a lot -of efforts inside Solana to improve code quality, testing, monitoring, -and other stuff, and auditing and formal verification. And today, the -proposal is only about outage handling. - -So, first of all, let\'s look at how we handle outages now. When I\'m -talking about outages, I\'m talking about the last outage where the -whole cluster just couldn\'t make progress anymore, not making progress. -And somehow, what we needed to do is, we need to restart validators, -keep them saying a start state to start with so the cluster can continue -functioning again. So, this is called cluster restart, which I have a -link here. It\'s very different from sporadic single validator restart, -which happens all the time and that doesn\'t impact reliability at all -normally because you still have a lot of validators functioning. - -So, what we do now, first of all, we would try to find the highest -optimistically confirmed block. Optimistically confirmed means you have -a block which got the votes from the majority of the validators. We use -two-thirds here. So when the block is optimistically confirmed, ideally, -we shouldn\'t roll it back because it may contain user transactions. If -you roll it back, it will have economic impacts, very big economic -impacts. - -So the whole design goal in this proposal is to try not to roll back -optimistically confirmed blocks if possible. So, in reality, today, we -also try to do the same. But since today we don\'t really have an -autonomous process to do this, today we use what\'s called social -consensus. So when there is an outage and people gather in the Discord -Channel, they would first confirm, \"Yes, there is an outage. All the -validators are not making progress.\" Then, they\'ll try to decide to go -for a restart because the cluster doesn\'t seem to be recovering. Then, -they\'ll try to see where to restart. - -So, we need to have one block which everyone restarts from. And to make -sure we\'re not rolling back user transactions, we need to find this -highest optimistically confirmed block where we agree we will start. And -what we do now is we would normally do a consensus or like voting in the -Discord channel, say, \"My local confirmed block is X, and what do you -see?\" So if most people vote for X, then go with X. So that\'s how we -do it now. - -And after that, after we decide which block to start from, the validator -monitors with operators would stop the validator, and sometimes if -there\'s a bug that could lead to an outage again, then we might install -a new binary. But that doesn\'t happen very often. And next, because we -decided we need to start from this block, so everyone needs to have the -same block. So you would create a snapshot with a hard fork at this -block we decided on. And if you don\'t have that block locally, you -would download it from a trusted source. - -And after that, you would restart validators with the following -arguments. Two arguments: one is \"wait for a supermajority to add slot -X,\" and the next is \"I think the bank hash at this slot is blah.\" So -this makes sure you restart with the correct snapshot, you have the -correct block and correct hash. And then, you would wait for 80 percent -of the people to reach the same state as you. Then the whole cluster -begins to function. You start to make new blocks again, and you start to -vote, and all things go to normal. - -So, there are a lot of problems with this current restart process. Maybe -the biggest problem is that it takes a long time. The whole cluster -restart takes about\... it could take about several hours, which would -make your reliability not very good. And so, in the future, we might -have other efforts to make it faster. - -Today, we\'re focused on solving a small problem, which is improving the -process of finding the highest confirmed block. It\'s quite challenging -for Han to manually review the votes of two thousand to three thousand -validators to determine the block. Thus, we aim to develop a protocol -that enables machines to automatically find the highest confirmed block -without Han\'s intervention. Here are the design goals: - -Avoid cross-part negatives: If a block was confirmed before the restart, -we should not discard it. Doing so would have severe consequences. - -Allow false positives: It\'s acceptable if some blocks are not confirmed -before the restart but are mistakenly considered confirmed. - -Let\'s consider a scenario with a 67% threshold. If a slot receives 66% -of the votes and no competing blocks exist, it\'s fine for 80% of the -validators in the restart to decide to start from there, even if it\'s -not yet confirmed. Confirming more is acceptable, but rolling back -confirmed blocks is not allowed. We\'ll prioritize avoiding false -negatives in all design choices, and false positives might be tolerated. - -The proposed approach involves incorporating a silent repair phase where -validators negotiate amongst themselves to determine the block they -should restart from. During this phase, no new blocks will be created, -and the aim is to converge quickly. All validators should stick to their -votes from before the restart; no changes are allowed. - -To achieve this, we\'ll use gossip to exchange most information during -the repair phase. To prevent interference between validators who have -restarted and those who haven\'t, we\'ll use a new shred version to form -separate gossip groups. Two new gossip messages will be sent: one -containing last-voted work slots and another to ensure everyone shares -the same metadata. This will ensure that all validators have the same -data and metadata by the end of the silent repair phase, allowing them -to make unanimous decisions and start from the same block. - -So, last voted Fork slots is where we share the last vote before the -restart because the validators might be on different slots. Some people -vote faster, some people vote slower, so just one last vote slot is -normally not enough. So we would send nine hours of slots on the same -Fork so that people can\'t get the whole Fork, and people can get a -better view of the metadata. Also, after you repaired everything and you -have all the metadata, then you send out your new vote. We don\'t call -this vote to distinguish between a normal vote and this vote, so here we -call it the Fork, which is actually just a vote. So you send out after -all the repairs are done, you have automated data where you think we -should restart from. And also, you also send out how many heaviest Forks -you received from other people because we need to decide when we would -exit this silent repair phase after we see that 80 percent of the peers -received this heaviest fourth message from 80 to the people. We check -that and everyone agrees on the same block, same slot, and hash. If yes, -then we exit this phase and proceed to real restart. So we do what we -currently do; otherwise, if anything happens that makes you count, -proceed, just stop, print all debugging information and hot, and so han -can intervene or maybe switch back to the old restart method. How much -time do I have? I\'m probably a little bit slow. We have 11 minutes for -both finishing questions, but we can see how far we can get. Okay, -that\'s fine. So you are welcome to read the slide. So, I\'m just going -to generally introduce the silent repair phase, and then we can proceed -to questions. So first of all, when you restart a validator with this -new arg, immediately we send the last voted pork slots, which is what -you voted last, and all the slots on this fork. And after that, everyone -aggregates the last voted work slots from all the other restarted -validators, and you could start repairing a slot if you think this slot -could potentially have been up and confirmed before the restart. And we -could draw a line somewhere to say these are the candidates who could -have been confirmed before the slot, and the other blocks I don\'t care. -So you repair all the blocks you care about, and after we repair all of -them, you aggregate all the last votes and the last voted work slots and -choose your hub habits for it. So I think we are at 20 minutes now. I -don\'t know whether I\'ve introduced the new method enough so everyone -has a good graph, but we could see if anyone has any questions at this -point. - -I can proceed if no one has questions. Does anybody have any questions -currently on the current approach, or should we just continue? Alright, -go ahead and continue then. - -When? Okay, so\... Exit the Silent Repair Phase. To exit a silent repair -phase, I think the most important thing in audit handling is to make -sure everyone is on the same page. Otherwise, if you think everyone\'s -on the same page, you single-handedly enter the restart and start making -new blocks, while everyone still is people repairing blocks. That would -be disastrous, and another audit might be happening. So, here we are -very careful when we exit the silent repair phase. We would count -whether enough people are ready for action. - -So the current check is whether 80% of the validators receive the -heaviest Fork response from 80% of people. So, we cut 80 here because -this is a current line we draw when we do a restart. We wait for 80% to -join the restart, and then we proceed. And also, even if we see that 80% -of people respond, we also linger for maybe two minutes because a gossip -message propagation takes time. So, linger for two minutes so that my -heaviest fork which contains how many responses I got\... Hence, -everyone can perform security checks. - -Check one is: Did everyone agree on the same block, which means the same -slot and the same hash? Also, whether there\'s a local optimistically -confirmed block before the restart, right? So because my local confirmed -block means before the restart, I saw two-thirds of the votes on this -block already. So, you would imagine this block should be on the -selected Fork. It should be the ancestor or it should be the selected -block. If it\'s not the case, then the security check fails because -something\'s wrong. My local confirmed block is getting rolled back, -then you would also exit and hold and wait for an inspection. And if -every check succeeds, then perform the current restart logic. We -probably will click clear the gossip CRDs table so that we don\'t carry -the old restart messages into the new environment, and then we would -automatically start snapshot creation. - -In contrast to what we\'re doing today, where we manually ask people to -manually do it using Ledger, here we might start earlier once we find -out everyone agrees on the same block. Then we exit and execute the same -logic we are doing now in this new discussion. - -So I have a few links, one is a Google doc. I started this proposal just -starting, so it contains many details and a lot of designs we rejected -and why. Because I\'m currently modifying both the SM Med draft and this -Google doc, so this Google doc might be outdated, and some design -choices might be different if that\'s the case. SMED is the newest -proposal, and the actual SMID draft is here as well. - -I also have some description here. Let me know if you have questions. Do -you have questions? Can you hear me? Yes, we can hear you. Yep, so -actually, I\'m from the Mango team, and we are currently implementing -SMD 47, which is like the last three-star slots. So, I\'m wondering if -this silent repair stage should be considered also a restart slot. -Sorry, I haven\'t checked that doc in detail, so I think your proposal, -correct me if I\'m wrong, your proposal is to expose the last restarted -slot somehow through Ledger, right? Exactly, so here I think it\'s -orthogonal, but once the silent repair phase is over, and we know where -we are restarting from, we could also connect to your code and expose -this information somewhere, right? Oh, exactly. So, when it\'s in the -silent repair phase, we don\'t know for sure it\'s a restart. They are -negotiating, but they don\'t know whether they can decide on the same -block. So in that case, I don\'t think we will expose anything, and once -that phase is over and we know we are really entering the restart, then -we can expose that restart slot. Did that answer the question? Okay, it -makes sense. There shouldn\'t actually be any changes to that proposal -because we\'re going, once we\'ve committed to restarting at the -coordinated restart slot, there\'s going to be a hard Fork anyway, and -we\'ll\... So that\'ll update this as far. Okay, that\'s cool. So when -it\'s in the silent repair phase, we don\'t know for sure it\'s a -restart. They are negotiating, but they don\'t know whether they can -decide on the same block. So in that case, I don\'t think we will expose -anything, and once that phase is over and we know we are really entering -the restart, then we can expose that restart slot. Did that answer the -question? Okay, it makes sense. There shouldn\'t actually be any changes -to that proposal because we\'re going once we\'ve committed to -restarting at the coordinated restart slot, there\'s going to be a hard -Fork anyway, and we\'ll\... So that\'ll update this as far. Okay, -that\'s cool. So that works nicely together. - -And any other questions? We have a question. I\... I muted you. Say yes, -so I just\... Can you hear me? Okay, yep, okay, sure. So as a validator -operator, I want to say it\'s very encouraging to see how much really -good thought design seems to have gone into what you\'re proposing here. -I predict that what would happen during another restart event is that -there would still be hiccups that will get alerting, and there\'ll be a -lot of confusion and talk. So, and if we\'re kind of racing some -automated process, just keep in mind that you may want controls there, -as certainly messaging from the validator to sort of let us be very -aware of what\'s going on so that we can make decisions about oh, you -know, because if someone believes that there\'s a bug or a reason that -the restart shouldn\'t proceed, allowing something to run away with a -whole cluster restart that we want to pause. Just having controls and -informational messages to help us understand what\'s happening are very -important. I just want to emphasize that, that\'s all. Yes, I think -maybe later there will be\... I would try to get more feedback from The -Operators because this really impacts how you operate during an outage, -right? So it helps to get more feedback there. So I think first of all, -I totally agree, and the current approach is opt-in. If you don\'t -restart your battery data with that flag, nothing would happen. We would -keep the current approach if you feel more comfortable with that, and -also, of course, the outage handling is mostly to assist people; it\'s -not to replace people. And we\'ll also, of course, give you ways to -inspect what\'s happening inside and ways to decide, \"No, this -automatic restart is not working; I should do something else.\" That\'s -totally doable. It will be all command-line controlled. Does that answer -the question? Yes, it did. If there\'s anybody else that wants to ask -further questions on this in SMID, I posted in the chat, we can take the -discussion there. And thank you all for joining another Core Community -call. You all have a good month. Thanks. - -# AGENDA 5 [[Core Community Call - April 21, 2023 -]{.underline} [QUIC, Syscall for Restart Slots]{.underline}](https://www.youtube.com/watch?v=AEnkivbha0k&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=6) {#agenda-5-core-community-call---april-21-2023---quic-syscall-for-restart-slots .unnumbered} - -- Time: April 21, 2023 - -- Link Video: - > [[https://www.youtube.com/watch?v=AEnkivbha0k&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=6]{.underline}](https://www.youtube.com/watch?v=AEnkivbha0k&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=6) - -```{=html} - -``` -- **Speakers profiles** - -```{=html} - -``` -- Max from Mango: - > [[https://twitter.com/m_schneider]{.underline}](https://twitter.com/m_schneider) - -```{=html} - -``` -- **Key concepts mentioned:** - -```{=html} - -``` -- **Syscall to get the last restart slot - > [[https://github.com/solana-foundation/]{.underline}](https://github.com/solana-foundation/).. - > .** - -- **QUIC Tuning Parameters** - -Welcome to this month\'s core Community Call. I have posted the agenda -in the chat. So, Max from Mango will be presenting on the Simds 46th or -on the new Cisfar for the last vote. Last voted on the slot, and then -he\'ll also want to talk about how quickly the different tuning -parameters were chosen for Quick. And Max just joined. I will promote -you as a panelist. Go ahead, Max. Sorry for being late. - -So, the floor is yours, Max. You can go ahead and get started with -whichever one you want to start with---either the quick tuning -parameters or your CMD that you\'ve been working on. For the quick -tuning parameters, the thing that was, like, my request, which I was -hoping for, was that we have someone who worked on it. You know, lead -the discussion. I don\'t know if someone is here that worked on it, and -I can at least give the outside perspective of reverse engineering some -of those things. But, you know, reverse engineering requirements is very -difficult sometimes. And that was the main request, that we get someone -who knows all the requirements, maybe to present them. If there\'s no -one here, then maybe we put it for next time. - -Stephen Eckrich, could you talk a little bit about how y\'all chose the -tuning for Quick? I can talk a little bit. We had a somewhat specific -performance idea in mind. We wanted it to be in that 50 to 100K TPS -(transactions per second) range in the front end or, like, at most at -100K TPS. So, we tried to split the streams that way and allow enough -streams for each client to be able to fit within that. So our approach -was mainly from benchmarking in the test environment and seeing what -bandwidth we could obtain under a somewhat optimal connection---like the -worst-case TPS in the real validator---and trying to calibrate that to -what we thought the back end behind Quick could sustain or handle. Also, -we had to consider keeping the memory within something that was feasible -for a normal validator. Obviously, if you have more streams, you need to -have more memory to hold all the packets that are kind of in flight and -potentially reconstruct a transaction that might cross multiple packets -and things. - -So, the more outstanding streams you allow, the more memory you need to -frame all those incoming streams. You have one limit we found, and we -were curious about it. I think it\'s like 2,000 transactions every 50 -milliseconds, like a leaky bucket model. That would mean that\'s just to -verify, concentrate. I mean, I think we were talking about it in -Discord, right? That\'s not like a hard limit. The 50 milliseconds is -kind of a target for that stage. It\'s spending time in -\'instigverify,\' and things are coming in behind it, right into the -channel, to get backed up. So, we want to make sure that we\'re pinging -the channel pretty frequently, like within 100 milliseconds, to ensure -that the channel can\'t back up faster than the incoming packet flow. - -So, I mean, it doesn\'t have a hard requirement. Like, if you have a -machine that can basically verify 10,000 transactions in 50 -milliseconds, it will clear all of those, and it will bring up the new -batch, and it will verify it. But it\'s just a way to keep the queue -from doing an exponential fill up. Right, if you have a large batch and -you let it fill in behind you, and that\'s even larger than the next -batch, then you\'re just, you know, like an unbounded condition, and -that\'s not good for the memory in the Valter. So, there are a couple of -different solutions to that, but, you know, we didn\'t like the -boundedChannel solution because you can\'t really have good visibility -into the channel. You can\'t really drop intelligently inside the -channel. So, we felt like it was better to just pull everything out of -the channel, and we have that kind of, you know, the db random thing for -like if we\'re getting an extreme amount of packets that we really -don\'t have time to look at really anything in the packet list at all. -But if we\'re in a less extreme scenario where the machine can handle -the flow, you know, we do like a round-robin between senders, kind of -dropping, but that algorithm can\'t handle some cases where we have to -handle the case of a really wide pipe coming in and a very small amount -of compute and then a very narrow pipe coming in a large amount of -compute, right? So, all those variables can be different between across -machines. So, trying to handle any kind of configuration, I guess, makes -sense. I think this limit is a bit surprising, right? Because, at least -for us, it was a bit surprising. - -There\'s another one I think it\'s the receive window size that we -discussed a few times, and I think the idea that was, like, you have -basically based on the stake, different receive window sizes, which -limits the number of parallel streams there can be per connection. It\'s -like eight connections per identity, and then I think there\'s some, -depending on the stake, each connection can have a certain number of -streams. The eight connections are just to kind of, if you had clients -behind a router or you had a race condition where you got disconnected -and you needed to reconnect, you might have, you know, some connections -overlapping, so just not to kick you out immediately if you had a stale -connection in the connection pool. - -But we\'re using the streams to throttle based on stake, and then, of -course, a budget for unstaked as well, and those are subject to -tweaking, I think. We wanted to roll out the first version and then see, -kind of, you know, monitor the metrics and then update them potentially -as we see, you know, the use in the validator. I don\'t think they\'re, -I mean, they seem to have been fairly reasonable defaults but open to -tweaking, I think. For the just a question for any of the people from -the fire dancer team, I know that you all have been working on it quick. -Did y\'all choose similar like received window parameters in tuning, or -have you all not gotten to that part yet? I don\'t think Nick is on this -call; he\'d be the best person to answer it. Let me go see if I can find -Nick. Okay, thank you. I think he\'s on vacation today. Oh, then I -probably won\'t be finding Nick. I don\'t have the answer to that off -the top of my head. Okay, maybe probably we probably should sync as we -go further into the implementation of like what are the different -parameters that we have seen because in the future I think as Steven, as -you said, it was a good default to start with, but what is better -performance in the long run would be nice. So a question that charges -real fast about the state-based variables, right? So, Morse, you have -more stake generally gets more bandwidth and more resources, and you -know, say of transactions into the value, so that\'s the idea, which is -really cool and like a novel, it\'s like a Solana Innovation, you know, -you\'ve seen that before. As Antipsy, did you have a question on this? I -just wanted to expand a little bit on that. Is it because the larger -stake is assumed to have larger pipes, or is it because larger stake -actually sort of does more in some way that requires different -variables? And the only reason I ask is that if it\'s because larger -stake is assumed as a proxy for larger pipes, then maybe it would be -better to have larger pipes actually be something that one could specify -on the command line or something. You could say how much bandwidth you -expect to be able to utilize, and then smaller validators can do more if -they\'re able to, and larger validators could do less if they\'re, you -know, it doesn\'t if that makes sense. Did I come through there? It\'s -not necessarily a hardware thing, although more higher state validators -should have more, you know, hardware, more resources, I guess, and more -hardware to handle a higher load---10 gigabits, but maybe JP has 100 -gigabits or something, so I don\'t know if they may have more or less -stake than I have. So I was just wondering if you know if that\'s stake -is assumed as a proxy for bandwidth or if it\'s something else that -causes these variables to need to be different. Standard proxy, it\'s -just that stake is really the only, you know, civil-resistant identifier -that we have in the network right to determine how much us resources and -things that you should be in control of essentially, like how much block -space right should you have. I mean, I would say, you know, those -overall bandwidths could be like a scaling like if the validator had -customized hooks for scaling the overall numbers right, you could do -that right. So you would have like let\'s say the value has you know -100,000 connections now or outstanding streams maybe if you had a 10 GB -or 100 GB you would want to make it like you know 10,000 or something -but you would still like to distribute those streams across the stake. - -That\'s kind of what I\'m saying. If there\'s any opportunity for a -protocol to custom-tune their numbers in ways that better match their -actual configuration, regardless of their stake, that\'s kind of what I -was getting at. There isn\'t today in terms of a command line flag or -anything, but that potentially could be added if it seemed to be a -limiter or helpful. - -In the interest of time, we probably should move on to this MD that you -wanted to talk to, Max. So, if you want to go ahead and chat about that, -we can get it started there. - -\"Yes, let me bring it up. Can I screen share, or should I be allowed -to? Let me know if you\'re not able to.\" - -\"Okay, let\'s open this file. This is the newest one we wanted to -propose. Basically, the motivation here is, on a high level, what do D5 -protocols do when the cluster restarts? I think some protocols have been -built in with certain slot limits for orders or things like that. But -especially in lending protocols, there\'s a lot of \'first-come, -first-serve.\' Basically, when the network starts up, we need to assess -that not necessarily all RPC nodes are already at the right state. Like, -that\'s something we\'ve seen before, is that sometimes a lot of things -will not work on a coordinated restart. So the idea here is, well, right -now, it is just a little bit random and uncontrolled how things behave. -We can expose to the application developer that there was a controlled -restart. So this is currently the last hard time for Hard Fork on the -bank in the reference client. So this is basically just a very simple -system variable that allows you to access that data and then implement -custom logic. Maybe you want to lock down liquidations for another 100 -slots until the oracles have time to update, etc. Could be that the -chain was in a very different state or the prices of certain assets were -in a very different state before the restart occurred. So this is kind -of like just more programmability. The proposal goes into detail what -exactly we want to expose, and I think there was some feedback already -that this would also be a good mechanism to maybe actually expose other -things. So just curious, you know, before we touch it and create an -implementation, if there are other data needed than just the slot, it -would be good to add it now to the proposal. So we\'re kind of on the -one pass over it, and it\'s everything we need.\" - -\"I think that\'s a question in the chat for you, Max. The question is -if the protocol allowed validators to stop the slot timestamp at the -current time on the restart instead of having to catch up gradually, -would that be another solution?\" - -\"Oh, so I did some analysis on how the timestamp works right now in the -last restart. I\'m trying to find it, but I\'ll post the data later. But -basically, you have the restart slot, and then usually it\'s a few more -slots to go, and only once those votes come in, actually, the cluster -time gets updated. So I think around three slots after restart, you\'ll -actually have a correct cluster time or a somewhat updated plus the -time. So suddenly, you\'ll have jumps from before the restart to after -the restart. But these are the things that are kind of like can cause -actual issues in protocols, right? A lot of times, the cluster time is -supposed to move fairly connected to each other, but in those moments, -it doesn\'t. There\'s a real disconnect there for a few slots, and then -transactions usually start piling in around that time as well, as the -cluster time starts moving again due to user transactions, not both -transactions.\" - -\"You know, I think this is just one of the effects that we\'re seeing, -right? So that\'s the one you\'re describing. This is like one of the -symptoms that we can circumvent with this measure. But I think, in -general, this information is a little bit more rich. Right now, I think -there were some ideas about lending protocols blocking liquidations and -allowing people to deposit more collateral, kind of like a margin call -scenario where you have at least two minutes to top up your balance -because there\'s a freaking cluster restart. You know, it\'s not -happening every day, and it\'s maybe not the user\'s fault that they -couldn\'t manage their position. I think that was like one of the main -concerns why we wanted to be as configurable as possible and as exposed -as possible to the application developer, rather than just fixing just -one particular issue about cluster time.\" - -\"Okay, cool. So if anybody has any questions, they can voice them now. -If not, there\'s also a link to the PR for the Sunday in the chat, so -that if you can\'t get to it here, we can do the discussion on the Cindy -as well. I\'ll ask some time for anybody that has any questions for this -excellent idea from proper runtime developments.\" - -\"Two things: one is terminology. I think it\'s also written in the -comments that restarts, slots, and halves are two different things. So a -hard fork would be a scenario in which a part of the cluster on purpose -tries to diverge from the rest and make up their own cluster -essentially, which is probably not meant to be. The other thing is that -we are trying to move away from Cisco specifically, and we will be using -or completely replacing them by fit and programs in the future for all -the things which actually do compute anything. But in this case, this is -just a lookup of some global value without any computation behind it. So -it should probably go into a system variable, and I can\'t say what the -JP scene is going to do, but in our implementation, we feed all the -switches with system variables anyway. So that would only be like a -trivial identity function, which is kind of useless in that sense. Just -saying, probably easier to start off with this voice and think about -what else you want to put in there. Anyone has proposals for what else -to put in?\" - -\"Well, here, I think if no one has any other proposals, we can end -here. We can continue the discussion on the Cindy, though. You have a -question? Go ahead.\" - -\"Is there ever a value in knowing more than the last restart? Like, say -there were two restarts within, I don\'t know, two hours because there -was some problem that recurred. Would that be useful to know, or is it -always only the last restart that is useful to know? In other words, -does it need to be a single value, or do you want it to be some like a -set of n values that end most recent restarts?\" - -\"I think I would rather see what adoption looks like on the single -value and then go from there. Having a new feature, a historic value, I -find it hard to reason about historic values. Well, but I mean, in -particular, you\'re identifying a use case that you believe covers -something that\'s important to you. - -I\'m asking you if you had two restarts that happened within four hours, -would that change what you would want to know or not? No, probably not, -but I think you want to get back to normal operation as quickly as -possible. And I think that the delays, probably within 100 slots for -most applications, so as far as the time frame is concerned, are just -very, very short. I wouldn\'t know what four hours ago, another restart -would change on the current situation, right? So, of course, -unfortunately, okay, thank you. That doesn\'t answer my question, thank -you. - -I had a follow-up for Alex. You mentioned that the current hard Fork -slot is currently synonymous for a restart, but there are other ways to -trigger a restart, but there\'s no consensus stage shared about those -resources, right? Or is there another way to get those? It\'s a kind of -the other problem, the security issue. How are you gonna reach consensus -about the researchers, right? But I was really talking just about the -terminology that a hard Fork means that you are diverging on purpose -because part of the cluster wants to do something else, and otherwise, -it\'s just a fork like any other fork that will get removed at some -point. It\'s a slow block, right? - -Basically, so I think the differentiation between a slow block and the -restart is probably not so\... on an application, it doesn\'t really -make a difference, right? If you have a one-hour small block or you have -a hard fork, it\'s probably the same. If it took like an hour to -organize that or 24 hours, so what I mean, there\'s no like terminology -called this or anything, but if people, for example, say like Bitcoin -and Bitcoin Gold, these are hard forks, well, like what they did one -there back in the day because the community actually switches to an -entirely different protocol version in the restart slide. And this is -not\... I mean, this is obviously depends on the exact reset scenario, -but if you are just relearning the same version again, always only minor -black faces and all that, we are on the same thing, then this is not -really hard for because it\'s not\... you\'re not off from anything -else. - -But like what people understand on that term, a hard fork means that -then there are two blockages and two sets of validators and two -networks, essentially, which do a different phase. And I mean, usually, -there is that tries to avoid that scenario of hard forking and instead -come back to one consensus of global networking. - -All right, interesting. Coming in sometime because we are one minute -overtime. Let\'s bring this discussion further into the CMD. I will post -it again in the chat, and then we can further the discussion on this -specific MD for 47 with Max and Alexander and more. But thank you all -for coming on today on this month\'s core Community call. Thanks for -watching us, Jacob. - -# AGENDA 7 [[Core Community Call - June 16, 2023 - Light Clients]{.underline}](https://www.youtube.com/watch?v=9m_M8zEw1cE&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=7) {#agenda-7-core-community-call---june-16-2023---light-clients .unnumbered} - -- Time: June 16, 2023 - -- Video: - > [[https://www.youtube.com/watch?v=9m_M8zEw1cE&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=7]{.underline}](https://www.youtube.com/watch?v=9m_M8zEw1cE&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=7) - -- **Speakers profiles** - -```{=html} - -``` -- [[https://www.tinydancer.io/]{.underline}](https://www.tinydancer.io/) - > (Tiny Dance) - -```{=html} - -``` -- **Key concepts mentioned:** - -```{=html} - -``` -- SIMD-0052: Add Transaction Proof and Block Merkle for Light - > Clients - - > [[https://github.com/solana-foundation/...]{.underline}](https://github.com/solana-foundation/%E2%80%A6) - -Welcome, everyone, to this month\'s Core Community call. Today, we have -for discussion light clients, and we have the Tiny Dancer team, Anoushk -and Hirsch, talking about different ways that they have been thinking -about implementing it. The agenda can be found, as usual, on the Core -Community call repository, and the specific Cindy is 52, which I have -just added to the chat. Anoushk, you\'re welcome to take it away. - -Thanks for the intro, Jacob. Let me just share my screen. Thanks, -everyone, for joining in and giving your time. I\'m Anoushk from the -Tiny Dance team, and we\'ve been working on implementing the flight plan -for Solana. It\'s draft 7052 for adding transaction proof verification. -So today, we\'re going to give a brief overview of our research. - -So, I\'d like to start with why we\'re doing this, the motivation behind -assembly is primarily to implement light plans for Solana. The reason we -need light plans is that users need to verify queries that they make to -the RPC, and right now, they cannot do that, which is why they have to -trust the RPC that they give them the correct, you know, these like -lines need to be low Hardware pieces of software, and they need to be -able to run on a phone or browser. So, this is really important for -security for the blockchain Network, as we already know, more mature -networks like Ethereum that have been there for longer already have -tight lines, and this was a glaring problem in Solana. So, the crux of -this MD is adding something called transaction proof. So, on a high -level, it\'s just a multi-proof saying that from your transaction that -you sent, was included in the block and it succeeded or failed, however, -it should have. It did like awe the change that we\'re making here -requires adding requires some way of making sure that a particular -signature and a status, whether it\'s success or failure, was included -in that transaction in the block. The user needs to be able to verify -the inclusion of the transaction and the execution status. We would also -add an RPC method that would allow anyone to just call that method and -get its proof for the particular transaction. So, as I mentioned, for -the reason that we need this is that RPCs could give you incorrect -information that the transaction actually succeeded or it was included -in the blog, but it actually did and that\'s an attacker. You can still -verify this data if you have a snapshot, but obviously snapshots are, -you know, 30, 40 gigabits. - -And that\'s a lot of data for the empty user. Also, relating to a -different simile about stakewade attestations, you can actually use -transaction proofs to verify that a particular value that has a certain -stake off-chain, as mentioned in the SPV proposal, a validator could -technically use reduced transaction proofs to use them as a checkpoint -to verify a certain state and as part of a different proposal that uses -SPV, it can also be used for interchange verification. Here\'s a list of -important resources that you could take a look at. This is the CMD that -we wrote, DSP proposal. There\'s an open issue that talks about adding -statuses to the bank cache, and that\'s the interchange and SBP -proposal. So, this is the part that we really there\'s been a lot of -discussion on and we think that there needs to be more con-like more -discussion on from different parts of the code of the community on -different ways to implement it in our CMD right now. - -We are really implementing the first way, which is modifying the block -has to include statuses, but over the last week after discussing with -some members of the jp team and other members of Surround Labs, we also -found different ways to implement it to tackle different issues that may -arise while implementing the first method. So, I\'m gonna dive into each -of these very beautifully. So, modifying the block hash is pretty -straightforward and again part of the history proposal. So, all it does -is you add the transaction status along with the transaction signature -into the Merkle tree of the transactions, which is part of each entry, -and that gets hashed into that gets mobilized into the block hash and -becomes part of the bank cache. Currently, the bank cache is a -sequential hash of all the entries, but making it a virtuality would be -better in terms of verification size, and obviously having the status is -important for verifying if the transaction actually succeeded. Here\'s a -quick overview of the pros and cons. So, the pros being that on the -client side, the verification is less computationally heavy, so that\'s -good for low Hardware devices, and it\'s part of the core consensus -protocol, which means that all validators have to write it, you know, -overall or with. The downside of this being that it\'s quite a major -string general require-like feature flag activation, which means that -the round trip from implementing this to actually going live on Mainnet -would be quite long, and also there is a computational overhead of -memorializing entries that was initially taken into account. - -Moving on to the second method, which is adding a separate transaction -tree, which would basically be a tree of all the receipts of each -transaction. This would be part of the bank hash, so basically just a -tree or a monkey tree of all these interaction signatures and statuses, -and would just be hashed into the bank cache. The pros of this are -mainly that it doesn\'t come the way of planting seeders, so a leader -could basically just create the entries, create the block, propagate the -block, and then asynchronously update this data bank cache with the -statuses, so they don\'t need to have it before propagating the block. -Again, this is also a major change, so comes with the challenges of the -first way to implement it, and so this is part of the second method, -which is we were told that implementing changing the bank hash would -somehow come in the way of backless leaders. So if we implement this, -which basically have the state of block n in block n plus 10, you -actually don\'t need to execute the transactions of log n to get the -statuses and then know you have to compute the bank cache, so you could -just do that in an async way. But this also would be a pretty major -change protocol, and that is also something that needs to be heavily -considered if you\'re deciding to go over this. The last one is probably -the most flexible and easy to work with because we are not really -changing any core part of the validator like the consensus. So we are -just using gossip or could be a different network. - -We are even to asynchronously push commercial commitment of all the -transaction receipts, and this could be done, let\'s say every 10 blocks -or so, so you know, it\'s not even doing it every block. And you could -then have validators that pull this change, website against their state -and then push another station saying that hey this is this checks out -with the data that I have now or likely I could just you know pull that -data pull those attestations and just verify if X percent of the stake -has actually confirmed that this is sticker attached and that their -transaction was included in that. The pros of this are that there\'s no -overhead to block production because it\'s done asynchronously and is -not part of the bank cache. There\'s a low risk of liveness failures -because it\'s not part of the core consensus protocol, and it\'s also -easier to implement. - -\"Because it\'s once cause it and not consensus, the only downside would -be that it\'s not making the code protocol, so it would be optional to -implement, and the validators aren\'t really forced to make those -attestations or commitments. So this is where we end this presentation -and want to hear more about the thoughts of the code community and open -to any critics or questions. Thank you, Richie. - -Hey, so not to say thanks a lot for working on this. I think this is a -really nice initiative, and it seems like a rather easy win complexity -and wise for enabling this functionality. I would just like to voice my -preference for going the gossip route or any related method of doing it -this way. And while we don\'t modify the core data structures to support -this feature, I think my main problem with modifying the proof of -History hash would be that it\'s quite a breaking change of the -definition. What the proof of History has currently is where it would -basically go from committing to the block data contents of the current -block and all blocks before that to going to committing to the state -changes that this block induces. And this would matter for fire dancer, -for example, because we might use the POA hash to identify the chain -that fire dancer and Salonlabs are currently on. And let\'s say, for -example, we have a temporary mismatch in the runtime where we derive a -slightly different state on both clients. By redefining the proof of -History hash to potentially differ on both clients, I think it would be -much harder to tolerate such runtime mismatches or even detect them, as -that would basically stop validators from synchronizing entirely rather -than continuing replay with a slightly different state. - -I think going the like Fast delay route doesn\'t seem too elegant to me -because that would basically introduce minimal latency, finally like the -client, where they would need to equip these, you know, n block speed 10 -or so. I think regardless of which way we choose, maybe I thought of -splitting up the proposal into a few separate parts, and then it would -be much easier to vote on each one specifically because it feels like if -we try to incorporate this entire feature into one, there\'s going to be -a bit of discussion on it for quite a while. - -So the first one that I thought of would be just agreeing on how we -actually compute the commitment for the transaction statuses only. So, -you know, given a vector of transaction statuses, what goes into the -hash? Do we just commit the transaction result code, or do we also hash -logs in some way? And then, you know, define what the actual root of the -transaction statuses is. And then we can do a separate sim that says -here\'s how you would propagate it over gossip. And then we might go -back and say, well, in hindsight, gossip was a bad idea. So here\'s -another sim deal of how we would propagate the transaction statuses over -whatever other protocol. And one other way would be of cross-posting it -on-chain itself, which, of course, has the benefit that this kind of -incentivizes validators to actually participate in this transaction -status calculation. Whereas, if I wanted to be mean, I could say, hey, I -don\'t want to implement this feature and fire that, so I\'m not just -gonna propagate it over gossip, which would, I think, decrease the -quality of service. I think we kind of want to incentivize validators to -participate in this feature. Again, thank you so much. I\'d love to hear -your thoughts and on these, and I\'m also gonna post the same feedback -on assembly itself. - -Likewise, I also respect your interest in this, indeed. I think that -gossip is definitely a favorable route because it allows us to test a -lot of the client UX of the electronic, and because it\'s actually -simpler and less of a breaking change, it\'s easier to revert back if we -messed up. If we think that\'s not the right way, then doing that from, -you know, making a change to the bank hash and then like, you know, -thinking that okay, this is not the right way and going back to go -outside. - -I think that regarding like validators being incentivized to participate -in the network, that\'s something that, again, eventually be figured out -and might even be another Sunday. And I think we can, I\'m leading more -towards what Richard said, we\'re going with gossip. So I totally agree -regarding the incentives. I\'d be also curious whether Solana Labs has -any thoughts on this proposal, but would be really cool to see progress -moving on this rather soon. - -I just want to say, first of all, this is a great effort. It\'s gonna -have a lot, I think, to the community. One of the issues I saw regarding -the transaction status is we\'ve generally been moving away from -detailed transaction statuses more into very broad categories of -failure. And the reason for that is, for example, originally we even had -the runtime errors as part of the consensus, luckily that\'s not the -case anymore. So there\'s now only one case for the entire runtime in -the consensus. And the reason why we moved away from that is that the -success cases are already complex, but the failure modes are so much -more complex, and it really narrows down the implementation you can have -to get the exact precise error response of every transaction rise. And -that makes it almost impossible to change anything or to re-implement it -any other way. So just be careful about the transaction results, don\'t -include too much error state or logging into them, otherwise, we will -all be stuck with exactly one implementation. So we really just want to -include like success or failure. There was a suggestion to include like -transaction logs, but we can actually avoid that by just re-executing -the transaction on the client side by fetching the inputs. So we just -want successful failure. I heard some feedback suggesting that we also -add logs. I think logs are pretty scary because right now the truncation -of logs is not well-defined. But maybe that\'s actually an opportunity -to say that there\'s a recommendation to, for example, only do 256-byte -long log lines. The concern I had there was how this would affect -performance if we hash two or more sharp blocks for each program -execution or so. Would that limit the TPS in the future? I don\'t -remember who it was, I think it was Mango. - -\"I don\'t know. I think the only concern was like with the overhead -added by logs, but I think you mentioned that with fire dancers like -implementation of, I think that might not be a problem. And once you -have your Henry\'s go-ahead and start, no, I just wanted to clarify, -Richard, when you actually, for both Richard and Anushk, when you say -the gossip route, you mean that there are going to be no consensus -changes, right? Like, even the validators are voting on regarding the -state or whatever state is necessary would be in a separate smart -contract. It wouldn\'t be part of the block. Yes, correct. It wouldn\'t -even be in a smart contract. It\'s basically just a structure, okay? So -the contact info is a structure that every validator publishes regularly -onto gossip. As far as I know, there\'s already a snapshot hash and then -the accounts hash, so it seems like it would be fairly trivial to fit in -another hash there. So that\'s actually a bit more discussion around -whether we should have an entirely separate hash for this, because -usually if you\'re getting the transaction status commitments, you -probably also want the account sashes. And the problem with doing -separate fields for this is that you\'d basically have all validators -accessing them separately. I think if we fit them all into the same -contact info block, that might not be a problem. They also don\'t need -to be at the same frequency, right? How frequently is this contact info -updated or how frequently do validators publish it? The question for -Solana Labs, I think that\'s an implementation detail anyway, but I just -wanted to be clear that in the gossip route, there are no consensus -changes, right? So even the transaction status or anything, the block -structure doesn\'t really change. So Tiny Dancer won\'t be blocked in -any way on that, right? Yes, okay, just wanted to clarify that. Are -there any other questions for Anushk and Hirsch? Carol, I think you -mentioned that the Mango was\... They suggested using a bi-directional -connection. Max, I think you\'re here. Do you want to speak a little bit -more on that?\" - -\"I\'m sorry, could you repeat on which one should I speak? Corral -mentioned that y\'all suggested you use a bi-directional connection. I -believe this was originally like an experimental feature that y\'all are -implementing on the labs client, and it\'s like a client-specific. -Y\'all want to talk about whether it\'s relevant anymore.\" - -\"I can give some background for the people who are interested. So what -we did is when we run benchmarks on a local network, we\'ll enable a -patch on the TPU side to give us back, basically, a status that -summarizes what happened with the transaction in the scheduler. This is -very similar to, I would say, like request tracing environment that you -would see in a commercial microservice architecture deployed in a -private company. You send something in from a load balancer, right? You -want to trace for a limited amount of the requests in the network, why -aren\'t they getting scheduled right? So you get a per-request -measurement that is actually complete because right now, the -measurements we have are statistical and broad, and it\'s very hard to -say in particular which transaction, like we just see all five out of -100 transactions had this issue, right? But we don\'t know what\'s wrong -with these five transactions, why didn\'t they get into the block? -Right, what were the five transactions that hit the CU limit or what -were the five transactions that hit the 2000 packets per 10 per 100 -milliseconds on a quick connection, right? There are different limits in -a stack, and it\'s very hard to identify why a certain transaction -didn\'t pass. That was the original intention there. But I think -there\'s a lot of pushback against this kind of, I would say, -nice-to-have feature. We really enjoyed having it for local performance -testing because we get more insights, but that\'s it. I\'ve looked at -this a bit, and it wouldn\'t seem that hard to support and finance or -Solana labs, and I think it\'d also be pretty nice to have clients to -get explicit feedback about why the transaction might fail or not. And -it seems like, in financial kind of applications, that would seem like a -basic feature to have, especially if they\'re user-facing. Like if I go -in my wallet and send a transaction and that gets dropped somewhere -along the path, since this is an issue that would seem to directly -affect the user experience of our clients, I think it would make sense -to report that. But it requires a bit of plumbing to get that data back -to the networking layer because usually, at the point where you know -where your transaction gets dropped, you probably already anonymized the -traffic flows, where you don\'t have the IP addresses or quick -connections anymore.\" - -\"So I feel like this should be\... I don\'t see why we wouldn\'t move -to bi-directional connections, just have the ability to do this kind of -reverse flow feedback in the future. And then we could just maybe -publish this in the specifying what the protocol should be for reverse -flow feedback, and then, you know, I think as time goes on, we\'d see -more Solana Labs clients adopt this and finance the clients.\" - -\"What was the specific feedback why this wouldn\'t be a good idea?\" - -\"I think there\'s a couple of performance questions there, right? So I -think the main issue is that it kind of creates risk on the security, -DDoS protection side. So, oh, I think I know where this is going. So -currently, every transaction is a separate unidirectional streaming. -After you send it, it gets closed. So if there\'s reversal feedback, -maybe that can force the client to keep open these streams for longer by -just saying, \'Hey, I dropped these packets. Please send them to me -again.\' But that should be easy to fix by, for example, delivering this -feedback with datagrams or with, you know, a persistent stream. I still -don\'t really see why we shouldn\'t do it if the state is easily -available. I see Galactus from Mango Prices.\" - -\"So it\'s actually what we implemented is more like\... You have this, -like, with Solana client, we cannot really implement this bi-directional -stuff because once you get the\... you need that like connection, it\'s -dropped immediately after reading. So what we implemented is a separate -service where a validator can connect, and then it can say, like, a list -of transactions that it wants feedback for. And so actually, whatever is -executed for X reason is dropped, then we just send the, like, why it -was dropped actually. So it\'s more like a separate service. It\'s not -even in the same\... like, TPU client TPU server.\" - -\"I see. I mean, it would seem a bit cleaner to just deliver -acknowledgments\... So I also would, like, I would also like to have, -like, a bi-directional channel where you just send a transaction and get -feedback like why it was dropped. But, like, on the\... this validator -side, there are, like, a lot of limits, and the connection can be -dropped for, like, a lot of reasons. And it was quite impossible just to -keep the connection up. So we said, like, okay, forget it. We\'ll just -have a new separate service. But,of course, I agree. Like, we can have -this per-directional connection of Quick, and then we\'ll just get -feedback for our transactions. I think if you install a mechanism to -signal optional features in the Quick handshake itself, it should be -pretty easy to trial out features like this on a real cluster without -affecting reliability too much or without introducing breaking changes. -But it seems like it needs a bit more time on finding out what the -actual right protocol is for delivering this feedback. I agree because -Quick right now, like, we have\... We don\'t have, like, a lot of bits -remaining just to have, like, give accurate acknowledgment. I think -while closing or even in the acknowledgment packets, maybe we have to -find maybe another mechanism to get this acknowledgment. I agree with -you.\" - -\"We\'re a few minutes over time, so I think we\'ll have to do as well -to continue the discussion, probably open up the PR that\'s on this as -well as the discussion on a news the 7d52 earlier. But thank you all for -coming this month, and I\'ll see you all next month for the next Cindy -call. Reminder, if you have any agenda items, make sure you do a PR to -the next agenda so that we get it earlier rather than later, and people -can read any additional information beforehand so we have a better -discussion.\" - -AGENA - -# AGENDA 4 [[Core Community Call - March 17, 2023 - Epoch Rewards V2]{.underline}](https://www.youtube.com/watch?v=IbviAInuSHk&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=4&t=2s) {#agenda-4-core-community-call---march-17-2023---epoch-rewards-v2 .unnumbered} - -- Time: March 17.2023 - -- Link: - > [[https://www.youtube.com/watch?v=IbviAInuSHk&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=4&t=2s]{.underline}](https://www.youtube.com/watch?v=IbviAInuSHk&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=4&t=2s) - -```{=html} - -``` -- **Speakers profiles** - -```{=html} - -``` -- Haoran Yi (Works for Solana Labs) - -```{=html} - -``` -- **Key concepts mentioned:** - -```{=html} - -``` -- SIMD 15 Epoch Rewards V2 - > [[https://github.com/solana-foundation/...]{.underline}](https://github.com/solana-foundation/%E2%80%A6) - -Okay, welcome everyone to today\'s core Community call. We have on the -agenda going through the epoch VT rewards by Howardum. That is, I\'ll -let you take it away. It\'s incept Anthony. Did you want to say anything -first or do you want to just skip ahead? Let\'s go, let\'s go. Go ahead. - -Okay. I'll show my screen. Okay, alright, we can see everything good. -Okay, so good afternoon, everyone. My name is Haran, I work for Solana -labs, and in this talk, I\'m going to give a brief introduction about -the new epoch rewarder proposal that we are discussing on the following -link as a CMD pull request. - -So here is some background information. We are experiencing a very long -block time at the epoch boundary, and the following table shows an -example of the timing for the blocktime around the epoch 400. We can see -that the highest number around for 90 percent of the validators are -mainnet for this particular block along the epoch boundary. It will take -around 38 seconds. - -Aaron, I believe you\'re not showing a presentation. You\'re just -showing your code right now. Okay, we see Visual Studio codeum instead -of seeing the PDF. Okay, let me reshare it again. How about that? Can -you see it now? Sorry about that. - -So let\'s go back. So basically, we are having a very long Epoch time at -the epoch boundary, and at this long time is because of paying out the -rewards at the pocket boundary blocks. So the more stake accounts we -have, the longer it will take, so the current approach won\'t be -scalable. That\'s why we are proposing a change to pay out the epocket -rewards. So instead of paying out the rewards at just one block at the -poker boundary, the new proposal is to spread out the rewarded -distribution over multiple blocks, and the new approach was divided at -the block distribution into two phases. The first one is the reward -calculation phase that basically is calculated the rewards are going to -be paid out during the epoch. After the reward calculation phase, then -there is going to be another phase called the rewarded distribution -phase in this phase actual reward will be credited to the stake -accounts. - -So as I mentioned earlier reward calculation is just computed the -rewards to be distributed and based on the timing we have seen before, -so we think that 40 seconds may be a good time for the reward -calculation period given that each block is 400 milliseconds so we -estimate that it\'s going to take a thousand blocks for the reward -calculation result to be available, and the reward calculation is done -by a background Services data services started Epoch boundary and the -last for a thousand blocks to compute the rewarded results for -validators which are faster they may finish the computation before a -thousand block height if that\'s the case then the validator would need -to Cache The result and make it available until the Thousand blocks and -for some reason for some validator which are slow then they will have to -wait at the thousand block height for the result to be available before -they can enter into the next phase a reward distribution phase. - -So following the reward calculation is a reward distribution similarly -rewarded distribution were happens over M blocks and the two minimize -the impact of all the block and other transaction processing during the -rewarding period so we are targeting to reward basically earning 64. -accounts for every tick since each block has 64 ticks so that will give -us about 4K Total Rewards that can be distributed in one block and the -reward distribution what happens in the blog before any transaction -processing, and now since the reward with the new approach, the rewards -are not going to be distributed at one particular block, instead, it\'s -going to spread out between multiple blocks so in order to track the -progress of a rewarded distribution, there will be a two-system account -that are added to help to track the rewarded distribution. The first one -is the epoch rewarded history and then it is basically a 500 fixed-size -array to be consistent with the stake with the stake history we choose -that number to be 512, and it\'s a fixed-size array, and each entry in -the array contains three elements, three fields. The first one is the -total rewarding land port for the epoch, and the second one is how much -reward has already been distributed in import that\'s the progress, and -the other one, the last one, is the hash of all the rewards that are -going to be paid out. This is introduced to verify the rewarded -distribution. It\'s similar to the role of account hash, but it\'s more, -it\'s just like a more specific for rewards, it\'s only harsh from all -the rewards that are going to be paid out, the second Israel account to -introduce is called Epoch reward Reserve. As I mentioned earlier in -rewarded distribution, each block all the rewards are going to be -distributed in M blocks, so we introduced the second set of systems. -This is basically MCS verse that keeps tracks of all the rewards that -are going to be distributed in one block and similarly, it has a balance -field which describes how much rewards are going to be distributed for -this particular block, and it also has a hash that\'s the hash of all -the rewards are going to be distributed in this block, and since we have -M system accounts, the address of the one particular system icon for a -particular block is basically determined by harsh the base ID to the -block height then we will get the unique address for the rewards going -to be distributed for again. As we\'ve seen earlier here, this is the -rule hash, it\'s computed by accumulating all the hashes from all the -reserves together so after we credit all the reserves credit order -rewards from the reserves, we will compare the hash against the rule -hash, make sure they match each other so that we can be sure that the -reward distribution is correct, okay, that\'s the main changes of the -proposal, and there are a few differences with the new reward scheme -than the older one, and the first one is that we were restricted the -stake account access during rewarding period, that means any withdrawal -merge split stick or any statement manipulation have to wait until the -rewards finished, if any transactions that involve those operations were -submitted during the reward paying out period they will get a -transaction error, we will introduce a new transaction error for it, -let\'s lock the reward icon during epoch reward, that\'s the first -impact, the second impact is that since now the rewards are going to be -paid out in multiple blocks, there will be changes for snapshot and the -cluster restart during those reward periods, so to accommodate this -reward distribution over multiple blocks so for any snapshot that is -taken during the reward period we will include a new field in a snapshot -that\'s stores to store the reward calculation result that\'s how much -rewards are going to be distributed, and when the cluster restarts from -a snapshot taken during the reward period, it will have to load the -result and resume the rewarded distribution process as if it is was -going on before it restarted, yeah, that\'s the overview of all the new -proposals for the new rewards and the more details can be found on this -link as the pull request here, yeah, let\'s go into Q and A sessions if -you have any. Well, if anybody that cannot talk, feel free to raise your -hand, I will give access to your question, yeah, thank you for -presenting this, um, I do remember a brief discussion - -About this form in the Discord maybe three or four or five months ago, -and I do remember asking this question, so I\'m sorry if it\'s being -reproduced here, but there are some dashboards that read rewards to be -able to, you know, provide information to end-users about rewards across -the entirety of Solana, and up to this point, it\'s fairly easy to do, -you just look at the first block of the first successful block of an -Epoch, and you get all the rewards there. How would a mechanism like -that work in this new system? Would you have to be constantly watching -for rewards blocks and sort of, you know, building up that information -incrementally, or will there be some point where it\'ll be obvious that -it\'s done and you can do one query to an RPC server to get all the -information? But if you just care about the total number of rewards, I -think you can still do it at the first block of the Epoch boundary. I -can address a little bit of this, um, since the rewards slot or blocks -are gonna be paid out, are you gonna be deterministic, you\'re actually -going to be able to generate a query based on which um stake account or -validator you want to know the rewards for, so we can actually make RPC -queries that function the same, it will need some extension but it\'ll -be slightly different from what we have today per validator and have to -make like 2,000 queries or something, is that what you\'re saying? To -no, no, I mean, you can just query all of the blocks in that case, like -if you need to do a large range of rewards you just get the entire -payout or distribution block range for the slots, they\'re basically, I -gotta get blocks with a limit call with whatever the um duration of the -distribution has been reached when all the distribution is completed, -and then make that call, is that what you\'re suggesting? Yeah, today, -right, yeah, yeah, you know, it\'s, it\'s over by the thousandth block -after the epoch, so you can just make the call right there instead, -right, so today, where you just know that it\'s, you know, the first -block in the epoch, now it\'s going to be, you know, the thousandth -block, or however many blocks before, I don\'t think any of this is -fully parametrized yet, okay, and so well, so someone would have to have -sort of code that understands that to be able to compute what that block -would be, or there\'ll be an RPC call to ask that at some point, it -like, is that how you anticipate it going? Yeah, basically, it\'ll -depend on how much complexity there ends up being in the final thing. I -don\'t anticipate it being that difficult, this could probably be like -an RPC helper versus an actual RPC endpoint, but I think it\'ll be -fairly trivial to put together a way to equivalently get, I mean -admittedly, it\'s going to be a little heavier because you have to get -multiple blocks, right, but okay, and I do have another question, but I -don\'t want to monopolize this, so I\'ll wait to see if other people -have a question first, all right, next question on the answer is was -Jeff, so go ahead, Jeffy should be able to unmute to ask your question. -So, sorry, my mistake, okay, is there any other questions about this or -otherwise, we\'ll go back to you, Sans, all right, Ashwin Godhey, just -wanted to ask if there\'s a cluster we started in the first thousand -blocks, is there any change to change that procedure, because the -snapshot won\'t have the result in it, yeah, we have a talk about this, -so in that case when the snapshot is taken during the reward computation -phase, the snapshot has to wait, it has to wait until the result is -available and store the result there, okay, zans, you\'re welcome to ask -your question, okay, so, is it the case that validators will only -validate a block if the validator, the leader producing that block has -the appropriate amount of either computation work or rewards pair at -work in that block, or is it the case that a validator can just sort of -like decide not to do it on their block and be like, I\'ve modified the -code to not do this because I don\'t want to burn the CPU on this and it -doesn\'t give me any rewards, so I\'m just not going to do it, or is -that even a possibility, or is it the case the cluster won\'t even -accept a block unless it includes these details because they\'re -expected for I mean they\'re sort of built into the protocol that this -has to happen in this order, yes, because the order is a deterministic -for the current Epoch, but there will be some randomness across -different epochs, so if the leader, for example, he doesn\'t, it -doesn\'t matter whether he\'s a leader or not, in fact, if the validator -doesn\'t include the expected set of rewards in the block, I think the -harsh were mismatched, and his block will be rejected, okay, so this -part of the block does go into the hash, so that validators have to -agree on it to vote on it, so I guess that answers my question, and we -just kind of accept that the first and leaders kind of have to do his -work without any compensation, that\'s just kind of like built into the -protocol, there\'s no, you know, need to add any compensation for doing -this work, it\'s not expected to impact the transactions that could be -fit into a block, like it doesn\'t take up extra block space or extra -compute time that could prevent a validator from including as many -transactions as it would otherwise, it\'s the same problem as we have -right now with only one, whatever that first leader or like whatever -that first block is, kind of gets screwed on including transactions -because everyone is Computing this, so you\'d have this is just -spreading out the computation to make it more feasible, yeah, I agree, -that sounds better, I was just wondering if there\'s an opportunity to -sort of like make that even more addressed by sort of paying a validator -for having to do this, just putting it out there, um, it samples a -thousand slots, right, so it kind of spreads the workout out of -everyone, you\'d be kind of paying everyone equally, which means -there\'s no up except the dudes that are unfortunate and only get one -block in the first you know about, well whatever it takes, like that\'s -cool, all right, is there any other questions about this, the epoch -reward changes, okay, cool, so this is a Cindy still, it\'s a I put the -link in the chat for everyone to add to the discussion later, um, 7015, -um, you\'re welcome to discuss it for the next rest of the time on this -call, I\'d like to open the floor for anybody that has just general Q&A -questions, just feel free to raise your hand and I\'ll give you access -to speak and you can ask your question, if there\'s nobody with -questions, we can end this early, so I\'ll give it a few more moments, -did you guys have a, you know, third-year anniversary party or anything -like that? Yeah, man, we\'re so busy, we didn\'t, it\'s, we should, all -right, we\'ll start planning for the fourth now I suppose, all right, -cool, - -Thank you, everyone, for joining today, um, there will be a space -afterwards that if anybody has any questions or that they don\'t ask -here, welcome to join, so be on Twitter, you can see it on Solana and -underscore devs, and we\'ll happy to chat there as well, thank you, guys -today. diff --git a/agenda/agenda_4.md b/agenda/agenda_4.md index f0bbe1b..a55b7ac 100644 --- a/agenda/agenda_4.md +++ b/agenda/agenda_4.md @@ -1,8 +1,259 @@ -**Meeting Info** -- March 17, 2023 19:00 UTC -- Duration: 30 minutes -- Zoom: To be shared in the #core-community-call channel on Solana Tech Discord +# **[AGENDA 4 [Core Community Call - March 17, 2023 - Epoch Rewards V2](https://www.youtube.com/watch?v=IbviAInuSHk&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=4&t=2s)]{.underline}** -**Agenda** +- Time: March 17.2023 -- [SIMD: Partitioned Epoch Reward Distribution](https://github.com/solana-foundation/solana-improvement-documents/pull/15) +- Link: + > [[https://www.youtube.com/watch?v=IbviAInuSHk&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=4&t=2s]{.underline}](https://www.youtube.com/watch?v=IbviAInuSHk&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=4&t=2s) + +```{=html} + +``` +- **Speakers profiles** + +```{=html} + +``` +- Haoran Yi (Works for Solana Labs) + +```{=html} + +``` +- **Key concepts mentioned:** + +```{=html} + +``` +- SIMD 15 Epoch Rewards V2 + > [[https://github.com/solana-foundation/...]{.underline}](https://github.com/solana-foundation/%E2%80%A6) + +Okay, welcome everyone to today\'s core Community call. We have on the +agenda going through the epoch VT rewards by Howardum. That is, I\'ll +let you take it away. It\'s incepted Anthony. Did you want to say +anything first or do you want to just skip ahead? Let\'s go, let\'s go. +Go ahead. + +Okay. I'll show my screen. Okay, alright, we can see everything good. +Okay, so good afternoon, everyone. My name is Haran, I work for Solana +labs, and in this talk, I\'m going to give a brief introduction about +the new epoch rewarder proposal that we are discussing on the following +link as a CMD pull request. + +So here is some background information. We are experiencing a very long +block time at the epoch boundary, and the following table shows an +example of the timing for the blocktime around the epoch 400. We can see +that the highest number around for 90 percent of the validators are +mainnet for this particular block along the epoch boundary. It will take +around 38 seconds. + +Aaron, I believe you\'re not showing a presentation. You\'re just +showing your code right now. Okay, we see Visual Studio codeum instead +of seeing the PDF. Okay, let me reshare it again. How about that? Can +you see it now? Sorry about that. + +So let\'s go back. So basically, we are having a very long Epoch time at +the epoch boundary, and at this long time is because of paying out the +rewards at the pocket boundary blocks. So the more stake accounts we +have, the longer it will take, so the current approach won\'t be +scalable. That\'s why we are proposing a change to pay out the epocket +rewards. So instead of paying out the rewards at just one block at the +poker boundary, the new proposal is to spread out the rewarded +distribution over multiple blocks, and the new approach was divided at +the block distribution into two phases. The first one is the reward +calculation phase that basically is calculated the rewards are going to +be paid out during the epoch. After the reward calculation phase, then +there is going to be another phase called the rewarded distribution +phase in this phase actual reward will be credited to the stake +accounts. + +So as I mentioned earlier reward calculation is just computed the +rewards to be distributed and based on the timing we have seen before, +so we think that 40 seconds may be a good time for the reward +calculation period given that each block is 400 milliseconds so we +estimate that it\'s going to take a thousand blocks for the reward +calculation result to be available, and the reward calculation is done +by a background Services data services started Epoch boundary and the +last for a thousand blocks to compute the rewarded results for +validators which are faster they may finish the computation before a +thousand block height if that\'s the case then the validator would need +to Cache The result and make it available until the Thousand blocks and +for some reason for some validator which are slow then they will have to +wait at the thousand block height for the result to be available before +they can enter into the next phase a reward distribution phase. + +So following the reward calculation is a reward distribution similarly +rewarded distribution were happens over M blocks and the two minimize +the impact of all the block and other transaction processing during the +rewarding period so we are targeting to reward basically earning 64. +accounts for every tick since each block has 64 ticks so that will give +us about 4K Total Rewards that can be distributed in one block and the +reward distribution what happens in the blog before any transaction +processing, and now since the reward with the new approach, the rewards +are not going to be distributed at one particular block, instead, it\'s +going to spread out between multiple blocks so in order to track the +progress of a rewarded distribution. There will be a two-system account +that are added to help to track the rewarded distribution. The first one +is the epoch rewarded history and then it is basically a 500 fixed-size +array to be consistent with the stake with the stake history we choose +that number to be 512, and it\'s a fixed-size array, and each entry in +the array contains three elements, three fields. The first one is the +total rewarding land port for the epoch, and the second one is how much +reward has already been distributed in import that\'s the progress, and +the other one, the last one, is the hash of all the rewards that are +going to be paid out. This is introduced to verify the rewarded +distribution. It\'s similar to the role of account hash, but it\'s more, +it\'s just like a more specific for rewards, it\'s only harsh from all +the rewards that are going to be paid out. + +The second Israel account to introduce is called Epoch reward Reserve. +As I mentioned earlier in rewarded distribution, for each block all the +rewards are going to be distributed in M blocks, so we introduced the +second set of systems. This is basically MCS verse that keeps tracks of +all the rewards that are going to be distributed in one block similarly, +it has a balance field that describes how much rewards are going to be +distributed for this particular block, and it also has a hash that\'s +the hash of all the rewards are going to be distributed in this block, +and since we have M system accounts, the address of the one particular +system icon for a particular block is basically determined by harsh the +base ID to the block height then we will get the unique address for the +rewards going to be distributed for again. + +As we\'ve seen earlier here, this is the rule hash, it\'s computed by +accumulating all the hashes from all the reserves together so after we +credit all the reserves credit order rewards from the reserves, we will +compare the hash against the rule hash, make sure they match each other +so that we can be sure that the reward distribution is correct. + +That\'s the main changes of the proposal, and there are a few +differences with the new reward scheme than the older one, and the first +one is that we were restricted the stake account access during rewarding +period, that means any withdrawal merge split stick or any statement +manipulation have to wait until the rewards finished, if any +transactions that involve those operations were submitted during the +reward paying out period they will get a transaction error, we will +introduce a new transaction error for it, let\'s lock the reward icon +during epoch reward, that\'s the first impact, the second impact is that +since now the rewards are going to be paid out in multiple blocks, there +will be changes for snapshot and the cluster restart during those reward +periods, so to accommodate this reward distribution over multiple blocks +so for any snapshot that is taken during the reward period we will +include a new field in a snapshot that\'s stores to store the reward +calculation result that\'s how much rewards are going to be distributed, +and when the cluster restarts from a snapshot taken during the reward +period, it will have to load the result and resume the rewarded +distribution process as if it is was going on before it restarted, yeah, +that\'s the overview of all the new proposals for the new rewards and +the more details can be found on this link as the pull request here, + +yeah, let\'s go into Q&A sessions if you have any. Well, if anybody +cannot talk, feel free to raise your hand, and I will give access to +your question, yeah, thank you for presenting this, um, I do remember a +brief discussion + +About this form in the Discord maybe three or four or five months ago, +and I do remember asking this question, so I\'m sorry if it\'s being +reproduced here, but there are some dashboards that read rewards to be +able to, you know, provide information to end-users about rewards across +the entirety of Solana, and up to this point, it\'s fairly easy to do, +you just look at the first block of the first successful block of an +Epoch, and you get all the rewards there. How would a mechanism like +that work in this new system? + +Would you have to be constantly watching for rewards blocks and sort of, +you know, building up that information incrementally, or will there be +some point where it\'ll be obvious that it\'s done and you can do one +query to an RPC server to get all the information? But if you just care +about the total number of rewards, I think you can still do it at the +first block of the Epoch boundary. I can address a little bit of this, +um, since the rewards slot or blocks are gonna be paid out, are you +gonna be deterministic, you\'re actually going to be able to generate a +query based on which um stake account or validator you want to know the +rewards for, so we can actually make RPC queries that function the same, +it will need some extension but it\'ll be slightly different from what +we have today per validator and have to make like 2,000 queries or +something, is that what you\'re saying? + +I mean, you can just query all of the blocks in that case, like if you +need to do a large range of rewards you just get the entire payout or +distribution block range for the slots, they\'re basically, I gotta get +blocks with a limit call with whatever the um duration of the +distribution has been reached when all the distribution is completed, +and then make that call, is that what you\'re suggesting? Yeah, today, +right, yeah, yeah, you know, it\'s, it\'s over by the thousandth block +after the epoch, so you can just make the call right there instead, +right, so today, where you just know that it\'s, you know, the first +block in the epoch, now it\'s going to be, you know, the thousandth +block, or however many blocks before, I don\'t think any of this is +fully parametrized yet, okay, and so well, so someone would have to have +sort of code that understands that to be able to compute what that block +would be, or there\'ll be an RPC call to ask that at some point, it +like, is that how you anticipate it going? + +Yeah, basically, it\'ll depend on how much complexity there ends up +being in the final thing. I don\'t anticipate it being that difficult, +this could probably be like an RPC helper versus an actual RPC endpoint, +but I think it\'ll be fairly trivial to put together a way to +equivalently get, I mean admittedly, it\'s going to be a little heavier +because you have to get multiple blocks, right, but okay, and I do have +another question, but I don\'t want to monopolize this, so I\'ll wait to +see if other people have a question first, all right, next question on +the answer is was Jeff, so go ahead, Jeffy should be able to unmute to +ask your question. + +Just wanted to ask if there\'s a cluster we started in the first +thousand blocks, is there any change to change that procedure, because +the snapshot won\'t have the result in it, yeah, we have a talk about +this, so in that case when the snapshot is taken during the reward +computation phase, the snapshot has to wait, it has to wait until the +result is available and store the result there, okay, zans, you\'re +welcome to ask your question, okay, so, is it the case that validators +will only validate a block if the validator, the leader producing that +block has the appropriate amount of either computation work or rewards +pair at work in that block, or is it the case that a validator can just +sort of like decide not to do it on their block and be like, I\'ve +modified the code to not do this because I don\'t want to burn the CPU +on this and it doesn\'t give me any rewards, so I\'m just not going to +do it, or is that even a possibility, or is it the case the cluster +won\'t even accept a block unless it includes these details because +they\'re expected for I mean they\'re sort of built into the protocol +that this has to happen in this order. Because the order is +deterministic for the current Epoch, there will be some randomness +across different epochs, so if the leader. For example it doesn\'t +matter whether he\'s a leader or not, in fact, if the validator doesn\'t +include the expected set of rewards in the block, I think the harsh were +mismatched, and his block will be rejected, okay, so this part of the +block does go into the hash, so that validators have to agree on it to +vote on it, so I guess that answers my question, and we just kind of +accept that the first and leaders kind of have to do his work without +any compensation, that\'s just kind of like built into the protocol, +there\'s no, you know, need to add any compensation for doing this work, +it\'s not expected to impact the transactions that could be fit into a +block, like it doesn\'t take up extra block space or extra compute time +that could prevent a validator from including as many transactions as it +would, otherwise it\'s the same problem as we have right now with only +one, whatever that first leader or like whatever that first block is, +kind of gets screwed on including transactions because everyone is +Computing this, so you\'d have this is just spreading out the +computation to make it more feasible. + +I was just wondering if there\'s an opportunity to sort of like make +that even more addressed by sort of paying a validator for having to do +this, just putting it out there, um, it samples a thousand slots, right, +so it kind of spreads the workout out of everyone, you\'d be kind of +paying everyone equally, which means there\'s no up except the dudes +that are unfortunate and only get one block in the first you know about, +well whatever it takes, like that\'s cool, all right, is there any other +questions about this, the epoch reward changes, okay, cool, so this is a +Cindy still, it\'s a I put the link in the chat for everyone to add to +the discussion later, um, 7015, um, you\'re welcome to discuss it for +the next rest of the time on this call, I\'d like to open the floor for +anybody that has just general Q&A questions, just feel free to raise +your hand and I\'ll give you access to speak and you can ask your +question, if there\'s nobody with questions, we can end this early, so +I\'ll give it a few more moments, did you guys have a, you know, +third-year anniversary party or anything like that? + +Thank you, everyone, for joining today, um, there will be a space +afterward that if anybody has any questions or that they don\'t ask +here, welcome to join, so be on Twitter, you can see it on Solana and +underscore devs, and we\'ll happy to chat there as well, thank you, guys +today. diff --git a/agenda/agenda_5.md b/agenda/agenda_5.md index ecc783b..93aebd5 100644 --- a/agenda/agenda_5.md +++ b/agenda/agenda_5.md @@ -1,9 +1,326 @@ -Meeting Info +# **[AGENDA 5]{.underline}** [**[Core Community Call - April 21, 2023 -]{.underline}** **[QUIC, Syscall for Restart Slots]{.underline}**](https://www.youtube.com/watch?v=AEnkivbha0k&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=6) -April 17, 2023 18:00 UTC -Duration: 30 minutes -Zoom: To be shared in the #core-community-call channel on Solana Tech Discord -Agenda +- Time: April 21, 2023 -- Retroactive proposal for QUIC connection handling in TPU -- [SIMD-0047](https://github.com/solana-foundation/solana-improvement-documents/pull/47) Syscall to get the last restart slot \ No newline at end of file +- Link Video: + > [[https://www.youtube.com/watch?v=AEnkivbha0k&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=6]{.underline}](https://www.youtube.com/watch?v=AEnkivbha0k&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=6) + +```{=html} + +``` +- **Speakers profiles** + +```{=html} + +``` +- Max from Mango: + > [[https://twitter.com/m_schneider]{.underline}](https://twitter.com/m_schneider) + +```{=html} + +``` +- **Key concepts mentioned:** + +```{=html} + +``` +- **Syscall to get the last restart slot + > [[https://github.com/solana-foundation/]{.underline}](https://github.com/solana-foundation/).. + > .** + +- **QUIC Tuning Parameters** + +Welcome to this month\'s core Community Call. I have posted the agenda +in the chat. So, Max from Mango will be presenting on the Simds 46th or +on the new Cisfar for the last vote. Last voted on the slot, and then +he\'ll also want to talk about how quickly the different tuning +parameters were chosen for Quick. And Max just joined. I will promote +you as a panelist. Go ahead, Max. Sorry for being late. + +So, the floor is yours, Max. You can go ahead and get started with +whichever one you want to start with---either the quick tuning +parameters or your CMD that you\'ve been working on. For the quick +tuning parameters, the thing that was, like, my request, which I was +hoping for, was that we have someone who worked on it. You know, lead +the discussion. I don\'t know if someone is here that worked on it, and +I can at least give the outside perspective of reverse engineering some +of those things. But, you know, reverse engineering requirements is very +difficult sometimes. And that was the main request, that we get someone +who knows all the requirements, maybe to present them. If there\'s no +one here, then maybe we put it for next time. + +Could you talk a little bit about how y\'all chose the tuning for Quick? +I can talk a little bit. We had a somewhat specific performance idea in +mind. We wanted it to be in that 50 to 100K TPS (transactions per +second) range in the front end or, like, at most at 100K TPS. So, we +tried to split the streams that way and allow enough streams for each +client to be able to fit within that. So our approach was mainly from +benchmarking in the test environment and seeing what bandwidth we could +obtain under a somewhat optimal connection---like the worst-case TPS in +the real validator---and trying to calibrate that to what we thought the +back end behind Quick could sustain or handle. Also, we had to consider +keeping the memory within something that was feasible for a normal +validator. Obviously, if you have more streams, you need to have more +memory to hold all the packets that are kind of in flight and +potentially reconstruct a transaction that might cross multiple packets +and things. + +So, the more outstanding streams you allow, the more memory you need to +frame all those incoming streams. You have one limit we found, and we +were curious about it. I think it\'s like 2,000 transactions every 50 +milliseconds, like a leaky bucket model. That would mean that\'s just to +verify, concentrate. I mean, I think we were talking about it in +Discord, right? That\'s not like a hard limit. The 50 milliseconds is +kind of a target for that stage. It\'s spending time in +\'instigverify,\' and things are coming in behind it, right into the +channel, to get backed up. So, we want to make sure that we\'re pinging +the channel pretty frequently, like within 100 milliseconds, to ensure +that the channel can\'t back up faster than the incoming packet flow. + +So, I mean, it doesn\'t have a hard requirement. Like, if you have a +machine that can basically verify 10,000 transactions in 50 +milliseconds, it will clear all of those, and it will bring up the new +batch, and it will verify it. But it\'s just a way to keep the queue +from doing an exponential fill up. Right, if you have a large batch and +you let it fill in behind you, and that\'s even larger than the next +batch, then you\'re just, you know, like an unbounded condition, and +that\'s not good for the memory in the Valter. So, there are a couple of +different solutions to that, but, you know, we didn\'t like the +boundedChannel solution because you can\'t really have good visibility +into the channel. You can\'t really drop intelligently inside the +channel. So, we felt like it was better to just pull everything out of +the channel, and we have that kind of, you know, the db random thing for +like if we\'re getting an extreme amount of packets that we really +don\'t have time to look at really anything in the packet list at all. +But if we\'re in a less extreme scenario where the machine can handle +the flow, you know, we do like a round-robin between senders, kind of +dropping, but that algorithm can\'t handle some cases where we have to +handle the case of a really wide pipe coming in and a very small amount +of compute and then a very narrow pipe coming in a large amount of +compute, right? So, all those variables can be different between across +machines. So, trying to handle any kind of configuration, I guess, makes +sense. I think this limit is a bit surprising, right? Because, at least +for us, it was a bit surprising. + +There\'s another one I think it\'s the receive window size that we +discussed a few times, and I think the idea that was, like, you have +basically based on the stake, different receive window sizes, which +limits the number of parallel streams there can be per connection. It\'s +like eight connections per identity, and then I think there\'s some, +depending on the stake, each connection can have a certain number of +streams. The eight connections are just to kind of, if you had clients +behind a router or you had a race condition where you got disconnected +and you needed to reconnect, you might have, you know, some connections +overlapping, so just not to kick you out immediately if you had a stale +connection in the connection pool. + +But we\'re using the streams to throttle based on stake, and then, of +course, a budget for unstaked as well, and those are subject to +tweaking, I think. We wanted to roll out the first version and then see, +kind of, you know, monitor the metrics and then update them potentially +as we see, you know, the use in the validator. I don\'t think they\'re, +I mean, they seem to have been fairly reasonable defaults but open to +tweaking, I think. For the just a question for any of the people from +the fire dancer team, I know that you all have been working on it quick. +Did y\'all choose similar like received window parameters in tuning, or +have you all not gotten to that part yet? I don\'t think Nick is on this +call; he\'d be the best person to answer it. Let me go see if I can find +Nick. Okay, thank you. I think he\'s on vacation today. Oh, then I +probably won\'t be finding Nick. I don\'t have the answer to that off +the top of my head. Okay, maybe probably we probably should sync as we +go further into the implementation of like what are the different +parameters that we have seen because in the future I think as Steven, as +you said, it was a good default to start with, but what is better +performance in the long run would be nice. So a question that charges +real fast about the state-based variables, right? So, Morse, you have +more stake generally gets more bandwidth and more resources, and you +know, say of transactions into the value, so that\'s the idea, which is +really cool and like a novel, it\'s like a Solana Innovation, you know, +you\'ve seen that before. As Antipsy, did you have a question on this? I +just wanted to expand a little bit on that. Is it because the larger +stake is assumed to have larger pipes, or is it because larger stake +actually sort of does more in some way that requires different +variables? And the only reason I ask is that if it\'s because larger +stake is assumed as a proxy for larger pipes, then maybe it would be +better to have larger pipes actually be something that one could specify +on the command line or something. You could say how much bandwidth you +expect to be able to utilize, and then smaller validators can do more if +they\'re able to, and larger validators could do less if they\'re, you +know, it doesn\'t if that makes sense. Did I come through there? It\'s +not necessarily a hardware thing, although more higher state validators +should have more, you know, hardware, more resources, I guess, and more +hardware to handle a higher load---10 gigabits, but maybe JP has 100 +gigabits or something, so I don\'t know if they may have more or less +stake than I have. So I was just wondering if you know if that\'s stake +is assumed as a proxy for bandwidth or if it\'s something else that +causes these variables to need to be different. Standard proxy, it\'s +just that stake is really the only, you know, civil-resistant identifier +that we have in the network right to determine how much us resources and +things that you should be in control of essentially, like how much block +space right should you have. I mean, I would say, you know, those +overall bandwidths could be like a scaling like if the validator had +customized hooks for scaling the overall numbers right, you could do +that right. So you would have like let\'s say the value has you know +100,000 connections now or outstanding streams maybe if you had a 10 GB +or 100 GB you would want to make it like you know 10,000 or something +but you would still like to distribute those streams across the stake. + +That\'s kind of what I\'m saying. If there\'s any opportunity for a +protocol to custom-tune their numbers in ways that better match their +actual configuration, regardless of their stake, that\'s kind of what I +was getting at. There isn\'t today in terms of a command line flag or +anything, but that potentially could be added if it seemed to be a +limiter or helpful. + +In the interest of time, we probably should move on to this MD that you +wanted to talk to, Max. So, if you want to go ahead and chat about that, +we can get it started there. + +\"Okay, let\'s open this file. This is the newest one we wanted to +propose. Basically, the motivation here is, on a high level, what do D5 +protocols do when the cluster restarts? I think some protocols have been +built in with certain slot limits for orders or things like that. But +especially in lending protocols, there\'s a lot of \'first-come, +first-serve.\' Basically, when the network starts up, we need to assess +that not necessarily all RPC nodes are already at the right state. Like, +that\'s something we\'ve seen before, is that sometimes a lot of things +will not work on a coordinated restart. So the idea here is, well, right +now, it is just a little bit random and uncontrolled how things behave. +We can expose to the application developer that there was a controlled +restart. So this is currently the last hard time for Hard Fork on the +bank in the reference client. So this is basically just a very simple +system variable that allows you to access that data and then implement +custom logic. Maybe you want to lock down liquidations for another 100 +slots until the oracles have time to update, etc. Could be that the +chain was in a very different state or the prices of certain assets were +in a very different state before the restart occurred. So this is kind +of like just more programmability. The proposal goes into detail what +exactly we want to expose, and I think there was some feedback already +that this would also be a good mechanism to maybe actually expose other +things. So just curious, you know, before we touch it and create an +implementation, if there are other data needed than just the slot, it +would be good to add it now to the proposal. So we\'re kind of on the +one pass over it, and it\'s everything we need.\" + +\"I think that\'s a question in the chat for you, Max. The question is +if the protocol allowed validators to stop the slot timestamp at the +current time on the restart instead of having to catch up gradually, +would that be another solution?\" + +\"Oh, so I did some analysis on how the timestamp works right now in the +last restart. I\'m trying to find it, but I\'ll post the data later. But +basically, you have the restart slot, and then usually it\'s a few more +slots to go, and only once those votes come in, actually, the cluster +time gets updated. So I think around three slots after restart, you\'ll +actually have a correct cluster time or a somewhat updated plus the +time. So suddenly, you\'ll have jumps from before the restart to after +the restart. But these are the things that are kind of like can cause +actual issues in protocols, right? A lot of times, the cluster time is +supposed to move fairly connected to each other, but in those moments, +it doesn\'t. There\'s a real disconnect there for a few slots, and then +transactions usually start piling in around that time as well, as the +cluster time starts moving again due to user transactions, not both +transactions.\" + +\"You know, I think this is just one of the effects that we\'re seeing, +right? So that\'s the one you\'re describing. This is like one of the +symptoms that we can circumvent with this measure. But I think, in +general, this information is a little bit more rich. Right now, I think +there were some ideas about lending protocols blocking liquidations and +allowing people to deposit more collateral, kind of like a margin call +scenario where you have at least two minutes to top up your balance +because there\'s a freaking cluster restart. You know, it\'s not +happening every day, and it\'s maybe not the user\'s fault that they +couldn\'t manage their position. I think that was like one of the main +concerns why we wanted to be as configurable as possible and as exposed +as possible to the application developer, rather than just fixing just +one particular issue about cluster time.\" + +\"Okay, cool. So if anybody has any questions, they can voice them now. +If not, there\'s also a link to the PR for the Sunday in the chat, so +that if you can\'t get to it here, we can do the discussion on the Cindy +as well. I\'ll ask some time for anybody that has any questions for this +excellent idea from proper runtime developments.\" + +\"Two things: one is terminology. I think it\'s also written in the +comments that restarts, slots, and halves are two different things. So a +hard fork would be a scenario in which a part of the cluster on purpose +tries to diverge from the rest and make up their own cluster +essentially, which is probably not meant to be. The other thing is that +we are trying to move away from Cisco specifically, and we will be using +or completely replacing them by fit and programs in the future for all +the things which actually do compute anything. But in this case, this is +just a lookup of some global value without any computation behind it. So +it should probably go into a system variable, and I can\'t say what the +JP scene is going to do, but in our implementation, we feed all the +switches with system variables anyway. So that would only be like a +trivial identity function, which is kind of useless in that sense. Just +saying, probably easier to start off with this voice and think about +what else you want to put in there. Anyone has proposals for what else +to put in?\" + +\"Well, here, I think if no one has any other proposals, we can end +here. We can continue the discussion on the Cindy, though. You have a +question? Go ahead.\" + +\"Is there ever a value in knowing more than the last restart? Like, say +there were two restarts within, I don\'t know, two hours because there +was some problem that recurred. Would that be useful to know, or is it +always only the last restart that is useful to know? In other words, +does it need to be a single value, or do you want it to be some like a +set of n values that end most recent restarts?\" + +\"I think I would rather see what adoption looks like on the single +value and then go from there. Having a new feature, a historic value, I +find it hard to reason about historic values. Well, but I mean, in +particular, you\'re identifying a use case that you believe covers +something that\'s important to you. + +I\'m asking you if you had two restarts that happened within four hours, +would that change what you would want to know or not? No, probably not, +but I think you want to get back to normal operation as quickly as +possible. And I think that the delays, probably within 100 slots for +most applications, so as far as the time frame is concerned, are just +very, very short. I wouldn\'t know what four hours ago, another restart +would change on the current situation, right? So, of course, +unfortunately, okay, thank you. That doesn\'t answer my question, thank +you. + +I had a follow-up for Alex. You mentioned that the current hard Fork +slot is currently synonymous for a restart, but there are other ways to +trigger a restart, but there\'s no consensus stage shared about those +resources, right? Or is there another way to get those? It\'s a kind of +the other problem, the security issue. How are you gonna reach consensus +about the researchers, right? But I was really talking just about the +terminology that a hard Fork means that you are diverging on purpose +because part of the cluster wants to do something else, and otherwise, +it\'s just a fork like any other fork that will get removed at some +point. It\'s a slow block, right? + +Basically, so I think the differentiation between a slow block and the +restart is probably not so\... on an application, it doesn\'t really +make a difference, right? If you have a one-hour small block or you have +a hard fork, it\'s probably the same. If it took like an hour to +organize that or 24 hours, so what I mean, there\'s no like terminology +called this or anything, but if people, for example, say like Bitcoin +and Bitcoin Gold, these are hard forks, well, like what they did one +there back in the day because the community actually switches to an +entirely different protocol version in the restart slide. And this is +not\... I mean, this is obviously depends on the exact reset scenario, +but if you are just relearning the same version again, always only minor +black faces and all that, we are on the same thing, then this is not +really hard for because it\'s not\... you\'re not off from anything +else. + +But like what people understand on that term, a hard fork means that +then there are two blockages and two sets of validators and two +networks, essentially, which do a different phase. And I mean, usually, +there is that tries to avoid that scenario of hard forking and instead +come back to one consensus of global networking. + +All right, interesting. Coming in sometime because we are one minute +overtime. Let\'s bring this discussion further into the CMD. I will post +it again in the chat, and then we can further the discussion on this +specific MD for 47 with Max and Alexander and more. But thank you all +for coming on today on this month\'s core Community call. Thanks for +watching us, Jacob. diff --git a/agenda/agenda_6.md b/agenda/agenda_6.md index 6fd4bab..800cbe2 100644 --- a/agenda/agenda_6.md +++ b/agenda/agenda_6.md @@ -1,8 +1,337 @@ -**Meeting Info** -- May 19, 2023 18:00 UTC -- Duration: 30 minutes -- Zoom: To be shared in the #core-community-call channel on Solana Tech Discord +# **[AGENDA 6 [Core Community Call - May 19, 2023 - Optimistic Cluster Restart Automation](https://www.youtube.com/watch?v=GA5AVg_svj8&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=5)]{.underline}** -**Agenda** +- Time: May 19, 2023 -- [SIMD-0046](https://github.com/solana-foundation/solana-improvement-documents/pull/46) Optimistic cluster restart automation +- Link Video: + > [[https://www.youtube.com/watch?v=GA5AVg_svj8&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=5]{.underline}](https://www.youtube.com/watch?v=GA5AVg_svj8&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=5) + +```{=html} + +``` +- **Speakers profiles** + +> **Will:** Mentioned at the beginning of the text, Will is going to +> talk about the upcoming release changes. +> +> **Wen:** Wen is part of Solana Labs since last September and is +> working on consensus. + +- **Key concepts mentioned:** + +```{=html} + +``` +- **Optimistic Cluster Restart Automation -** + > [[https://github.com/solana-foundation/]{.underline}](https://github.com/solana-foundation/).. + > . + +Welcome, everyone, to this month\'s core Community call. There are a +couple of things on the agenda. So, the first thing that we\'re going to +hear from Will, before you, Will, will be about the upcoming release +changes that they have or that they\'re pushing. And then, we\'ll hear +from Wen on 7046. + +Before I get started, I wanted to first call out that if you ever want +to see the agenda for the meeting, you can always go to the core +Community call repo, which I just linked in the chat. And then, there +are two PRs that would be or are getting close to consensus on. So, +it\'d be great if people could find time to give their review on them. +The first one is PR #33, which is the timely vote credits. And then, the +previous one, which we actually already merged in, but would love to +have any extra eyes on it, would be PR #15, which is partition Epoch +Rewards. + +Go ahead, well, you can go and see your spiel real quick. Thanks. So, as +you probably all know, the upgrade of mainnet to 11417 is underway. We +asked for 25 at the beginning of this week, and we\'re currently at 27. +Thank you; we appreciate the overachievement there. Everything\'s +looking good. Our plan is to ask for general adoption at the start of +next week. So you can anticipate that request in case anyone hasn\'t +seen it yet. I would encourage you to read the outage report from the +February outage. At the time, it was widely believed that the outage was +caused by the 114 upgrade. That was definitely not the case. I\'ll drop +a link to that report in just a moment in the chat here. It\'s also +linked in the MB announcements channel on Discord. + +We also have some audit reports that we\'ll be publishing later today +related to 114. Feel free to peruse those. There\'s nothing scary in +them. If there were, we wouldn\'t be shipping the release. But you know, +I might give you some peace of mind and some interesting reading. So, +thanks to everyone who\'s already upgraded, and looking forward to +getting the rest of the questions on 114 soon. + +All right, Wen, you\'re up. Oh, okay, let\'s share my slides first, and +I can present my slide show and share screens. Sorry, what I should +explain\... Oh my, so hello, and to those who I haven\'t met yet, I\'m +Wen, joined Solana Labs last September. And personally, I\'m working on +consensus, and I\'m interested in high-performance and high-reliability +system design. + +So, how come I don\'t see my slides to share? Oops, no, sorry. Why +don\'t I have my slides to share? I have it previously, and let me do it +again. Sorry for wasting time. I don\'t see my slides to share. I can +share my whole screen. Maybe that\'ll work. Okay, do you see the slide +now? Yep. + +Motivation Requirements. Okay, sounds good. So, motivation and +requirements. We are interested in making Solana more reliable, of +course. So, for high reliability, there are many things you can do. +First of all, you can write very high-quality code. Then you have fewer +outages. But no code is ever perfect, so you need testing to improve it. +But testing couldn\'t catch all problems, so you need monitoring to tell +you what problems you have and when. + +Monitoring tells you there is a big outage; you kind of need outage +handling to get the cluster back to the same state. So, there are a lot +of efforts inside Solana to improve code quality, testing, monitoring, +and other stuff, and auditing and formal verification. And today, the +proposal is only about outage handling. + +So, first of all, let\'s look at how we handle outages now. When I\'m +talking about outages, I\'m talking about the last outage where the +whole cluster just couldn\'t make progress anymore, not making progress. +And somehow, what we needed to do is, we need to restart validators, +keep them saying a start state to start with so the cluster can continue +functioning again. So, this is called cluster restart, which I have a +link here. It\'s very different from sporadic single validator restart, +which happens all the time and that doesn\'t impact reliability at all +normally because you still have a lot of validators functioning. + +So, what we do now, first of all, we would try to find the highest +optimistically confirmed block. Optimistically confirmed means you have +a block which got the votes from the majority of the validators. We use +two-thirds here. So when the block is optimistically confirmed, ideally, +we shouldn\'t roll it back because it may contain user transactions. If +you roll it back, it will have economic impacts, very big economic +impacts. + +So the whole design goal in this proposal is to try not to roll back +optimistically confirmed blocks if possible. So, in reality, today, we +also try to do the same. But since today we don\'t really have an +autonomous process to do this, today we use what\'s called social +consensus. So when there is an outage and people gather in the Discord +Channel, they would first confirm, \"Yes, there is an outage. All the +validators are not making progress.\" Then, they\'ll try to decide to go +for a restart because the cluster doesn\'t seem to be recovering. Then, +they\'ll try to see where to restart. + +So, we need to have one block which everyone restarts from. And to make +sure we\'re not rolling back user transactions, we need to find this +highest optimistically confirmed block where we agree we will start. And +what we do now is we would normally do a consensus or like voting in the +Discord channel, say, \"My local confirmed block is X, and what do you +see?\" So if most people vote for X, then go with X. So that\'s how we +do it now. + +And after that, after we decide which block to start from, the validator +monitors with operators would stop the validator, and sometimes if +there\'s a bug that could lead to an outage again, then we might install +a new binary. But that doesn\'t happen very often. And next, because we +decided we need to start from this block, so everyone needs to have the +same block. So you would create a snapshot with a hard fork at this +block we decided on. And if you don\'t have that block locally, you +would download it from a trusted source. + +And after that, you would restart validators with the following +arguments. Two arguments: one is \"wait for a supermajority to add slot +X,\" and the next is \"I think the bank hash at this slot is blah.\" So +this makes sure you restart with the correct snapshot, you have the +correct block and correct hash. And then, you would wait for 80 percent +of the people to reach the same state as you. Then the whole cluster +begins to function. You start to make new blocks again, and you start to +vote, and all things go to normal. + +So, there are a lot of problems with this current restart process. Maybe +the biggest problem is that it takes a long time. The whole cluster +restart takes about\... it could take about several hours, which would +make your reliability not very good. And so, in the future, we might +have other efforts to make it faster. + +Today, we\'re focused on solving a small problem, which is improving the +process of finding the highest confirmed block. It\'s quite challenging +for Han to manually review the votes of two thousand to three thousand +validators to determine the block. Thus, we aim to develop a protocol +that enables machines to automatically find the highest confirmed block +without Han\'s intervention. Here are the design goals: + +Avoid cross-part negatives: If a block was confirmed before the restart, +we should not discard it. Doing so would have severe consequences. + +Allow false positives: It\'s acceptable if some blocks are not confirmed +before the restart but are mistakenly considered confirmed. + +Let\'s consider a scenario with a 67% threshold. If a slot receives 66% +of the votes and no competing blocks exist, it\'s fine for 80% of the +validators in the restart to decide to start from there, even if it\'s +not yet confirmed. Confirming more is acceptable, but rolling back +confirmed blocks is not allowed. We\'ll prioritize avoiding false +negatives in all design choices, and false positives might be tolerated. + +The proposed approach involves incorporating a silent repair phase where +validators negotiate amongst themselves to determine the block they +should restart from. During this phase, no new blocks will be created, +and the aim is to converge quickly. All validators should stick to their +votes from before the restart; no changes are allowed. + +To achieve this, we\'ll use gossip to exchange most information during +the repair phase. To prevent interference between validators who have +restarted and those who haven\'t, we\'ll use a new shred version to form +separate gossip groups. Two new gossip messages will be sent: one +containing last-voted work slots and another to ensure everyone shares +the same metadata. This will ensure that all validators have the same +data and metadata by the end of the silent repair phase, allowing them +to make unanimous decisions and start from the same block. + +So, last-voted Fork slots is where we share the last vote before the +restart because the validators might be on different slots. Some people +vote faster, some people vote slower, so just one last vote slot is +normally not enough. So we would send nine hours of slots on the same +Fork so that people can\'t get the whole Fork, and people can get a +better view of the metadata. Also, after you repaired everything and you +have all the metadata, then you send out your new vote. We don\'t call +this vote to distinguish between a normal vote and this vote, so here we +call it the Fork, which is actually just a vote. So you send out after +all the repairs are done, and you have automated data where you think we +should restart from. And also, you also send out how many heaviest Forks +you received from other people because we need to decide when we would +exit this silent repair phase after we see that 80 percent of the peers +received this heaviest fourth message from 80 to people. We check that +and everyone agrees on the same block, same slot, and hash. If yes, then +we exit this phase and proceed to a real restart. So we do what we +currently do; otherwise, if anything happens that makes you count, +proceed, just stop, print all debugging information can intervene or +maybe switch back to the old restart method. How much time do I have? +I\'m probably a little bit slow. + +We have 11 minutes for both finishing questions, but we can see how far +we can get. Okay, that\'s fine. + +So you are welcome to read the slide. So, I\'m just going to generally +introduce the silent repair phase, and then we can proceed to questions. +So first of all, when you restart a validator with this new arg, +immediately we send the last voted pork slots, which is what you voted +last, and all the slots on this fork. And after that, everyone +aggregates the last voted work slots from all the other restarted +validators, and you could start repairing a slot if you think this slot +could potentially have been up and confirmed before the restart. And we +could draw a line somewhere to say these are the candidates who could +have been confirmed before the slot, and the other blocks I don\'t care. +So you repair all the blocks you care about, and after we repair all of +them, you aggregate all the last votes and the last voted work slots and +choose your hub habits for it. So I think we are at 20 minutes now. I +don\'t know whether I\'ve introduced the new method enough so everyone +has a good graph, but we could see if anyone has any questions at this +point. + +I can proceed if no one has questions. Does anybody have any questions +currently on the current approach, or should we just continue? Alright, +go ahead and continue then. + +When? Okay, so\... Exit the Silent Repair Phase. To exit a silent repair +phase, I think the most important thing in audit handling is to make +sure everyone is on the same page. Otherwise, if you think everyone\'s +on the same page, you single-handedly enter the restart and start making +new blocks, while everyone still is people repairing blocks. That would +be disastrous, and another audit might be happening. So, here we are +very careful when we exit the silent repair phase. We would count +whether enough people are ready for action. + +So the current check is whether 80% of the validators receive the +heaviest Fork response from 80% of people. So, we cut 80 here because +this is a current line we draw when we do a restart. We wait for 80% to +join the restart, and then we proceed. And also, even if we see that 80% +of people respond, we also linger for maybe two minutes because a gossip +message propagation takes time. So, linger for two minutes so that my +heaviest fork which contains how many responses I got\... Hence, +everyone can perform security checks. + +Check one is: Did everyone agree on the same block, which means the same +slot and the same hash? Also, whether there\'s a local optimistically +confirmed block before the restart, right? So because my local confirmed +block means before the restart, I saw two-thirds of the votes on this +block already. So, you would imagine this block should be on the +selected Fork. It should be the ancestor or it should be the selected +block. If it\'s not the case, then the security check fails because +something\'s wrong. My local confirmed block is getting rolled back, +then you would also exit and hold and wait for an inspection. And if +every check succeeds, then perform the current restart logic. We +probably will click clear the gossip CRDs table so that we don\'t carry +the old restart messages into the new environment, and then we would +automatically start snapshot creation. + +In contrast to what we\'re doing today, where we manually ask people to +manually do it using Ledger, here we might start earlier once we find +out everyone agrees on the same block. Then we exit and execute the same +logic we are doing now in this new discussion. + +So I have a few links, one is a Google doc. I started this proposal just +starting, so it contains many details and a lot of designs we rejected +and why. Because I\'m currently modifying both the SM Med draft and this +Google doc, so this Google doc might be outdated, and some design +choices might be different if that\'s the case. SMED is the newest +proposal, and the actual SMID draft is here as well. + +I also have some description here. Let me know if you have questions. Do +you have questions? Can you hear me? Yes, we can hear you. Yep, so +actually, I\'m from the Mango team, and we are currently implementing +SMD 47, which is like the last three-star slots. So, I\'m wondering if +this silent repair stage should be considered also a restart slot. +Sorry, I haven\'t checked that doc in detail, so I think your proposal, +correct me if I\'m wrong, your proposal is to expose the last restarted +slot somehow through Ledger, right? Exactly, so here I think it\'s +orthogonal, but once the silent repair phase is over, and we know where +we are restarting from, we could also connect to your code and expose +this information somewhere, right? Oh, exactly. So, when it\'s in the +silent repair phase, we don\'t know for sure it\'s a restart. They are +negotiating, but they don\'t know whether they can decide on the same +block. So in that case, I don\'t think we will expose anything, and once +that phase is over and we know we are really entering the restart, then +we can expose that restart slot. Did that answer the question? Okay, it +makes sense. There shouldn\'t actually be any changes to that proposal +because we\'re going, once we\'ve committed to restarting at the +coordinated restart slot, there\'s going to be a hard Fork anyway, and +we\'ll\... So that\'ll update this as far. Okay, that\'s cool. So when +it\'s in the silent repair phase, we don\'t know for sure it\'s a +restart. They are negotiating, but they don\'t know whether they can +decide on the same block. So in that case, I don\'t think we will expose +anything, and once that phase is over and we know we are really entering +the restart, then we can expose that restart slot. Did that answer the +question? Okay, it makes sense. There shouldn\'t actually be any changes +to that proposal because we\'re going once we\'ve committed to +restarting at the coordinated restart slot, there\'s going to be a hard +Fork anyway, and we\'ll\... So that\'ll update this as far. Okay, +that\'s cool. So that works nicely together. + +And any other questions? We have a question. I\... I muted you. Say yes, +so I just\... Can you hear me? Okay, yep, okay, sure. So as a validator +operator, I want to say it\'s very encouraging to see how much really +good thought design seems to have gone into what you\'re proposing here. +I predict that what would happen during another restart event is that +there would still be hiccups that will get alerting, and there\'ll be a +lot of confusion and talk. So, and if we\'re kind of racing some +automated process, just keep in mind that you may want controls there, +as certainly messaging from the validator to sort of let us be very +aware of what\'s going on so that we can make decisions about oh, you +know, because if someone believes that there\'s a bug or a reason that +the restart shouldn\'t proceed, allowing something to run away with a +whole cluster restart that we want to pause. Just having controls and +informational messages to help us understand what\'s happening are very +important. I just want to emphasize that, that\'s all. + +Yes, I think maybe later there will be\... I would try to get more +feedback from The Operators because this really impacts how you operate +during an outage, right? So it helps to get more feedback there. So I +think first of all, I totally agree, and the current approach is opt-in. +If you don\'t restart your battery data with that flag, nothing would +happen. We would keep the current approach if you feel more comfortable +with that, and also, of course, the outage handling is mostly to assist +people; it\'s not to replace people. + +And we\'ll also, of course, give you ways to inspect what\'s happening +inside and ways to decide, \"No, this automatic restart is not working; +I should do something else." That\'s totally doable. It will be all +command-line controlled. Does that answer the question? Yes, it did. If +there\'s anybody else that wants to ask further questions on this in +SMID, I posted in the chat, we can take the discussion there. And thank +you all for joining another Core Community call. You all have a good +month. Thanks. diff --git a/agenda/agenda_7.md b/agenda/agenda_7.md index fd6f5e5..7a95e3e 100644 --- a/agenda/agenda_7.md +++ b/agenda/agenda_7.md @@ -1,8 +1,376 @@ -**Meeting Info** -- June 16, 2023 18:00 UTC -- Duration: 30 minutes -- Zoom: To be shared in the #core-community-call channel on Solana Tech Discord +# **[GENDA 7 [Core Community Call - June 16, 2023 - Light Clients](https://www.youtube.com/watch?v=9m_M8zEw1cE&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=7)]{.underline}** -**Agenda** +- Time: June 16, 2023 -- [SIMD 0052](https://github.com/solana-foundation/solana-improvement-documents/pull/52) +- Video: + > [[https://www.youtube.com/watch?v=9m_M8zEw1cE&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=7]{.underline}](https://www.youtube.com/watch?v=9m_M8zEw1cE&list=PLilwLeBwGuK7e_mH_sFwTytYQxalh7xd5&index=7) + +- **Speakers profiles** + +```{=html} + +``` +- [[https://www.tinydancer.io/]{.underline}](https://www.tinydancer.io/) + > (Tiny Dance) + +```{=html} + +``` +- **Key concepts mentioned:** + +```{=html} + +``` +- SIMD-0052: Add Transaction Proof and Block Merkle for Light + > Clients - + > [[https://github.com/solana-foundation/...]{.underline}](https://github.com/solana-foundation/%E2%80%A6) + +Welcome, everyone, to this month\'s Core Community call. Today, we have +for discussion light clients, and we have the Tiny Dancer team, Anoushk +and Hirsch, talking about different ways that they have been thinking +about implementing it. The agenda can be found, as usual, on the Core +Community call repository, and the specific Cindy is 52, which I have +just added to the chat. Anoushk, you\'re welcome to take it away. + +Thanks for the intro, Jacob. Let me just share my screen. Thanks, +everyone, for joining in and giving your time. I\'m Anoushk from the +Tiny Dance team, and we\'ve been working on implementing the flight plan +for Solana. It\'s draft 7052 for adding transaction proof verification. +So today, we\'re going to give a brief overview of our research. + +So, I\'d like to start with why we\'re doing this, the motivation behind +assembly is primarily to implement light plans for Solana. The reason we +need light plans is that users need to verify queries that they make to +the RPC, and right now, they cannot do that, which is why they have to +trust the RPC that they give them the correct, you know, these like +lines need to be low Hardware pieces of software, and they need to be +able to run on a phone or browser. So, this is really important for +security for the blockchain Network, as we already know, more mature +networks like Ethereum that have been there for longer already have +tight lines, and this was a glaring problem in Solana. So, the crux of +this MD is adding something called transaction proof. So, on a high +level, it\'s just a multi-proof saying that from your transaction that +you sent, was included in the block and it succeeded or failed, however, +it should have. It did like awe the change that we\'re making here +requires adding requires some way of making sure that a particular +signature and a status, whether it\'s success or failure, was included +in that transaction in the block. The user needs to be able to verify +the inclusion of the transaction and the execution status. We would also +add an RPC method that would allow anyone to just call that method and +get its proof for the particular transaction. So, as I mentioned, for +the reason that we need this is that RPCs could give you incorrect +information that the transaction actually succeeded or it was included +in the blog, but it actually did and that\'s an attacker. You can still +verify this data if you have a snapshot, but obviously snapshots are, +you know, 30, 40 gigabits. + +And that\'s a lot of data for the empty user. Also, relating to a +different simile about stakewade attestations, you can actually use +transaction proofs to verify that a particular value that has a certain +stake off-chain, as mentioned in the SPV proposal, a validator could +technically use reduced transaction proofs to use them as a checkpoint +to verify a certain state and as part of a different proposal that uses +SPV, it can also be used for interchange verification. Here\'s a list of +important resources that you could take a look at. This is the CMD that +we wrote, DSP proposal. There\'s an open issue that talks about adding +statuses to the bank cache, and that\'s the interchange and SBP +proposal. So, this is the part that we really there\'s been a lot of +discussion on and we think that there needs to be more con-like more +discussion on from different parts of the code of the community on +different ways to implement it in our CMD right now. + +We are really implementing the first way, which is modifying the block +has to include statuses, but over the last week after discussing with +some members of the jp team and other members of Surround Labs, we also +found different ways to implement it to tackle different issues that may +arise while implementing the first method. So, I\'m gonna dive into each +of these very beautifully. So, modifying the block hash is pretty +straightforward and again part of the history proposal. So, all it does +is you add the transaction status along with the transaction signature +into the Merkle tree of the transactions, which is part of each entry, +and that gets hashed into that gets mobilized into the block hash and +becomes part of the bank cache. Currently, the bank cache is a +sequential hash of all the entries, but making it a virtuality would be +better in terms of verification size, and obviously having the status is +important for verifying if the transaction actually succeeded. Here\'s a +quick overview of the pros and cons. So, the pros being that on the +client side, the verification is less computationally heavy, so that\'s +good for low Hardware devices, and it\'s part of the core consensus +protocol, which means that all validators have to write it, you know, +overall or with. The downside of this being that it\'s quite a major +string general require-like feature flag activation, which means that +the round trip from implementing this to actually going live on Mainnet +would be quite long, and also there is a computational overhead of +memorializing entries that was initially taken into account. + +Moving on to the second method, which is adding a separate transaction +tree, which would basically be a tree of all the receipts of each +transaction. This would be part of the bank hash, so basically just a +tree or a monkey tree of all these interaction signatures and statuses, +and would just be hashed into the bank cache. The pros of this are +mainly that it doesn\'t come the way of planting seeders, so a leader +could basically just create the entries, create the block, propagate the +block, and then asynchronously update this data bank cache with the +statuses, so they don\'t need to have it before propagating the block. +Again, this is also a major change, so comes with the challenges of the +first way to implement it, and so this is part of the second method, +which is we were told that implementing changing the bank hash would +somehow come in the way of backless leaders. So if we implement this, +which basically have the state of block n in block n plus 10, you +actually don\'t need to execute the transactions of log n to get the +statuses and then know you have to compute the bank cache, so you could +just do that in an async way. But this also would be a pretty major +change protocol, and that is also something that needs to be heavily +considered if you\'re deciding to go over this. The last one is probably +the most flexible and easy to work with because we are not really +changing any core part of the validator like the consensus. So we are +just using gossip or could be a different network. + +We are even to asynchronously push commercial commitment of all the +transaction receipts, and this could be done, let\'s say every 10 blocks +or so, so you know, it\'s not even doing it every block. And you could +then have validators that pull this change, website against their state +and then push another station saying that hey this is this checks out +with the data that I have now or likely I could just you know pull that +data pull those attestations and just verify if X percent of the stake +has actually confirmed that this is sticker attached and that their +transaction was included in that. The pros of this are that there\'s no +overhead to block production because it\'s done asynchronously and is +not part of the bank cache. There\'s a low risk of liveness failures +because it\'s not part of the core consensus protocol, and it\'s also +easier to implement. + +\"Because it\'s once cause it and not consensus, the only downside would +be that it\'s not making the code protocol, so it would be optional to +implement, and the validators aren\'t really forced to make those +attestations or commitments. So this is where we end this presentation +and want to hear more about the thoughts of the code community and open +to any critics or questions. Thank you, Richie. + +Hey, so not to say thanks a lot for working on this. I think this is a +really nice initiative, and it seems like a rather easy win complexity +and wise for enabling this functionality. I would just like to voice my +preference for going the gossip route or any related method of doing it +this way. And while we don\'t modify the core data structures to support +this feature, I think my main problem with modifying the proof of +History hash would be that it\'s quite a breaking change of the +definition. What the proof of History has currently is where it would +basically go from committing to the block data contents of the current +block and all blocks before that to going to committing to the state +changes that this block induces. And this would matter for fire dancers, +for example, because we might use the POA hash to identify the chain +that fire dancer and Salonlabs are currently on. And let\'s say, for +example, we have a temporary mismatch in the runtime where we derive a +slightly different state on both clients. By redefining the proof of +History hash to potentially differ on both clients, I think it would be +much harder to tolerate such runtime mismatches or even detect them, as +that would basically stop validators from synchronizing entirely rather +than continuing replay with a slightly different state. + +I think going the like Fast delay route doesn\'t seem too elegant to me +because that would basically introduce minimal latency, finally like the +client, where they would need to equip these, you know, n block speed 10 +or so. I think regardless of which way we choose, maybe I thought of +splitting up the proposal into a few separate parts, and then it would +be much easier to vote on each one specifically because it feels like if +we try to incorporate this entire feature into one, there\'s going to be +a bit of discussion on it for quite a while. + +So the first one that I thought of would be just agreeing on how we +actually compute the commitment for the transaction statuses only. So, +you know, given a vector of transaction statuses, what goes into the +hash? Do we just commit the transaction result code, or do we also hash +logs in some way? And then, you know, define what the actual root of the +transaction statuses is. And then we can do a separate sim that says +here\'s how you would propagate it over gossip. And then we might go +back and say, well, in hindsight, gossip was a bad idea. So here\'s +another sim deal of how we would propagate the transaction statuses over +whatever other protocol. And one other way would be of cross-posting it +on-chain itself, which, of course, has the benefit that this kind of +incentivizes validators to actually participate in this transaction +status calculation. Whereas, if I wanted to be mean, I could say, hey, I +don\'t want to implement this feature and fire that, so I\'m not just +gonna propagate it over gossip, which would, I think, decrease the +quality of service. I think we kind of want to incentivize validators to +participate in this feature. Again, thank you so much. I\'d love to hear +your thoughts and on these, and I\'m also gonna post the same feedback +on assembly itself. + +Likewise, I also respect your interest in this, indeed. I think that +gossip is definitely a favorable route because it allows us to test a +lot of the client UX of the electronic, and because it\'s actually +simpler and less of a breaking change, it\'s easier to revert back if we +messed up. If we think that\'s not the right way, then doing that from, +you know, making a change to the bank hash and then like, you know, +thinking that okay, this is not the right way and going back to go +outside. + +I think that regarding like validators being incentivized to participate +in the network, that\'s something that, again, eventually be figured out +and might even be another Sunday. And I think we can, I\'m leading more +towards what Richard said, we\'re going with gossip. So I totally agree +regarding the incentives. I\'d be also curious whether Solana Labs has +any thoughts on this proposal, but would be really cool to see progress +moving on this rather soon. + +I just want to say, first of all, this is a great effort. It\'s gonna +have a lot, I think, to the community. One of the issues I saw regarding +the transaction status is we\'ve generally been moving away from +detailed transaction statuses more into very broad categories of +failure. And the reason for that is, for example, originally we even had +the runtime errors as part of the consensus, luckily that\'s not the +case anymore. So there\'s now only one case for the entire runtime in +the consensus. And the reason why we moved away from that is that the +success cases are already complex, but the failure modes are so much +more complex, and it really narrows down the implementation you can have +to get the exact precise error response of every transaction rise. And +that makes it almost impossible to change anything or to re-implement it +any other way. So just be careful about the transaction results, don\'t +include too much error state or logging into them, otherwise, we will +all be stuck with exactly one implementation. So we really just want to +include like success or failure. There was a suggestion to include like +transaction logs, but we can actually avoid that by just re-executing +the transaction on the client side by fetching the inputs. So we just +want successful failure. I heard some feedback suggesting that we also +add logs. I think logs are pretty scary because right now the truncation +of logs is not well-defined. But maybe that\'s actually an opportunity +to say that there\'s a recommendation to, for example, only do 256-byte +long log lines. The concern I had there was how this would affect +performance if we hash two or more sharp blocks for each program +execution or so. Would that limit the TPS in the future? I don\'t +remember who it was, I think it was Mango. + +\"I don\'t know. I think the only concern was like with the overhead +added by logs, but I think you mentioned that with fire dancers like +implementation of, I think that might not be a problem. And once you +have your Henry\'s go-ahead and start, no, I just wanted to clarify, +Richard, when you actually, for both Richard and Anushk, when you say +the gossip route, you mean that there are going to be no consensus +changes, right? Like, even the validators are voting on regarding the +state or whatever state is necessary would be in a separate smart +contract. It wouldn\'t be part of the block. Yes, correct. It wouldn\'t +even be in a smart contract. It\'s basically just a structure, okay? So +the contact info is a structure that every validator publishes regularly +onto gossip. As far as I know, there\'s already a snapshot hash and then +the accounts hash, so it seems like it would be fairly trivial to fit in +another hash there. So that\'s actually a bit more discussion around +whether we should have an entirely separate hash for this, because +usually if you\'re getting the transaction status commitments, you +probably also want the account sashes. And the problem with doing +separate fields for this is that you\'d basically have all validators +accessing them separately. I think if we fit them all into the same +contact info block, that might not be a problem. They also don\'t need +to be at the same frequency, right? How frequently is this contact info +updated or how frequently do validators publish it? The question for +Solana Labs, I think that\'s an implementation detail anyway, but I just +wanted to be clear that in the gossip route, there are no consensus +changes, right? So even the transaction status or anything, the block +structure doesn\'t really change. So Tiny Dancer won\'t be blocked in +any way on that, right? Yes, okay, just wanted to clarify that. Are +there any other questions for Anushk and Hirsch? Carol, I think you +mentioned that the Mango was\... They suggested using a bi-directional +connection. Max, I think you\'re here. Do you want to speak a little bit +more on that?\" + +\"I\'m sorry, could you repeat on which one should I speak? Corral +mentioned that y\'all suggested you use a bi-directional connection. I +believe this was originally like an experimental feature that y\'all are +implementing on the labs client, and it\'s like a client-specific. +Y\'all want to talk about whether it\'s relevant anymore.\" + +\"I can give some background for the people who are interested. So what +we did is when we run benchmarks on a local network, we\'ll enable a +patch on the TPU side to give us back, basically, a status that +summarizes what happened with the transaction in the scheduler. This is +very similar to, I would say, like request tracing environment that you +would see in a commercial microservice architecture deployed in a +private company. You send something in from a load balancer, right? You +want to trace for a limited amount of the requests in the network, why +aren\'t they getting scheduled right? So you get a per-request +measurement that is actually complete because right now, the +measurements we have are statistical and broad, and it\'s very hard to +say in particular which transaction, like we just see all five out of +100 transactions had this issue, right? But we don\'t know what\'s wrong +with these five transactions, why didn\'t they get into the block? +Right, what were the five transactions that hit the CU limit or what +were the five transactions that hit the 2000 packets per 10 per 100 +milliseconds on a quick connection, right? There are different limits in +a stack, and it\'s very hard to identify why a certain transaction +didn\'t pass. That was the original intention there. But I think +there\'s a lot of pushback against this kind of, I would say, +nice-to-have feature. We really enjoyed having it for local performance +testing because we get more insights, but that\'s it. I\'ve looked at +this a bit, and it wouldn\'t seem that hard to support and finance or +Solana labs, and I think it\'d also be pretty nice to have clients to +get explicit feedback about why the transaction might fail or not. And +it seems like, in financial kind of applications, that would seem like a +basic feature to have, especially if they\'re user-facing. Like if I go +in my wallet and send a transaction and that gets dropped somewhere +along the path, since this is an issue that would seem to directly +affect the user experience of our clients, I think it would make sense +to report that. But it requires a bit of plumbing to get that data back +to the networking layer because usually, at the point where you know +where your transaction gets dropped, you probably already anonymized the +traffic flows, where you don\'t have the IP addresses or quick +connections anymore.\" + +\"So I feel like this should be\... I don\'t see why we wouldn\'t move +to bi-directional connections, just have the ability to do this kind of +reverse flow feedback in the future. And then we could just maybe +publish this in the specifying what the protocol should be for reverse +flow feedback, and then, you know, I think as time goes on, we\'d see +more Solana Labs clients adopt this and finance the clients.\" + +\"What was the specific feedback why this wouldn\'t be a good idea?\" + +\"I think there\'s a couple of performance questions there, right? So I +think the main issue is that it kind of creates risk on the security, +DDoS protection side. So, oh, I think I know where this is going. So +currently, every transaction is a separate unidirectional streaming. +After you send it, it gets closed. So if there\'s reversal feedback, +maybe that can force the client to keep open these streams for longer by +just saying, \'Hey, I dropped these packets. Please send them to me +again.\' But that should be easy to fix by, for example, delivering this +feedback with datagrams or with, you know, a persistent stream. I still +don\'t really see why we shouldn\'t do it if the state is easily +available. I see Galactus from Mango Prices.\" + +\"So it\'s actually what we implemented is more like\... You have this, +like, with Solana client, we cannot really implement this bi-directional +stuff because once you get the\... you need that like connection, it\'s +dropped immediately after reading. So what we implemented is a separate +service where a validator can connect, and then it can say, like, a list +of transactions that it wants feedback for. And so actually, whatever is +executed for X reason is dropped, then we just send the, like, why it +was dropped actually. So it\'s more like a separate service. It\'s not +even in the same\... like, TPU client TPU server.\" + +\"I see. I mean, it would seem a bit cleaner to just deliver +acknowledgments\... So I also would, like, I would also like to have, +like, a bi-directional channel where you just send a transaction and get +feedback like why it was dropped. But, like, on the\... this validator +side, there are, like, a lot of limits, and the connection can be +dropped for, like, a lot of reasons. And it was quite impossible just to +keep the connection up. So we said, like, okay, forget it. We\'ll just +have a new separate service. But,of course, I agree. Like, we can have +this per-directional connection of Quick, and then we\'ll just get +feedback for our transactions. I think if you install a mechanism to +signal optional features in the Quick handshake itself, it should be +pretty easy to trial out features like this on a real cluster without +affecting reliability too much or without introducing breaking changes. +But it seems like it needs a bit more time on finding out what the +actual right protocol is for delivering this feedback. I agree because +Quick right now, like, we have\... We don\'t have, like, a lot of bits +remaining just to have, like, give accurate acknowledgment. I think +while closing or even in the acknowledgment packets, maybe we have to +find maybe another mechanism to get this acknowledgment. I agree with +you.\" + +\"We\'re a few minutes over time, so I think we\'ll have to do as well +to continue the discussion, probably open up the PR that\'s on this as +well as the discussion on a news the 7d52 earlier. But thank you all for +coming this month, and I\'ll see you all next month for the next Cindy +call. Reminder, if you have any agenda items, make sure you do a PR to +the next agenda so that we get it earlier rather than later, and people +can read any additional information beforehand so we have a better +discussion.\"