tests.rs 434 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251
  1. #![cfg(test)]
  2. use {
  3. super::{
  4. test_utils::{goto_end_of_slot, update_vote_account_timestamp},
  5. *,
  6. },
  7. crate::{
  8. accounts_background_service::{PrunedBanksRequestHandler, SendDroppedBankCallback},
  9. bank_client::BankClient,
  10. bank_forks::BankForks,
  11. genesis_utils::{
  12. self, activate_all_features, activate_feature, bootstrap_validator_stake_lamports,
  13. create_genesis_config_with_leader, create_genesis_config_with_vote_accounts,
  14. genesis_sysvar_and_builtin_program_lamports, GenesisConfigInfo, ValidatorVoteKeypairs,
  15. },
  16. stake_history::StakeHistory,
  17. stakes::InvalidCacheEntryReason,
  18. status_cache::MAX_CACHE_ENTRIES,
  19. },
  20. agave_feature_set::{self as feature_set, FeatureSet},
  21. agave_reserved_account_keys::ReservedAccount,
  22. agave_transaction_view::static_account_keys_frame::MAX_STATIC_ACCOUNTS_PER_PACKET,
  23. ahash::AHashMap,
  24. assert_matches::assert_matches,
  25. crossbeam_channel::{bounded, unbounded},
  26. ed25519_dalek::ed25519::signature::Signer as EdSigner,
  27. itertools::Itertools,
  28. rand::Rng,
  29. rayon::{iter::IntoParallelIterator, ThreadPool, ThreadPoolBuilder},
  30. serde::{Deserialize, Serialize},
  31. solana_account::{
  32. accounts_equal, create_account_shared_data_with_fields as create_account, from_account,
  33. state_traits::StateMut, Account, AccountSharedData, ReadableAccount, WritableAccount,
  34. },
  35. solana_account_info::MAX_PERMITTED_DATA_INCREASE,
  36. solana_accounts_db::{
  37. accounts::AccountAddressFilter,
  38. accounts_db::DEFAULT_ACCOUNTS_SHRINK_RATIO,
  39. accounts_index::{
  40. AccountIndex, AccountSecondaryIndexes, IndexKey, ScanConfig, ScanError, ITER_BATCH_SIZE,
  41. },
  42. ancestors::Ancestors,
  43. },
  44. solana_client_traits::SyncClient,
  45. solana_clock::{
  46. BankId, Epoch, Slot, UnixTimestamp, DEFAULT_TICKS_PER_SLOT, INITIAL_RENT_EPOCH,
  47. MAX_PROCESSING_AGE, MAX_RECENT_BLOCKHASHES,
  48. },
  49. solana_cluster_type::ClusterType,
  50. solana_compute_budget::{
  51. compute_budget::ComputeBudget, compute_budget_limits::ComputeBudgetLimits,
  52. },
  53. solana_compute_budget_interface::ComputeBudgetInstruction,
  54. solana_cost_model::block_cost_limits::{
  55. MAX_BLOCK_UNITS, MAX_BLOCK_UNITS_SIMD_0286, MAX_WRITABLE_ACCOUNT_UNITS,
  56. },
  57. solana_cpi::MAX_RETURN_DATA,
  58. solana_epoch_schedule::{EpochSchedule, MINIMUM_SLOTS_PER_EPOCH},
  59. solana_feature_gate_interface::{self as feature, Feature},
  60. solana_fee_calculator::FeeRateGovernor,
  61. solana_fee_structure::FeeStructure,
  62. solana_genesis_config::GenesisConfig,
  63. solana_hash::Hash,
  64. solana_instruction::{error::InstructionError, AccountMeta, Instruction},
  65. solana_keypair::{keypair_from_seed, Keypair},
  66. solana_loader_v3_interface::{
  67. instruction::UpgradeableLoaderInstruction, state::UpgradeableLoaderState,
  68. },
  69. solana_loader_v4_interface::{instruction as loader_v4, state::LoaderV4State},
  70. solana_logger,
  71. solana_message::{
  72. compiled_instruction::CompiledInstruction, Message, MessageHeader, SanitizedMessage,
  73. },
  74. solana_native_token::LAMPORTS_PER_SOL,
  75. solana_nonce::{self as nonce, state::DurableNonce},
  76. solana_packet::PACKET_DATA_SIZE,
  77. solana_poh_config::PohConfig,
  78. solana_program_runtime::{
  79. declare_process_instruction,
  80. execution_budget::{self, MAX_COMPUTE_UNIT_LIMIT},
  81. loaded_programs::{ProgramCacheEntry, ProgramCacheEntryType},
  82. },
  83. solana_pubkey::Pubkey,
  84. solana_rent::Rent,
  85. solana_reward_info::RewardType,
  86. solana_sdk_ids::{
  87. bpf_loader, bpf_loader_upgradeable, incinerator, native_loader, secp256k1_program,
  88. },
  89. solana_sha256_hasher::hash,
  90. solana_signature::Signature,
  91. solana_signer::Signer,
  92. solana_stake_interface::{
  93. instruction as stake_instruction,
  94. state::{Authorized, Delegation, Lockup, Stake, StakeStateV2},
  95. },
  96. solana_stake_program::stake_state,
  97. solana_svm::{
  98. account_loader::{FeesOnlyTransaction, LoadedTransaction},
  99. rollback_accounts::RollbackAccounts,
  100. transaction_commit_result::TransactionCommitResultExtensions,
  101. transaction_execution_result::ExecutedTransaction,
  102. },
  103. solana_svm_timings::ExecuteTimings,
  104. solana_svm_transaction::svm_message::SVMMessage,
  105. solana_system_interface::{
  106. error::SystemError,
  107. instruction::{self as system_instruction},
  108. program as system_program, MAX_PERMITTED_ACCOUNTS_DATA_ALLOCATIONS_PER_TRANSACTION,
  109. MAX_PERMITTED_DATA_LENGTH,
  110. },
  111. solana_system_transaction as system_transaction, solana_sysvar as sysvar,
  112. solana_transaction::{
  113. sanitized::SanitizedTransaction, Transaction, TransactionVerificationMode,
  114. },
  115. solana_transaction_error::{TransactionError, TransactionResult as Result},
  116. solana_vote_interface::state::TowerSync,
  117. solana_vote_program::{
  118. vote_instruction,
  119. vote_state::{
  120. self, create_account_with_authorized, BlockTimestamp, VoteAuthorize, VoteInit,
  121. VoteStateV3, VoteStateVersions, MAX_LOCKOUT_HISTORY,
  122. },
  123. },
  124. spl_generic_token::token,
  125. std::{
  126. collections::{HashMap, HashSet},
  127. convert::TryInto,
  128. fs::File,
  129. io::Read,
  130. str::FromStr,
  131. sync::{
  132. atomic::{
  133. AtomicBool, AtomicU64, AtomicUsize,
  134. Ordering::{Relaxed, Release},
  135. },
  136. Arc,
  137. },
  138. thread::Builder,
  139. time::{Duration, Instant},
  140. },
  141. test_case::test_case,
  142. };
  143. impl VoteReward {
  144. pub fn new_random() -> Self {
  145. let mut rng = rand::thread_rng();
  146. let validator_pubkey = solana_pubkey::new_rand();
  147. let validator_stake_lamports = rng.gen_range(1..200);
  148. let validator_voting_keypair = Keypair::new();
  149. let validator_vote_account = vote_state::create_account(
  150. &validator_voting_keypair.pubkey(),
  151. &validator_pubkey,
  152. rng.gen_range(1..20),
  153. validator_stake_lamports,
  154. );
  155. Self {
  156. vote_account: validator_vote_account,
  157. commission: rng.gen_range(1..20),
  158. vote_rewards: rng.gen_range(1..200),
  159. }
  160. }
  161. }
  162. pub(in crate::bank) fn new_bank_from_parent_with_bank_forks(
  163. bank_forks: &RwLock<BankForks>,
  164. parent: Arc<Bank>,
  165. collector_id: &Pubkey,
  166. slot: Slot,
  167. ) -> Arc<Bank> {
  168. let bank = Bank::new_from_parent(parent, collector_id, slot);
  169. bank_forks
  170. .write()
  171. .unwrap()
  172. .insert(bank)
  173. .clone_without_scheduler()
  174. }
  175. fn create_genesis_config_no_tx_fee_no_rent(lamports: u64) -> (GenesisConfig, Keypair) {
  176. // genesis_util creates config with no tx fee and no rent
  177. let genesis_config_info = solana_runtime::genesis_utils::create_genesis_config(lamports);
  178. (
  179. genesis_config_info.genesis_config,
  180. genesis_config_info.mint_keypair,
  181. )
  182. }
  183. fn create_genesis_config_no_tx_fee(lamports: u64) -> (GenesisConfig, Keypair) {
  184. // genesis_config creates config with default fee rate and default rent
  185. // override to set fee rate to zero.
  186. let (mut genesis_config, mint_keypair) = solana_genesis_config::create_genesis_config(lamports);
  187. genesis_config.fee_rate_governor = FeeRateGovernor::new(0, 0);
  188. (genesis_config, mint_keypair)
  189. }
  190. pub(in crate::bank) fn create_genesis_config(lamports: u64) -> (GenesisConfig, Keypair) {
  191. solana_genesis_config::create_genesis_config(lamports)
  192. }
  193. pub(in crate::bank) fn new_sanitized_message(message: Message) -> SanitizedMessage {
  194. SanitizedMessage::try_from_legacy_message(message, &ReservedAccountKeys::empty_key_set())
  195. .unwrap()
  196. }
  197. #[test]
  198. fn test_race_register_tick_freeze() {
  199. solana_logger::setup();
  200. let (mut genesis_config, _) = create_genesis_config(50);
  201. genesis_config.ticks_per_slot = 1;
  202. let p = solana_pubkey::new_rand();
  203. let hash = hash(p.as_ref());
  204. for _ in 0..1000 {
  205. let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
  206. let bank0_ = bank0.clone();
  207. let freeze_thread = Builder::new()
  208. .name("freeze".to_string())
  209. .spawn(move || loop {
  210. if bank0_.is_complete() {
  211. assert_eq!(bank0_.last_blockhash(), hash);
  212. break;
  213. }
  214. })
  215. .unwrap();
  216. let bank0_ = bank0.clone();
  217. let register_tick_thread = Builder::new()
  218. .name("register_tick".to_string())
  219. .spawn(move || {
  220. bank0_.register_tick_for_test(&hash);
  221. })
  222. .unwrap();
  223. register_tick_thread.join().unwrap();
  224. freeze_thread.join().unwrap();
  225. }
  226. }
  227. fn new_executed_processing_result(
  228. status: Result<()>,
  229. fee_details: FeeDetails,
  230. ) -> TransactionProcessingResult {
  231. Ok(ProcessedTransaction::Executed(Box::new(
  232. ExecutedTransaction {
  233. loaded_transaction: LoadedTransaction {
  234. fee_details,
  235. ..LoadedTransaction::default()
  236. },
  237. execution_details: TransactionExecutionDetails {
  238. status,
  239. log_messages: None,
  240. inner_instructions: None,
  241. return_data: None,
  242. executed_units: 0,
  243. accounts_data_len_delta: 0,
  244. },
  245. programs_modified_by_tx: HashMap::new(),
  246. },
  247. )))
  248. }
  249. impl Bank {
  250. fn clean_accounts_for_tests(&self) {
  251. self.rc.accounts.accounts_db.clean_accounts_for_tests()
  252. }
  253. }
  254. #[test]
  255. fn test_bank_unix_timestamp_from_genesis() {
  256. let (genesis_config, _mint_keypair) = create_genesis_config(1);
  257. let mut bank = Arc::new(Bank::new_for_tests(&genesis_config));
  258. assert_eq!(
  259. genesis_config.creation_time,
  260. bank.unix_timestamp_from_genesis()
  261. );
  262. let slots_per_sec = (genesis_config.poh_config.target_tick_duration.as_secs_f32()
  263. * genesis_config.ticks_per_slot as f32)
  264. .recip();
  265. for _i in 0..slots_per_sec as usize + 1 {
  266. bank = Arc::new(new_from_parent(bank));
  267. }
  268. assert!(bank.unix_timestamp_from_genesis() - genesis_config.creation_time >= 1);
  269. }
  270. #[test]
  271. fn test_bank_new() {
  272. let dummy_leader_pubkey = solana_pubkey::new_rand();
  273. let dummy_leader_stake_lamports = bootstrap_validator_stake_lamports();
  274. let mint_lamports = 10_000;
  275. let GenesisConfigInfo {
  276. mut genesis_config,
  277. mint_keypair,
  278. voting_keypair,
  279. ..
  280. } = create_genesis_config_with_leader(
  281. mint_lamports,
  282. &dummy_leader_pubkey,
  283. dummy_leader_stake_lamports,
  284. );
  285. genesis_config.rent = Rent {
  286. lamports_per_byte_year: 5,
  287. exemption_threshold: 1.2,
  288. burn_percent: 5,
  289. };
  290. let bank = Bank::new_for_tests(&genesis_config);
  291. assert_eq!(bank.get_balance(&mint_keypair.pubkey()), mint_lamports);
  292. assert_eq!(
  293. bank.get_balance(&voting_keypair.pubkey()),
  294. dummy_leader_stake_lamports /* 1 token goes to the vote account associated with dummy_leader_lamports */
  295. );
  296. let rent_account = bank.get_account(&sysvar::rent::id()).unwrap();
  297. let rent = from_account::<sysvar::rent::Rent, _>(&rent_account).unwrap();
  298. assert_eq!(rent.burn_percent, 5);
  299. assert_eq!(rent.exemption_threshold, 1.2);
  300. assert_eq!(rent.lamports_per_byte_year, 5);
  301. }
  302. pub(crate) fn create_simple_test_bank(lamports: u64) -> Bank {
  303. let (genesis_config, _mint_keypair) = create_genesis_config(lamports);
  304. Bank::new_for_tests(&genesis_config)
  305. }
  306. fn create_simple_test_arc_bank(lamports: u64) -> (Arc<Bank>, Arc<RwLock<BankForks>>) {
  307. let bank = create_simple_test_bank(lamports);
  308. bank.wrap_with_bank_forks_for_tests()
  309. }
  310. #[test]
  311. fn test_bank_block_height() {
  312. let (bank0, _bank_forks) = create_simple_test_arc_bank(1);
  313. assert_eq!(bank0.block_height(), 0);
  314. let bank1 = Arc::new(new_from_parent(bank0));
  315. assert_eq!(bank1.block_height(), 1);
  316. }
  317. #[test]
  318. fn test_bank_update_epoch_stakes() {
  319. #[allow(non_local_definitions)]
  320. impl Bank {
  321. fn epoch_stake_keys(&self) -> Vec<Epoch> {
  322. let mut keys: Vec<Epoch> = self.epoch_stakes.keys().copied().collect();
  323. keys.sort_unstable();
  324. keys
  325. }
  326. fn epoch_stake_key_info(&self) -> (Epoch, Epoch, usize) {
  327. let mut keys: Vec<Epoch> = self.epoch_stakes.keys().copied().collect();
  328. keys.sort_unstable();
  329. (*keys.first().unwrap(), *keys.last().unwrap(), keys.len())
  330. }
  331. }
  332. let mut bank = create_simple_test_bank(100_000);
  333. let initial_epochs = bank.epoch_stake_keys();
  334. assert_eq!(initial_epochs, vec![0, 1]);
  335. for existing_epoch in &initial_epochs {
  336. bank.update_epoch_stakes(*existing_epoch);
  337. assert_eq!(bank.epoch_stake_keys(), initial_epochs);
  338. }
  339. for epoch in (initial_epochs.len() as Epoch)..MAX_LEADER_SCHEDULE_STAKES {
  340. bank.update_epoch_stakes(epoch);
  341. assert_eq!(bank.epoch_stakes.len() as Epoch, epoch + 1);
  342. }
  343. assert_eq!(
  344. bank.epoch_stake_key_info(),
  345. (
  346. 0,
  347. MAX_LEADER_SCHEDULE_STAKES - 1,
  348. MAX_LEADER_SCHEDULE_STAKES as usize
  349. )
  350. );
  351. bank.update_epoch_stakes(MAX_LEADER_SCHEDULE_STAKES);
  352. assert_eq!(
  353. bank.epoch_stake_key_info(),
  354. (
  355. 0,
  356. MAX_LEADER_SCHEDULE_STAKES,
  357. MAX_LEADER_SCHEDULE_STAKES as usize + 1
  358. )
  359. );
  360. bank.update_epoch_stakes(MAX_LEADER_SCHEDULE_STAKES + 1);
  361. assert_eq!(
  362. bank.epoch_stake_key_info(),
  363. (
  364. 1,
  365. MAX_LEADER_SCHEDULE_STAKES + 1,
  366. MAX_LEADER_SCHEDULE_STAKES as usize + 1
  367. )
  368. );
  369. }
  370. fn bank0_sysvar_delta() -> u64 {
  371. const SLOT_HISTORY_SYSVAR_MIN_BALANCE: u64 = 913_326_000;
  372. SLOT_HISTORY_SYSVAR_MIN_BALANCE
  373. }
  374. fn bank1_sysvar_delta() -> u64 {
  375. const SLOT_HASHES_SYSVAR_MIN_BALANCE: u64 = 143_487_360;
  376. SLOT_HASHES_SYSVAR_MIN_BALANCE
  377. }
  378. fn bank2_sysvar_delta() -> u64 {
  379. const EPOCH_REWARDS_SYSVAR_MIN_BALANCE: u64 = 1_454_640;
  380. EPOCH_REWARDS_SYSVAR_MIN_BALANCE
  381. }
  382. #[test]
  383. fn test_bank_capitalization() {
  384. let bank0 = Arc::new(Bank::new_for_tests(&GenesisConfig {
  385. accounts: (0..42)
  386. .map(|_| {
  387. (
  388. solana_pubkey::new_rand(),
  389. Account::new(42, 0, &Pubkey::default()),
  390. )
  391. })
  392. .collect(),
  393. cluster_type: ClusterType::MainnetBeta,
  394. ..GenesisConfig::default()
  395. }));
  396. assert_eq!(
  397. bank0.capitalization(),
  398. 42 * 42 + genesis_sysvar_and_builtin_program_lamports(),
  399. );
  400. bank0.freeze();
  401. assert_eq!(
  402. bank0.capitalization(),
  403. 42 * 42 + genesis_sysvar_and_builtin_program_lamports() + bank0_sysvar_delta(),
  404. );
  405. let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1);
  406. assert_eq!(
  407. bank1.capitalization(),
  408. 42 * 42
  409. + genesis_sysvar_and_builtin_program_lamports()
  410. + bank0_sysvar_delta()
  411. + bank1_sysvar_delta(),
  412. );
  413. }
  414. /// if asserter returns true, check the capitalization
  415. /// Checking the capitalization requires that the bank be a root and the slot be flushed.
  416. /// All tests are getting converted to use the write cache, so over time, each caller will be visited to throttle this input.
  417. /// Flushing the cache has a side effects on the test, so often the test has to be restarted to continue to function correctly.
  418. fn assert_capitalization_diff(
  419. bank: &Bank,
  420. updater: impl Fn(),
  421. asserter: impl Fn(u64, u64) -> bool,
  422. ) {
  423. let old = bank.capitalization();
  424. updater();
  425. let new = bank.capitalization();
  426. if asserter(old, new) {
  427. add_root_and_flush_write_cache(bank);
  428. assert_eq!(
  429. bank.capitalization(),
  430. bank.calculate_capitalization_for_tests()
  431. );
  432. }
  433. }
  434. declare_process_instruction!(MockBuiltin, 1, |_invoke_context| {
  435. // Default for all tests which don't bring their own processor
  436. Ok(())
  437. });
  438. #[test]
  439. fn test_store_account_and_update_capitalization_missing() {
  440. let bank = create_simple_test_bank(0);
  441. let pubkey = solana_pubkey::new_rand();
  442. let some_lamports = 400;
  443. let account = AccountSharedData::new(some_lamports, 0, &system_program::id());
  444. assert_capitalization_diff(
  445. &bank,
  446. || bank.store_account_and_update_capitalization(&pubkey, &account),
  447. |old, new| {
  448. assert_eq!(old + some_lamports, new);
  449. true
  450. },
  451. );
  452. assert_eq!(account, bank.get_account(&pubkey).unwrap());
  453. }
  454. #[test]
  455. fn test_store_account_and_update_capitalization_increased() {
  456. let old_lamports = 400;
  457. let (genesis_config, mint_keypair) = create_genesis_config(old_lamports);
  458. let bank = Bank::new_for_tests(&genesis_config);
  459. let pubkey = mint_keypair.pubkey();
  460. let new_lamports = 500;
  461. let account = AccountSharedData::new(new_lamports, 0, &system_program::id());
  462. assert_capitalization_diff(
  463. &bank,
  464. || bank.store_account_and_update_capitalization(&pubkey, &account),
  465. |old, new| {
  466. assert_eq!(old + 100, new);
  467. true
  468. },
  469. );
  470. assert_eq!(account, bank.get_account(&pubkey).unwrap());
  471. }
  472. #[test]
  473. fn test_store_account_and_update_capitalization_decreased() {
  474. let old_lamports = 400;
  475. let (genesis_config, mint_keypair) = create_genesis_config(old_lamports);
  476. let bank = Bank::new_for_tests(&genesis_config);
  477. let pubkey = mint_keypair.pubkey();
  478. let new_lamports = 100;
  479. let account = AccountSharedData::new(new_lamports, 0, &system_program::id());
  480. assert_capitalization_diff(
  481. &bank,
  482. || bank.store_account_and_update_capitalization(&pubkey, &account),
  483. |old, new| {
  484. assert_eq!(old - 300, new);
  485. true
  486. },
  487. );
  488. assert_eq!(account, bank.get_account(&pubkey).unwrap());
  489. }
  490. #[test]
  491. fn test_store_account_and_update_capitalization_unchanged() {
  492. let lamports = 400;
  493. let (genesis_config, mint_keypair) = create_genesis_config(lamports);
  494. let bank = Bank::new_for_tests(&genesis_config);
  495. let pubkey = mint_keypair.pubkey();
  496. let account = AccountSharedData::new(lamports, 1, &system_program::id());
  497. assert_capitalization_diff(
  498. &bank,
  499. || bank.store_account_and_update_capitalization(&pubkey, &account),
  500. |old, new| {
  501. assert_eq!(old, new);
  502. true
  503. },
  504. );
  505. assert_eq!(account, bank.get_account(&pubkey).unwrap());
  506. }
  507. pub(in crate::bank) fn new_from_parent_next_epoch(
  508. parent: Arc<Bank>,
  509. bank_forks: &RwLock<BankForks>,
  510. epochs: Epoch,
  511. ) -> Arc<Bank> {
  512. let mut slot = parent.slot();
  513. let mut epoch = parent.epoch();
  514. for _ in 0..epochs {
  515. slot += parent.epoch_schedule().get_slots_in_epoch(epoch);
  516. epoch = parent.epoch_schedule().get_epoch(slot);
  517. }
  518. new_bank_from_parent_with_bank_forks(bank_forks, parent, &Pubkey::default(), slot)
  519. }
  520. #[test]
  521. fn test_bank_update_vote_stake_rewards() {
  522. let thread_pool = ThreadPoolBuilder::new().num_threads(1).build().unwrap();
  523. check_bank_update_vote_stake_rewards(|bank: &Bank| {
  524. bank._load_vote_and_stake_accounts(&thread_pool, null_tracer())
  525. });
  526. }
  527. impl Bank {
  528. fn _load_vote_and_stake_accounts(
  529. &self,
  530. thread_pool: &ThreadPool,
  531. reward_calc_tracer: Option<impl RewardCalcTracer>,
  532. ) -> StakeDelegationsMap {
  533. let stakes = self.stakes_cache.stakes();
  534. let stake_delegations = self.filter_stake_delegations(&stakes);
  535. // Obtain all unique voter pubkeys from stake delegations.
  536. fn merge(mut acc: HashSet<Pubkey>, other: HashSet<Pubkey>) -> HashSet<Pubkey> {
  537. if acc.len() < other.len() {
  538. return merge(other, acc);
  539. }
  540. acc.extend(other);
  541. acc
  542. }
  543. let voter_pubkeys = thread_pool.install(|| {
  544. stake_delegations
  545. .par_iter()
  546. .fold(
  547. HashSet::default,
  548. |mut voter_pubkeys, (_stake_pubkey, stake_account)| {
  549. voter_pubkeys.insert(stake_account.delegation().voter_pubkey);
  550. voter_pubkeys
  551. },
  552. )
  553. .reduce(HashSet::default, merge)
  554. });
  555. // Obtain vote-accounts for unique voter pubkeys.
  556. let cached_vote_accounts = stakes.vote_accounts();
  557. let solana_vote_program: Pubkey = solana_vote_program::id();
  558. let vote_accounts_cache_miss_count = AtomicUsize::default();
  559. let get_vote_account = |vote_pubkey: &Pubkey| -> Option<VoteAccount> {
  560. if let Some(vote_account) = cached_vote_accounts.get(vote_pubkey) {
  561. return Some(vote_account.clone());
  562. }
  563. // If accounts-db contains a valid vote account, then it should
  564. // already have been cached in cached_vote_accounts; so the code
  565. // below is only for sanity check in tests, and should not be hit
  566. // in practice.
  567. let account = self.get_account_with_fixed_root(vote_pubkey)?;
  568. if account.owner() == &solana_vote_program
  569. && VoteStateV3::deserialize(account.data()).is_ok()
  570. {
  571. vote_accounts_cache_miss_count.fetch_add(1, Relaxed);
  572. }
  573. VoteAccount::try_from(account).ok()
  574. };
  575. let invalid_vote_keys = DashMap::<Pubkey, InvalidCacheEntryReason>::new();
  576. let make_vote_delegations_entry = |vote_pubkey| {
  577. let Some(vote_account) = get_vote_account(&vote_pubkey) else {
  578. invalid_vote_keys.insert(vote_pubkey, InvalidCacheEntryReason::Missing);
  579. return None;
  580. };
  581. if vote_account.owner() != &solana_vote_program {
  582. invalid_vote_keys.insert(vote_pubkey, InvalidCacheEntryReason::WrongOwner);
  583. return None;
  584. }
  585. let stake_delegations = Vec::default();
  586. Some((vote_pubkey, stake_delegations))
  587. };
  588. let stake_delegations_map: DashMap<Pubkey, StakeDelegations> = thread_pool.install(|| {
  589. voter_pubkeys
  590. .into_par_iter()
  591. .filter_map(make_vote_delegations_entry)
  592. .collect()
  593. });
  594. // Join stake accounts with vote-accounts.
  595. let push_stake_delegation = |(stake_pubkey, stake_account): (&Pubkey, &StakeAccount<_>)| {
  596. let delegation = stake_account.delegation();
  597. let Some(mut vote_delegations) =
  598. stake_delegations_map.get_mut(&delegation.voter_pubkey)
  599. else {
  600. return;
  601. };
  602. if let Some(reward_calc_tracer) = reward_calc_tracer.as_ref() {
  603. let delegation =
  604. InflationPointCalculationEvent::Delegation(*delegation, solana_vote_program);
  605. let event = RewardCalculationEvent::Staking(stake_pubkey, &delegation);
  606. reward_calc_tracer(&event);
  607. }
  608. let stake_delegation = (*stake_pubkey, stake_account.clone());
  609. vote_delegations.push(stake_delegation);
  610. };
  611. thread_pool.install(|| {
  612. stake_delegations
  613. .into_par_iter()
  614. .for_each(push_stake_delegation);
  615. });
  616. stake_delegations_map
  617. }
  618. }
  619. type StakeDelegations = Vec<(Pubkey, StakeAccount<Delegation>)>;
  620. type StakeDelegationsMap = DashMap<Pubkey, StakeDelegations>;
  621. #[cfg(test)]
  622. fn check_bank_update_vote_stake_rewards<F>(load_vote_and_stake_accounts: F)
  623. where
  624. F: Fn(&Bank) -> StakeDelegationsMap,
  625. {
  626. solana_logger::setup();
  627. // create a bank that ticks really slowly...
  628. let bank0 = Arc::new(Bank::new_for_tests(&GenesisConfig {
  629. accounts: (0..42)
  630. .map(|_| {
  631. (
  632. solana_pubkey::new_rand(),
  633. Account::new(1_000_000_000, 0, &Pubkey::default()),
  634. )
  635. })
  636. .collect(),
  637. // set it up so the first epoch is a full year long
  638. poh_config: PohConfig {
  639. target_tick_duration: Duration::from_secs(
  640. SECONDS_PER_YEAR as u64 / MINIMUM_SLOTS_PER_EPOCH / DEFAULT_TICKS_PER_SLOT,
  641. ),
  642. hashes_per_tick: None,
  643. target_tick_count: None,
  644. },
  645. cluster_type: ClusterType::MainnetBeta,
  646. ..GenesisConfig::default()
  647. }));
  648. assert_eq!(
  649. bank0.capitalization(),
  650. 42 * 1_000_000_000 + genesis_sysvar_and_builtin_program_lamports(),
  651. );
  652. let ((vote_id, mut vote_account), (stake_id, stake_account)) =
  653. crate::stakes::tests::create_staked_node_accounts(10_000);
  654. let starting_vote_and_stake_balance = 10_000 + 1;
  655. // set up accounts
  656. bank0.store_account_and_update_capitalization(&stake_id, &stake_account);
  657. // generate some rewards
  658. let mut vote_state = Some(vote_state::from(&vote_account).unwrap());
  659. for i in 0..MAX_LOCKOUT_HISTORY + 42 {
  660. if let Some(v) = vote_state.as_mut() {
  661. vote_state::process_slot_vote_unchecked(v, i as u64)
  662. }
  663. let versioned = VoteStateVersions::V3(Box::new(vote_state.take().unwrap()));
  664. vote_state::to(&versioned, &mut vote_account).unwrap();
  665. bank0.store_account_and_update_capitalization(&vote_id, &vote_account);
  666. match versioned {
  667. VoteStateVersions::V3(v) => {
  668. vote_state = Some(*v);
  669. }
  670. _ => panic!("Has to be of type Current"),
  671. };
  672. }
  673. bank0.store_account_and_update_capitalization(&vote_id, &vote_account);
  674. bank0.freeze();
  675. assert_eq!(
  676. bank0.capitalization(),
  677. 42 * 1_000_000_000
  678. + genesis_sysvar_and_builtin_program_lamports()
  679. + starting_vote_and_stake_balance
  680. + bank0_sysvar_delta(),
  681. );
  682. assert!(bank0.rewards.read().unwrap().is_empty());
  683. load_vote_and_stake_accounts(&bank0);
  684. // put a child bank in epoch 1
  685. let bank1 = Arc::new(Bank::new_from_parent(
  686. bank0.clone(),
  687. &Pubkey::default(),
  688. bank0.get_slots_in_epoch(bank0.epoch()) + 1,
  689. ));
  690. // verify that there's inflation
  691. assert_ne!(bank1.capitalization(), bank0.capitalization());
  692. // check voting rewards show up in rewards vector
  693. assert_eq!(
  694. *bank1.rewards.read().unwrap(),
  695. vec![(
  696. vote_id,
  697. RewardInfo {
  698. reward_type: RewardType::Voting,
  699. lamports: 0,
  700. post_balance: bank1.get_balance(&vote_id),
  701. commission: Some(0),
  702. }
  703. ),]
  704. );
  705. bank1.freeze();
  706. // advance past partitioned epoch staking rewards delivery
  707. let bank2 = Arc::new(Bank::new_from_parent(
  708. bank1.clone(),
  709. &Pubkey::default(),
  710. bank1.slot() + 1,
  711. ));
  712. // verify that there's inflation
  713. assert_ne!(bank2.capitalization(), bank0.capitalization());
  714. // verify the inflation is represented in validator_points
  715. let paid_rewards = bank2.capitalization()
  716. - bank0.capitalization()
  717. - bank1_sysvar_delta()
  718. - bank2_sysvar_delta();
  719. // this assumes that no new builtins or precompiles were activated in bank1 or bank2
  720. let PrevEpochInflationRewards {
  721. validator_rewards, ..
  722. } = bank2.calculate_previous_epoch_inflation_rewards(bank0.capitalization(), bank0.epoch());
  723. // verify the stake and vote accounts are the right size
  724. assert!(
  725. ((bank2.get_balance(&stake_id) - stake_account.lamports() + bank2.get_balance(&vote_id)
  726. - vote_account.lamports()) as f64
  727. - validator_rewards as f64)
  728. .abs()
  729. < 1.0
  730. );
  731. // verify the rewards are the right size
  732. assert!((validator_rewards as f64 - paid_rewards as f64).abs() < 1.0); // rounding, truncating
  733. // verify validator rewards show up in rewards vectors
  734. assert_eq!(
  735. *bank2.rewards.read().unwrap(),
  736. vec![(
  737. stake_id,
  738. RewardInfo {
  739. reward_type: RewardType::Staking,
  740. lamports: validator_rewards as i64,
  741. post_balance: bank2.get_balance(&stake_id),
  742. commission: Some(0),
  743. }
  744. )]
  745. );
  746. bank2.freeze();
  747. add_root_and_flush_write_cache(&bank0);
  748. add_root_and_flush_write_cache(&bank1);
  749. add_root_and_flush_write_cache(&bank2);
  750. assert_eq!(
  751. bank2.capitalization(),
  752. bank2.calculate_capitalization_for_tests()
  753. );
  754. }
  755. fn do_test_bank_update_rewards_determinism() -> u64 {
  756. // create a bank that ticks really slowly...
  757. let bank = Arc::new(Bank::new_for_tests(&GenesisConfig {
  758. accounts: (0..42)
  759. .map(|_| {
  760. (
  761. solana_pubkey::new_rand(),
  762. Account::new(1_000_000_000, 0, &Pubkey::default()),
  763. )
  764. })
  765. .collect(),
  766. // set it up so the first epoch is a full year long
  767. poh_config: PohConfig {
  768. target_tick_duration: Duration::from_secs(
  769. SECONDS_PER_YEAR as u64 / MINIMUM_SLOTS_PER_EPOCH / DEFAULT_TICKS_PER_SLOT,
  770. ),
  771. hashes_per_tick: None,
  772. target_tick_count: None,
  773. },
  774. cluster_type: ClusterType::MainnetBeta,
  775. ..GenesisConfig::default()
  776. }));
  777. assert_eq!(
  778. bank.capitalization(),
  779. 42 * 1_000_000_000 + genesis_sysvar_and_builtin_program_lamports()
  780. );
  781. let vote_id = solana_pubkey::new_rand();
  782. let mut vote_account = vote_state::create_account(&vote_id, &solana_pubkey::new_rand(), 0, 100);
  783. let stake_id1 = solana_pubkey::new_rand();
  784. let stake_account1 = crate::stakes::tests::create_stake_account(123, &vote_id, &stake_id1);
  785. let stake_id2 = solana_pubkey::new_rand();
  786. let stake_account2 = crate::stakes::tests::create_stake_account(456, &vote_id, &stake_id2);
  787. // set up accounts
  788. bank.store_account_and_update_capitalization(&stake_id1, &stake_account1);
  789. bank.store_account_and_update_capitalization(&stake_id2, &stake_account2);
  790. // generate some rewards
  791. let mut vote_state = Some(vote_state::from(&vote_account).unwrap());
  792. for i in 0..MAX_LOCKOUT_HISTORY + 42 {
  793. if let Some(v) = vote_state.as_mut() {
  794. vote_state::process_slot_vote_unchecked(v, i as u64)
  795. }
  796. let versioned = VoteStateVersions::V3(Box::new(vote_state.take().unwrap()));
  797. vote_state::to(&versioned, &mut vote_account).unwrap();
  798. bank.store_account_and_update_capitalization(&vote_id, &vote_account);
  799. match versioned {
  800. VoteStateVersions::V3(v) => {
  801. vote_state = Some(*v);
  802. }
  803. _ => panic!("Has to be of type Current"),
  804. };
  805. }
  806. bank.store_account_and_update_capitalization(&vote_id, &vote_account);
  807. // put a child bank in epoch 1, which calls update_rewards()...
  808. let bank1 = Arc::new(Bank::new_from_parent(
  809. bank.clone(),
  810. &Pubkey::default(),
  811. bank.get_slots_in_epoch(bank.epoch()) + 1,
  812. ));
  813. // verify that there's inflation
  814. assert_ne!(bank1.capitalization(), bank.capitalization());
  815. bank1.freeze();
  816. add_root_and_flush_write_cache(&bank);
  817. add_root_and_flush_write_cache(&bank1);
  818. assert_eq!(
  819. bank1.capitalization(),
  820. bank1.calculate_capitalization_for_tests()
  821. );
  822. // verify voting and staking rewards are recorded
  823. let rewards = bank1.rewards.read().unwrap();
  824. rewards
  825. .iter()
  826. .find(|(_address, reward)| reward.reward_type == RewardType::Voting)
  827. .unwrap();
  828. // put another child bank, since partitioned staking rewards are delivered
  829. // after the epoch-boundary slot
  830. let bank2 = Bank::new_from_parent(bank1.clone(), &Pubkey::default(), bank1.slot() + 1);
  831. let rewards = bank2.rewards.read().unwrap();
  832. rewards
  833. .iter()
  834. .find(|(_address, reward)| reward.reward_type == RewardType::Staking)
  835. .unwrap();
  836. bank1.capitalization()
  837. }
  838. #[test]
  839. fn test_bank_update_rewards_determinism() {
  840. solana_logger::setup();
  841. // The same reward should be distributed given same credits
  842. let expected_capitalization = do_test_bank_update_rewards_determinism();
  843. // Repeat somewhat large number of iterations to expose possible different behavior
  844. // depending on the randomly-seeded HashMap ordering
  845. for _ in 0..30 {
  846. let actual_capitalization = do_test_bank_update_rewards_determinism();
  847. assert_eq!(actual_capitalization, expected_capitalization);
  848. }
  849. }
  850. impl VerifyAccountsHashConfig {
  851. fn default_for_test() -> Self {
  852. Self {
  853. require_rooted_bank: false,
  854. run_in_background: false,
  855. }
  856. }
  857. }
  858. // Test that purging 0 lamports accounts works.
  859. #[test]
  860. fn test_purge_empty_accounts() {
  861. // When using the write cache, flushing is destructive/cannot be undone
  862. // so we have to stop at various points and restart to actively test.
  863. for pass in 0..3 {
  864. solana_logger::setup();
  865. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(LAMPORTS_PER_SOL);
  866. let amount = genesis_config.rent.minimum_balance(0);
  867. let (mut bank, bank_forks) =
  868. Bank::new_for_tests(&genesis_config).wrap_with_bank_forks_for_tests();
  869. for _ in 0..10 {
  870. let blockhash = bank.last_blockhash();
  871. let pubkey = solana_pubkey::new_rand();
  872. let tx = system_transaction::transfer(&mint_keypair, &pubkey, 0, blockhash);
  873. bank.process_transaction(&tx).unwrap();
  874. bank.freeze();
  875. bank.squash();
  876. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  877. }
  878. bank.freeze();
  879. bank.squash();
  880. bank.force_flush_accounts_cache();
  881. let hash = bank.calculate_accounts_lt_hash_for_tests();
  882. bank.clean_accounts_for_tests();
  883. assert_eq!(bank.calculate_accounts_lt_hash_for_tests(), hash);
  884. let bank0 = new_from_parent_with_fork_next_slot(bank.clone(), bank_forks.as_ref());
  885. let blockhash = bank.last_blockhash();
  886. let keypair = Keypair::new();
  887. let tx = system_transaction::transfer(&mint_keypair, &keypair.pubkey(), amount, blockhash);
  888. bank0.process_transaction(&tx).unwrap();
  889. let bank1 = new_from_parent_with_fork_next_slot(bank0.clone(), bank_forks.as_ref());
  890. let pubkey = solana_pubkey::new_rand();
  891. let blockhash = bank.last_blockhash();
  892. let tx = system_transaction::transfer(&keypair, &pubkey, amount, blockhash);
  893. bank1.process_transaction(&tx).unwrap();
  894. assert_eq!(
  895. bank0.get_account(&keypair.pubkey()).unwrap().lamports(),
  896. amount
  897. );
  898. assert_eq!(bank1.get_account(&keypair.pubkey()), None);
  899. info!("bank0 purge");
  900. let hash = bank0.calculate_accounts_lt_hash_for_tests();
  901. bank0.clean_accounts_for_tests();
  902. assert_eq!(bank0.calculate_accounts_lt_hash_for_tests(), hash);
  903. assert_eq!(
  904. bank0.get_account(&keypair.pubkey()).unwrap().lamports(),
  905. amount
  906. );
  907. assert_eq!(bank1.get_account(&keypair.pubkey()), None);
  908. info!("bank1 purge");
  909. bank1.clean_accounts_for_tests();
  910. assert_eq!(
  911. bank0.get_account(&keypair.pubkey()).unwrap().lamports(),
  912. amount
  913. );
  914. assert_eq!(bank1.get_account(&keypair.pubkey()), None);
  915. if pass == 0 {
  916. add_root_and_flush_write_cache(&bank0);
  917. assert!(bank0.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  918. continue;
  919. }
  920. // Squash and then verify hash_internal value
  921. bank0.freeze();
  922. bank0.squash();
  923. add_root_and_flush_write_cache(&bank0);
  924. if pass == 1 {
  925. assert!(bank0.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  926. continue;
  927. }
  928. bank1.freeze();
  929. bank1.squash();
  930. add_root_and_flush_write_cache(&bank1);
  931. assert!(bank1.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  932. // keypair should have 0 tokens on both forks
  933. assert_eq!(bank0.get_account(&keypair.pubkey()), None);
  934. assert_eq!(bank1.get_account(&keypair.pubkey()), None);
  935. bank1.clean_accounts_for_tests();
  936. assert!(bank1.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  937. }
  938. }
  939. #[test]
  940. fn test_two_payments_to_one_party() {
  941. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  942. let pubkey = solana_pubkey::new_rand();
  943. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  944. let amount = genesis_config.rent.minimum_balance(0);
  945. assert_eq!(bank.last_blockhash(), genesis_config.hash());
  946. bank.transfer(amount, &mint_keypair, &pubkey).unwrap();
  947. assert_eq!(bank.get_balance(&pubkey), amount);
  948. bank.transfer(amount * 2, &mint_keypair, &pubkey).unwrap();
  949. assert_eq!(bank.get_balance(&pubkey), amount * 3);
  950. assert_eq!(bank.transaction_count(), 2);
  951. assert_eq!(bank.non_vote_transaction_count_since_restart(), 2);
  952. }
  953. #[test]
  954. fn test_one_source_two_tx_one_batch() {
  955. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(LAMPORTS_PER_SOL);
  956. let key1 = solana_pubkey::new_rand();
  957. let key2 = solana_pubkey::new_rand();
  958. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  959. let amount = genesis_config.rent.minimum_balance(0);
  960. assert_eq!(bank.last_blockhash(), genesis_config.hash());
  961. let t1 = system_transaction::transfer(&mint_keypair, &key1, amount, genesis_config.hash());
  962. let t2 = system_transaction::transfer(&mint_keypair, &key2, amount, genesis_config.hash());
  963. let txs = vec![t1.clone(), t2.clone()];
  964. let res = bank.process_transactions(txs.iter());
  965. assert_eq!(res.len(), 2);
  966. assert_eq!(res[0], Ok(()));
  967. assert_eq!(res[1], Err(TransactionError::AccountInUse));
  968. assert_eq!(
  969. bank.get_balance(&mint_keypair.pubkey()),
  970. LAMPORTS_PER_SOL - amount
  971. );
  972. assert_eq!(bank.get_balance(&key1), amount);
  973. assert_eq!(bank.get_balance(&key2), 0);
  974. assert_eq!(bank.get_signature_status(&t1.signatures[0]), Some(Ok(())));
  975. // TODO: Transactions that fail to pay a fee could be dropped silently.
  976. // Non-instruction errors don't get logged in the signature cache
  977. assert_eq!(bank.get_signature_status(&t2.signatures[0]), None);
  978. }
  979. #[test]
  980. fn test_one_tx_two_out_atomic_fail() {
  981. let amount = LAMPORTS_PER_SOL;
  982. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(amount);
  983. let key1 = solana_pubkey::new_rand();
  984. let key2 = solana_pubkey::new_rand();
  985. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  986. let instructions = system_instruction::transfer_many(
  987. &mint_keypair.pubkey(),
  988. &[(key1, amount), (key2, amount)],
  989. );
  990. let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
  991. let tx = Transaction::new(&[&mint_keypair], message, genesis_config.hash());
  992. assert_eq!(
  993. bank.process_transaction(&tx).unwrap_err(),
  994. TransactionError::InstructionError(1, SystemError::ResultWithNegativeLamports.into())
  995. );
  996. assert_eq!(bank.get_balance(&mint_keypair.pubkey()), amount);
  997. assert_eq!(bank.get_balance(&key1), 0);
  998. assert_eq!(bank.get_balance(&key2), 0);
  999. }
  1000. #[test]
  1001. fn test_one_tx_two_out_atomic_pass() {
  1002. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(LAMPORTS_PER_SOL);
  1003. let key1 = solana_pubkey::new_rand();
  1004. let key2 = solana_pubkey::new_rand();
  1005. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1006. let amount = genesis_config.rent.minimum_balance(0);
  1007. let instructions = system_instruction::transfer_many(
  1008. &mint_keypair.pubkey(),
  1009. &[(key1, amount), (key2, amount)],
  1010. );
  1011. let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
  1012. let tx = Transaction::new(&[&mint_keypair], message, genesis_config.hash());
  1013. bank.process_transaction(&tx).unwrap();
  1014. assert_eq!(
  1015. bank.get_balance(&mint_keypair.pubkey()),
  1016. LAMPORTS_PER_SOL - (2 * amount)
  1017. );
  1018. assert_eq!(bank.get_balance(&key1), amount);
  1019. assert_eq!(bank.get_balance(&key2), amount);
  1020. }
  1021. // This test demonstrates that fees are paid even when a program fails.
  1022. #[test]
  1023. fn test_detect_failed_duplicate_transactions() {
  1024. let (mut genesis_config, mint_keypair) = create_genesis_config(10_000);
  1025. genesis_config.fee_rate_governor = FeeRateGovernor::new(5_000, 0);
  1026. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1027. let dest = Keypair::new();
  1028. // source with 0 program context
  1029. let tx =
  1030. system_transaction::transfer(&mint_keypair, &dest.pubkey(), 10_000, genesis_config.hash());
  1031. let signature = tx.signatures[0];
  1032. assert!(!bank.has_signature(&signature));
  1033. assert_eq!(
  1034. bank.process_transaction(&tx),
  1035. Err(TransactionError::InstructionError(
  1036. 0,
  1037. SystemError::ResultWithNegativeLamports.into(),
  1038. ))
  1039. );
  1040. // The lamports didn't move, but the from address paid the transaction fee.
  1041. assert_eq!(bank.get_balance(&dest.pubkey()), 0);
  1042. // This should be the original balance minus the transaction fee.
  1043. assert_eq!(bank.get_balance(&mint_keypair.pubkey()), 5000);
  1044. }
  1045. #[test]
  1046. fn test_account_not_found() {
  1047. solana_logger::setup();
  1048. let (genesis_config, mint_keypair) = create_genesis_config(0);
  1049. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1050. let keypair = Keypair::new();
  1051. assert_eq!(
  1052. bank.transfer(
  1053. genesis_config.rent.minimum_balance(0),
  1054. &keypair,
  1055. &mint_keypair.pubkey()
  1056. ),
  1057. Err(TransactionError::AccountNotFound)
  1058. );
  1059. assert_eq!(bank.transaction_count(), 0);
  1060. assert_eq!(bank.non_vote_transaction_count_since_restart(), 0);
  1061. }
  1062. #[test]
  1063. fn test_insufficient_funds() {
  1064. let mint_amount = LAMPORTS_PER_SOL;
  1065. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(mint_amount);
  1066. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1067. let pubkey = solana_pubkey::new_rand();
  1068. let amount = genesis_config.rent.minimum_balance(0);
  1069. bank.transfer(amount, &mint_keypair, &pubkey).unwrap();
  1070. assert_eq!(bank.transaction_count(), 1);
  1071. assert_eq!(bank.non_vote_transaction_count_since_restart(), 1);
  1072. assert_eq!(bank.get_balance(&pubkey), amount);
  1073. assert_eq!(
  1074. bank.transfer((mint_amount - amount) + 1, &mint_keypair, &pubkey),
  1075. Err(TransactionError::InstructionError(
  1076. 0,
  1077. SystemError::ResultWithNegativeLamports.into(),
  1078. ))
  1079. );
  1080. // transaction_count returns the count of all committed transactions since
  1081. // bank_transaction_count_fix was activated, regardless of success
  1082. assert_eq!(bank.transaction_count(), 2);
  1083. assert_eq!(bank.non_vote_transaction_count_since_restart(), 2);
  1084. let mint_pubkey = mint_keypair.pubkey();
  1085. assert_eq!(bank.get_balance(&mint_pubkey), mint_amount - amount);
  1086. assert_eq!(bank.get_balance(&pubkey), amount);
  1087. }
  1088. #[test]
  1089. fn test_executed_transaction_count_post_bank_transaction_count_fix() {
  1090. let mint_amount = LAMPORTS_PER_SOL;
  1091. let (genesis_config, mint_keypair) = create_genesis_config(mint_amount);
  1092. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1093. let pubkey = solana_pubkey::new_rand();
  1094. let amount = genesis_config.rent.minimum_balance(0);
  1095. bank.transfer(amount, &mint_keypair, &pubkey).unwrap();
  1096. assert_eq!(
  1097. bank.transfer((mint_amount - amount) + 1, &mint_keypair, &pubkey),
  1098. Err(TransactionError::InstructionError(
  1099. 0,
  1100. SystemError::ResultWithNegativeLamports.into(),
  1101. ))
  1102. );
  1103. // With bank_transaction_count_fix, transaction_count should include both the successful and
  1104. // failed transactions.
  1105. assert_eq!(bank.transaction_count(), 2);
  1106. assert_eq!(bank.executed_transaction_count(), 2);
  1107. assert_eq!(bank.transaction_error_count(), 1);
  1108. let bank2 = new_bank_from_parent_with_bank_forks(
  1109. bank_forks.as_ref(),
  1110. bank,
  1111. &Pubkey::default(),
  1112. genesis_config.epoch_schedule.first_normal_slot,
  1113. );
  1114. assert_eq!(
  1115. bank2.transfer((mint_amount - amount) + 2, &mint_keypair, &pubkey),
  1116. Err(TransactionError::InstructionError(
  1117. 0,
  1118. SystemError::ResultWithNegativeLamports.into(),
  1119. ))
  1120. );
  1121. // The transaction_count inherited from parent bank is 3: 2 from the parent bank and 1 at this bank2
  1122. assert_eq!(bank2.transaction_count(), 3);
  1123. assert_eq!(bank2.executed_transaction_count(), 1);
  1124. assert_eq!(bank2.transaction_error_count(), 1);
  1125. }
  1126. #[test]
  1127. fn test_transfer_to_newb() {
  1128. solana_logger::setup();
  1129. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  1130. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1131. let amount = genesis_config.rent.minimum_balance(0);
  1132. let pubkey = solana_pubkey::new_rand();
  1133. bank.transfer(amount, &mint_keypair, &pubkey).unwrap();
  1134. assert_eq!(bank.get_balance(&pubkey), amount);
  1135. }
  1136. #[test]
  1137. fn test_transfer_to_sysvar() {
  1138. solana_logger::setup();
  1139. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  1140. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1141. let amount = genesis_config.rent.minimum_balance(0);
  1142. let normal_pubkey = solana_pubkey::new_rand();
  1143. let sysvar_pubkey = sysvar::clock::id();
  1144. assert_eq!(bank.get_balance(&normal_pubkey), 0);
  1145. assert_eq!(bank.get_balance(&sysvar_pubkey), 1_169_280);
  1146. bank.transfer(amount, &mint_keypair, &normal_pubkey)
  1147. .unwrap();
  1148. bank.transfer(amount, &mint_keypair, &sysvar_pubkey)
  1149. .unwrap_err();
  1150. assert_eq!(bank.get_balance(&normal_pubkey), amount);
  1151. assert_eq!(bank.get_balance(&sysvar_pubkey), 1_169_280);
  1152. let bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  1153. assert_eq!(bank.get_balance(&normal_pubkey), amount);
  1154. assert_eq!(bank.get_balance(&sysvar_pubkey), 1_169_280);
  1155. }
  1156. #[test]
  1157. fn test_bank_withdraw() {
  1158. let bank = create_simple_test_bank(100);
  1159. // Test no account
  1160. let key = solana_pubkey::new_rand();
  1161. assert_eq!(
  1162. bank.withdraw(&key, 10),
  1163. Err(TransactionError::AccountNotFound)
  1164. );
  1165. test_utils::deposit(&bank, &key, 3).unwrap();
  1166. assert_eq!(bank.get_balance(&key), 3);
  1167. // Low balance
  1168. assert_eq!(
  1169. bank.withdraw(&key, 10),
  1170. Err(TransactionError::InsufficientFundsForFee)
  1171. );
  1172. // Enough balance
  1173. assert_eq!(bank.withdraw(&key, 2), Ok(()));
  1174. assert_eq!(bank.get_balance(&key), 1);
  1175. }
  1176. #[test]
  1177. fn test_bank_withdraw_from_nonce_account() {
  1178. let (mut genesis_config, _mint_keypair) = create_genesis_config(100_000);
  1179. genesis_config.rent.lamports_per_byte_year = 42;
  1180. let bank = Bank::new_for_tests(&genesis_config);
  1181. let min_balance = bank.get_minimum_balance_for_rent_exemption(nonce::state::State::size());
  1182. let nonce = Keypair::new();
  1183. let nonce_account = AccountSharedData::new_data(
  1184. min_balance + 42,
  1185. &nonce::versions::Versions::new(nonce::state::State::Initialized(
  1186. nonce::state::Data::default(),
  1187. )),
  1188. &system_program::id(),
  1189. )
  1190. .unwrap();
  1191. bank.store_account(&nonce.pubkey(), &nonce_account);
  1192. assert_eq!(bank.get_balance(&nonce.pubkey()), min_balance + 42);
  1193. // Resulting in non-zero, but sub-min_balance balance fails
  1194. assert_eq!(
  1195. bank.withdraw(&nonce.pubkey(), min_balance / 2),
  1196. Err(TransactionError::InsufficientFundsForFee)
  1197. );
  1198. assert_eq!(bank.get_balance(&nonce.pubkey()), min_balance + 42);
  1199. // Resulting in exactly rent-exempt balance succeeds
  1200. bank.withdraw(&nonce.pubkey(), 42).unwrap();
  1201. assert_eq!(bank.get_balance(&nonce.pubkey()), min_balance);
  1202. // Account closure fails
  1203. assert_eq!(
  1204. bank.withdraw(&nonce.pubkey(), min_balance),
  1205. Err(TransactionError::InsufficientFundsForFee),
  1206. );
  1207. }
  1208. #[test]
  1209. fn test_bank_tx_fee() {
  1210. solana_logger::setup();
  1211. let arbitrary_transfer_amount = 42_000;
  1212. let mint = arbitrary_transfer_amount * 100;
  1213. let leader = solana_pubkey::new_rand();
  1214. let GenesisConfigInfo {
  1215. mut genesis_config,
  1216. mint_keypair,
  1217. ..
  1218. } = create_genesis_config_with_leader(mint, &leader, 3);
  1219. genesis_config.fee_rate_governor = FeeRateGovernor::new(5000, 0); // something divisible by 2
  1220. let expected_fee_paid = genesis_config
  1221. .fee_rate_governor
  1222. .create_fee_calculator()
  1223. .lamports_per_signature;
  1224. let (expected_fee_collected, expected_fee_burned) =
  1225. genesis_config.fee_rate_governor.burn(expected_fee_paid);
  1226. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1227. let capitalization = bank.capitalization();
  1228. let key = solana_pubkey::new_rand();
  1229. let tx = system_transaction::transfer(
  1230. &mint_keypair,
  1231. &key,
  1232. arbitrary_transfer_amount,
  1233. bank.last_blockhash(),
  1234. );
  1235. let initial_balance = bank.get_balance(&leader);
  1236. assert_eq!(bank.process_transaction(&tx), Ok(()));
  1237. assert_eq!(bank.get_balance(&key), arbitrary_transfer_amount);
  1238. assert_eq!(
  1239. bank.get_balance(&mint_keypair.pubkey()),
  1240. mint - arbitrary_transfer_amount - expected_fee_paid
  1241. );
  1242. assert_eq!(bank.get_balance(&leader), initial_balance);
  1243. goto_end_of_slot(bank.clone());
  1244. assert_eq!(bank.signature_count(), 1);
  1245. assert_eq!(
  1246. bank.get_balance(&leader),
  1247. initial_balance + expected_fee_collected
  1248. ); // Leader collects fee after the bank is frozen
  1249. // verify capitalization
  1250. let sysvar_and_builtin_program_delta = 1;
  1251. assert_eq!(
  1252. capitalization - expected_fee_burned + sysvar_and_builtin_program_delta,
  1253. bank.capitalization()
  1254. );
  1255. assert_eq!(
  1256. *bank.rewards.read().unwrap(),
  1257. vec![(
  1258. leader,
  1259. RewardInfo {
  1260. reward_type: RewardType::Fee,
  1261. lamports: expected_fee_collected as i64,
  1262. post_balance: initial_balance + expected_fee_collected,
  1263. commission: None,
  1264. }
  1265. )]
  1266. );
  1267. // Verify that an InstructionError collects fees, too
  1268. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &leader, 1);
  1269. let mut tx = system_transaction::transfer(&mint_keypair, &key, 1, bank.last_blockhash());
  1270. // Create a bogus instruction to system_program to cause an instruction error
  1271. tx.message.instructions[0].data[0] = 40;
  1272. bank.process_transaction(&tx)
  1273. .expect_err("instruction error");
  1274. assert_eq!(bank.get_balance(&key), arbitrary_transfer_amount); // no change
  1275. assert_eq!(
  1276. bank.get_balance(&mint_keypair.pubkey()),
  1277. mint - arbitrary_transfer_amount - 2 * expected_fee_paid
  1278. ); // mint_keypair still pays a fee
  1279. goto_end_of_slot(bank.clone());
  1280. assert_eq!(bank.signature_count(), 1);
  1281. // Profit! 2 transaction signatures processed at 3 lamports each
  1282. assert_eq!(
  1283. bank.get_balance(&leader),
  1284. initial_balance + 2 * expected_fee_collected
  1285. );
  1286. assert_eq!(
  1287. *bank.rewards.read().unwrap(),
  1288. vec![(
  1289. leader,
  1290. RewardInfo {
  1291. reward_type: RewardType::Fee,
  1292. lamports: expected_fee_collected as i64,
  1293. post_balance: initial_balance + 2 * expected_fee_collected,
  1294. commission: None,
  1295. }
  1296. )]
  1297. );
  1298. }
  1299. #[test]
  1300. fn test_bank_tx_compute_unit_fee() {
  1301. solana_logger::setup();
  1302. let key = solana_pubkey::new_rand();
  1303. let arbitrary_transfer_amount = 42;
  1304. let mint = arbitrary_transfer_amount * 10_000_000;
  1305. let leader = solana_pubkey::new_rand();
  1306. let GenesisConfigInfo {
  1307. mut genesis_config,
  1308. mint_keypair,
  1309. ..
  1310. } = create_genesis_config_with_leader(mint, &leader, 3);
  1311. genesis_config.fee_rate_governor = FeeRateGovernor::new(4, 0); // something divisible by 2
  1312. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1313. let expected_fee_paid = calculate_test_fee(
  1314. &new_sanitized_message(Message::new(&[], Some(&Pubkey::new_unique()))),
  1315. genesis_config
  1316. .fee_rate_governor
  1317. .create_fee_calculator()
  1318. .lamports_per_signature,
  1319. bank.fee_structure(),
  1320. );
  1321. let (expected_fee_collected, expected_fee_burned) =
  1322. genesis_config.fee_rate_governor.burn(expected_fee_paid);
  1323. let capitalization = bank.capitalization();
  1324. let tx = system_transaction::transfer(
  1325. &mint_keypair,
  1326. &key,
  1327. arbitrary_transfer_amount,
  1328. bank.last_blockhash(),
  1329. );
  1330. let initial_balance = bank.get_balance(&leader);
  1331. assert_eq!(bank.process_transaction(&tx), Ok(()));
  1332. assert_eq!(bank.get_balance(&key), arbitrary_transfer_amount);
  1333. assert_eq!(
  1334. bank.get_balance(&mint_keypair.pubkey()),
  1335. mint - arbitrary_transfer_amount - expected_fee_paid
  1336. );
  1337. assert_eq!(bank.get_balance(&leader), initial_balance);
  1338. goto_end_of_slot(bank.clone());
  1339. assert_eq!(bank.signature_count(), 1);
  1340. assert_eq!(
  1341. bank.get_balance(&leader),
  1342. initial_balance + expected_fee_collected
  1343. ); // Leader collects fee after the bank is frozen
  1344. // verify capitalization
  1345. let sysvar_and_builtin_program_delta = 1;
  1346. assert_eq!(
  1347. capitalization - expected_fee_burned + sysvar_and_builtin_program_delta,
  1348. bank.capitalization()
  1349. );
  1350. assert_eq!(
  1351. *bank.rewards.read().unwrap(),
  1352. vec![(
  1353. leader,
  1354. RewardInfo {
  1355. reward_type: RewardType::Fee,
  1356. lamports: expected_fee_collected as i64,
  1357. post_balance: initial_balance + expected_fee_collected,
  1358. commission: None,
  1359. }
  1360. )]
  1361. );
  1362. // Verify that an InstructionError collects fees, too
  1363. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &leader, 1);
  1364. let mut tx = system_transaction::transfer(&mint_keypair, &key, 1, bank.last_blockhash());
  1365. // Create a bogus instruction to system_program to cause an instruction error
  1366. tx.message.instructions[0].data[0] = 40;
  1367. bank.process_transaction(&tx)
  1368. .expect_err("instruction error");
  1369. assert_eq!(bank.get_balance(&key), arbitrary_transfer_amount); // no change
  1370. assert_eq!(
  1371. bank.get_balance(&mint_keypair.pubkey()),
  1372. mint - arbitrary_transfer_amount - 2 * expected_fee_paid
  1373. ); // mint_keypair still pays a fee
  1374. goto_end_of_slot(bank.clone());
  1375. assert_eq!(bank.signature_count(), 1);
  1376. // Profit! 2 transaction signatures processed at 3 lamports each
  1377. assert_eq!(
  1378. bank.get_balance(&leader),
  1379. initial_balance + 2 * expected_fee_collected
  1380. );
  1381. assert_eq!(
  1382. *bank.rewards.read().unwrap(),
  1383. vec![(
  1384. leader,
  1385. RewardInfo {
  1386. reward_type: RewardType::Fee,
  1387. lamports: expected_fee_collected as i64,
  1388. post_balance: initial_balance + 2 * expected_fee_collected,
  1389. commission: None,
  1390. }
  1391. )]
  1392. );
  1393. }
  1394. #[test]
  1395. fn test_bank_blockhash_fee_structure() {
  1396. //solana_logger::setup();
  1397. let leader = solana_pubkey::new_rand();
  1398. let GenesisConfigInfo {
  1399. mut genesis_config,
  1400. mint_keypair,
  1401. ..
  1402. } = create_genesis_config_with_leader(1_000_000, &leader, 3);
  1403. genesis_config
  1404. .fee_rate_governor
  1405. .target_lamports_per_signature = 5000;
  1406. genesis_config.fee_rate_governor.target_signatures_per_slot = 0;
  1407. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1408. goto_end_of_slot(bank.clone());
  1409. let cheap_blockhash = bank.last_blockhash();
  1410. let cheap_lamports_per_signature = bank.get_lamports_per_signature();
  1411. assert_eq!(cheap_lamports_per_signature, 0);
  1412. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &leader, 1);
  1413. goto_end_of_slot(bank.clone());
  1414. let expensive_blockhash = bank.last_blockhash();
  1415. let expensive_lamports_per_signature = bank.get_lamports_per_signature();
  1416. assert!(cheap_lamports_per_signature < expensive_lamports_per_signature);
  1417. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &leader, 2);
  1418. // Send a transfer using cheap_blockhash
  1419. let key = solana_pubkey::new_rand();
  1420. let initial_mint_balance = bank.get_balance(&mint_keypair.pubkey());
  1421. let tx = system_transaction::transfer(&mint_keypair, &key, 1, cheap_blockhash);
  1422. assert_eq!(bank.process_transaction(&tx), Ok(()));
  1423. assert_eq!(bank.get_balance(&key), 1);
  1424. let cheap_fee = calculate_test_fee(
  1425. &new_sanitized_message(Message::new(&[], Some(&Pubkey::new_unique()))),
  1426. cheap_lamports_per_signature,
  1427. bank.fee_structure(),
  1428. );
  1429. assert_eq!(
  1430. bank.get_balance(&mint_keypair.pubkey()),
  1431. initial_mint_balance - 1 - cheap_fee
  1432. );
  1433. // Send a transfer using expensive_blockhash
  1434. let key = solana_pubkey::new_rand();
  1435. let initial_mint_balance = bank.get_balance(&mint_keypair.pubkey());
  1436. let tx = system_transaction::transfer(&mint_keypair, &key, 1, expensive_blockhash);
  1437. assert_eq!(bank.process_transaction(&tx), Ok(()));
  1438. assert_eq!(bank.get_balance(&key), 1);
  1439. let expensive_fee = calculate_test_fee(
  1440. &new_sanitized_message(Message::new(&[], Some(&Pubkey::new_unique()))),
  1441. expensive_lamports_per_signature,
  1442. bank.fee_structure(),
  1443. );
  1444. assert_eq!(
  1445. bank.get_balance(&mint_keypair.pubkey()),
  1446. initial_mint_balance - 1 - expensive_fee
  1447. );
  1448. }
  1449. #[test]
  1450. fn test_bank_blockhash_compute_unit_fee_structure() {
  1451. //solana_logger::setup();
  1452. let leader = solana_pubkey::new_rand();
  1453. let GenesisConfigInfo {
  1454. mut genesis_config,
  1455. mint_keypair,
  1456. ..
  1457. } = create_genesis_config_with_leader(1_000_000_000, &leader, 3);
  1458. genesis_config
  1459. .fee_rate_governor
  1460. .target_lamports_per_signature = 1000;
  1461. genesis_config.fee_rate_governor.target_signatures_per_slot = 1;
  1462. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1463. goto_end_of_slot(bank.clone());
  1464. let cheap_blockhash = bank.last_blockhash();
  1465. let cheap_lamports_per_signature = bank.get_lamports_per_signature();
  1466. assert_eq!(cheap_lamports_per_signature, 0);
  1467. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &leader, 1);
  1468. goto_end_of_slot(bank.clone());
  1469. let expensive_blockhash = bank.last_blockhash();
  1470. let expensive_lamports_per_signature = bank.get_lamports_per_signature();
  1471. assert!(cheap_lamports_per_signature < expensive_lamports_per_signature);
  1472. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &leader, 2);
  1473. // Send a transfer using cheap_blockhash
  1474. let key = solana_pubkey::new_rand();
  1475. let initial_mint_balance = bank.get_balance(&mint_keypair.pubkey());
  1476. let tx = system_transaction::transfer(&mint_keypair, &key, 1, cheap_blockhash);
  1477. assert_eq!(bank.process_transaction(&tx), Ok(()));
  1478. assert_eq!(bank.get_balance(&key), 1);
  1479. let cheap_fee = calculate_test_fee(
  1480. &new_sanitized_message(Message::new(&[], Some(&Pubkey::new_unique()))),
  1481. cheap_lamports_per_signature,
  1482. bank.fee_structure(),
  1483. );
  1484. assert_eq!(
  1485. bank.get_balance(&mint_keypair.pubkey()),
  1486. initial_mint_balance - 1 - cheap_fee
  1487. );
  1488. // Send a transfer using expensive_blockhash
  1489. let key = solana_pubkey::new_rand();
  1490. let initial_mint_balance = bank.get_balance(&mint_keypair.pubkey());
  1491. let tx = system_transaction::transfer(&mint_keypair, &key, 1, expensive_blockhash);
  1492. assert_eq!(bank.process_transaction(&tx), Ok(()));
  1493. assert_eq!(bank.get_balance(&key), 1);
  1494. let expensive_fee = calculate_test_fee(
  1495. &new_sanitized_message(Message::new(&[], Some(&Pubkey::new_unique()))),
  1496. expensive_lamports_per_signature,
  1497. bank.fee_structure(),
  1498. );
  1499. assert_eq!(
  1500. bank.get_balance(&mint_keypair.pubkey()),
  1501. initial_mint_balance - 1 - expensive_fee
  1502. );
  1503. }
  1504. #[test]
  1505. fn test_debits_before_credits() {
  1506. let (genesis_config, mint_keypair) =
  1507. create_genesis_config_no_tx_fee_no_rent(2 * LAMPORTS_PER_SOL);
  1508. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1509. let keypair = Keypair::new();
  1510. let tx0 = system_transaction::transfer(
  1511. &keypair,
  1512. &mint_keypair.pubkey(),
  1513. LAMPORTS_PER_SOL,
  1514. genesis_config.hash(),
  1515. );
  1516. let tx1 = system_transaction::transfer(
  1517. &mint_keypair,
  1518. &keypair.pubkey(),
  1519. 2 * LAMPORTS_PER_SOL,
  1520. genesis_config.hash(),
  1521. );
  1522. let txs = vec![tx0, tx1];
  1523. let results = bank.process_transactions(txs.iter());
  1524. assert!(results[0].is_err());
  1525. // Assert bad transactions aren't counted.
  1526. assert_eq!(bank.transaction_count(), 1);
  1527. assert_eq!(bank.non_vote_transaction_count_since_restart(), 1);
  1528. }
  1529. #[test_case(false; "old")]
  1530. #[test_case(true; "simd83")]
  1531. fn test_readonly_accounts(relax_intrabatch_account_locks: bool) {
  1532. let GenesisConfigInfo {
  1533. genesis_config,
  1534. mint_keypair,
  1535. ..
  1536. } = create_genesis_config_with_leader(500, &solana_pubkey::new_rand(), 0);
  1537. let mut bank = Bank::new_for_tests(&genesis_config);
  1538. if !relax_intrabatch_account_locks {
  1539. bank.deactivate_feature(&feature_set::relax_intrabatch_account_locks::id());
  1540. }
  1541. let next_slot = bank.slot() + 1;
  1542. let bank = Bank::new_from_parent(Arc::new(bank), &Pubkey::default(), next_slot);
  1543. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  1544. let vote_pubkey0 = solana_pubkey::new_rand();
  1545. let vote_pubkey1 = solana_pubkey::new_rand();
  1546. let vote_pubkey2 = solana_pubkey::new_rand();
  1547. let authorized_voter = Keypair::new();
  1548. let payer0 = Keypair::new();
  1549. let payer1 = Keypair::new();
  1550. // Create vote accounts
  1551. let vote_account0 = vote_state::create_account_with_authorized(
  1552. &vote_pubkey0,
  1553. &authorized_voter.pubkey(),
  1554. &authorized_voter.pubkey(),
  1555. 0,
  1556. 100,
  1557. );
  1558. let vote_account1 = vote_state::create_account_with_authorized(
  1559. &vote_pubkey1,
  1560. &authorized_voter.pubkey(),
  1561. &authorized_voter.pubkey(),
  1562. 0,
  1563. 100,
  1564. );
  1565. let vote_account2 = vote_state::create_account_with_authorized(
  1566. &vote_pubkey2,
  1567. &authorized_voter.pubkey(),
  1568. &authorized_voter.pubkey(),
  1569. 0,
  1570. 100,
  1571. );
  1572. bank.store_account(&vote_pubkey0, &vote_account0);
  1573. bank.store_account(&vote_pubkey1, &vote_account1);
  1574. bank.store_account(&vote_pubkey2, &vote_account2);
  1575. // Fund payers
  1576. bank.transfer(10, &mint_keypair, &payer0.pubkey()).unwrap();
  1577. bank.transfer(10, &mint_keypair, &payer1.pubkey()).unwrap();
  1578. bank.transfer(1, &mint_keypair, &authorized_voter.pubkey())
  1579. .unwrap();
  1580. let vote = TowerSync::new_from_slot(bank.parent_slot, bank.parent_hash);
  1581. let ix0 = vote_instruction::tower_sync(&vote_pubkey0, &authorized_voter.pubkey(), vote.clone());
  1582. let tx0 = Transaction::new_signed_with_payer(
  1583. &[ix0],
  1584. Some(&payer0.pubkey()),
  1585. &[&payer0, &authorized_voter],
  1586. bank.last_blockhash(),
  1587. );
  1588. let ix1 = vote_instruction::tower_sync(&vote_pubkey1, &authorized_voter.pubkey(), vote.clone());
  1589. let tx1 = Transaction::new_signed_with_payer(
  1590. &[ix1],
  1591. Some(&payer1.pubkey()),
  1592. &[&payer1, &authorized_voter],
  1593. bank.last_blockhash(),
  1594. );
  1595. let txs = vec![tx0, tx1];
  1596. let results = bank.process_transactions(txs.iter());
  1597. // If multiple transactions attempt to read the same account, they should succeed.
  1598. // Vote authorized_voter and sysvar accounts are given read-only handling
  1599. assert_eq!(results[0], Ok(()));
  1600. assert_eq!(results[1], Ok(()));
  1601. let ix0 = vote_instruction::tower_sync(&vote_pubkey2, &authorized_voter.pubkey(), vote);
  1602. let tx0 = Transaction::new_signed_with_payer(
  1603. &[ix0],
  1604. Some(&payer0.pubkey()),
  1605. &[&payer0, &authorized_voter],
  1606. bank.last_blockhash(),
  1607. );
  1608. let tx1 = system_transaction::transfer(
  1609. &authorized_voter,
  1610. &solana_pubkey::new_rand(),
  1611. 1,
  1612. bank.last_blockhash(),
  1613. );
  1614. let txs = vec![tx0, tx1];
  1615. let results = bank.process_transactions(txs.iter());
  1616. // Whether an account can be locked as read-only and writable at the same time depends on features.
  1617. assert_eq!(results[0], Ok(()));
  1618. assert_eq!(
  1619. results[1],
  1620. if relax_intrabatch_account_locks {
  1621. Ok(())
  1622. } else {
  1623. Err(TransactionError::AccountInUse)
  1624. }
  1625. );
  1626. }
  1627. #[test]
  1628. fn test_interleaving_locks() {
  1629. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  1630. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1631. let alice = Keypair::new();
  1632. let bob = Keypair::new();
  1633. let amount = genesis_config.rent.minimum_balance(0);
  1634. let tx1 = system_transaction::transfer(
  1635. &mint_keypair,
  1636. &alice.pubkey(),
  1637. amount,
  1638. genesis_config.hash(),
  1639. );
  1640. let pay_alice = vec![tx1];
  1641. let lock_result = bank.prepare_batch_for_tests(pay_alice);
  1642. let commit_results = bank
  1643. .load_execute_and_commit_transactions(
  1644. &lock_result,
  1645. MAX_PROCESSING_AGE,
  1646. ExecutionRecordingConfig::new_single_setting(false),
  1647. &mut ExecuteTimings::default(),
  1648. None,
  1649. )
  1650. .0;
  1651. assert!(commit_results[0].is_ok());
  1652. // try executing an interleaved transfer twice
  1653. assert_eq!(
  1654. bank.transfer(amount, &mint_keypair, &bob.pubkey()),
  1655. Err(TransactionError::AccountInUse)
  1656. );
  1657. // the second time should fail as well
  1658. // this verifies that `unlock_accounts` doesn't unlock `AccountInUse` accounts
  1659. assert_eq!(
  1660. bank.transfer(amount, &mint_keypair, &bob.pubkey()),
  1661. Err(TransactionError::AccountInUse)
  1662. );
  1663. drop(lock_result);
  1664. assert!(bank
  1665. .transfer(2 * amount, &mint_keypair, &bob.pubkey())
  1666. .is_ok());
  1667. }
  1668. #[test]
  1669. fn test_load_and_execute_commit_transactions_fees_only() {
  1670. let GenesisConfigInfo {
  1671. mut genesis_config, ..
  1672. } = genesis_utils::create_genesis_config(100 * LAMPORTS_PER_SOL);
  1673. genesis_config.rent = Rent::default();
  1674. genesis_config.fee_rate_governor = FeeRateGovernor::new(5000, 0);
  1675. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1676. let bank = Bank::new_from_parent(
  1677. bank,
  1678. &Pubkey::new_unique(),
  1679. genesis_config.epoch_schedule.get_first_slot_in_epoch(1),
  1680. );
  1681. // Use rent-paying fee payer to show that rent is not collected for fees
  1682. // only transactions even when they use a rent-paying account.
  1683. let rent_paying_fee_payer = Pubkey::new_unique();
  1684. bank.store_account(
  1685. &rent_paying_fee_payer,
  1686. &AccountSharedData::new(
  1687. genesis_config.rent.minimum_balance(0) - 1,
  1688. 0,
  1689. &system_program::id(),
  1690. ),
  1691. );
  1692. // Use nonce to show that loaded account stats also included loaded
  1693. // nonce account size
  1694. let nonce_size = nonce::state::State::size();
  1695. let nonce_balance = genesis_config.rent.minimum_balance(nonce_size);
  1696. let nonce_pubkey = Pubkey::new_unique();
  1697. let nonce_authority = rent_paying_fee_payer;
  1698. let nonce_initial_hash = DurableNonce::from_blockhash(&Hash::new_unique());
  1699. let nonce_data = nonce::state::Data::new(nonce_authority, nonce_initial_hash, 5000);
  1700. let nonce_account = AccountSharedData::new_data(
  1701. nonce_balance,
  1702. &nonce::versions::Versions::new(nonce::state::State::Initialized(nonce_data.clone())),
  1703. &system_program::id(),
  1704. )
  1705. .unwrap();
  1706. bank.store_account(&nonce_pubkey, &nonce_account);
  1707. // Invoke missing program to trigger load error in order to commit a
  1708. // fees-only transaction
  1709. let missing_program_id = Pubkey::new_unique();
  1710. let transaction = Transaction::new_unsigned(Message::new_with_blockhash(
  1711. &[
  1712. system_instruction::advance_nonce_account(&nonce_pubkey, &rent_paying_fee_payer),
  1713. Instruction::new_with_bincode(missing_program_id, &0, vec![]),
  1714. ],
  1715. Some(&rent_paying_fee_payer),
  1716. &nonce_data.blockhash(),
  1717. ));
  1718. let batch = bank.prepare_batch_for_tests(vec![transaction]);
  1719. let commit_results = bank
  1720. .load_execute_and_commit_transactions(
  1721. &batch,
  1722. MAX_PROCESSING_AGE,
  1723. ExecutionRecordingConfig::new_single_setting(true),
  1724. &mut ExecuteTimings::default(),
  1725. None,
  1726. )
  1727. .0;
  1728. assert_eq!(
  1729. commit_results,
  1730. vec![Ok(CommittedTransaction {
  1731. status: Err(TransactionError::ProgramAccountNotFound),
  1732. log_messages: None,
  1733. inner_instructions: None,
  1734. return_data: None,
  1735. executed_units: 0,
  1736. fee_details: FeeDetails::new(5000, 0),
  1737. loaded_account_stats: TransactionLoadedAccountsStats {
  1738. loaded_accounts_count: 2,
  1739. loaded_accounts_data_size: nonce_size as u32,
  1740. },
  1741. })]
  1742. );
  1743. }
  1744. #[test]
  1745. fn test_readonly_relaxed_locks() {
  1746. let (genesis_config, _) = create_genesis_config(3);
  1747. let bank = Bank::new_for_tests(&genesis_config);
  1748. let key0 = Keypair::new();
  1749. let key1 = Keypair::new();
  1750. let key2 = Keypair::new();
  1751. let key3 = solana_pubkey::new_rand();
  1752. let message = Message {
  1753. header: MessageHeader {
  1754. num_required_signatures: 1,
  1755. num_readonly_signed_accounts: 0,
  1756. num_readonly_unsigned_accounts: 1,
  1757. },
  1758. account_keys: vec![key0.pubkey(), key3],
  1759. recent_blockhash: Hash::default(),
  1760. instructions: vec![],
  1761. };
  1762. let tx = Transaction::new(&[&key0], message, genesis_config.hash());
  1763. let txs = vec![tx];
  1764. let batch0 = bank.prepare_batch_for_tests(txs);
  1765. assert!(batch0.lock_results()[0].is_ok());
  1766. // Try locking accounts, locking a previously read-only account as writable
  1767. // should fail
  1768. let message = Message {
  1769. header: MessageHeader {
  1770. num_required_signatures: 1,
  1771. num_readonly_signed_accounts: 0,
  1772. num_readonly_unsigned_accounts: 0,
  1773. },
  1774. account_keys: vec![key1.pubkey(), key3],
  1775. recent_blockhash: Hash::default(),
  1776. instructions: vec![],
  1777. };
  1778. let tx = Transaction::new(&[&key1], message, genesis_config.hash());
  1779. let txs = vec![tx];
  1780. let batch1 = bank.prepare_batch_for_tests(txs);
  1781. assert!(batch1.lock_results()[0].is_err());
  1782. // Try locking a previously read-only account a 2nd time; should succeed
  1783. let message = Message {
  1784. header: MessageHeader {
  1785. num_required_signatures: 1,
  1786. num_readonly_signed_accounts: 0,
  1787. num_readonly_unsigned_accounts: 1,
  1788. },
  1789. account_keys: vec![key2.pubkey(), key3],
  1790. recent_blockhash: Hash::default(),
  1791. instructions: vec![],
  1792. };
  1793. let tx = Transaction::new(&[&key2], message, genesis_config.hash());
  1794. let txs = vec![tx];
  1795. let batch2 = bank.prepare_batch_for_tests(txs);
  1796. assert!(batch2.lock_results()[0].is_ok());
  1797. }
  1798. #[test]
  1799. fn test_bank_invalid_account_index() {
  1800. let (genesis_config, mint_keypair) = create_genesis_config(1);
  1801. let keypair = Keypair::new();
  1802. let bank = Bank::new_for_tests(&genesis_config);
  1803. let tx =
  1804. system_transaction::transfer(&mint_keypair, &keypair.pubkey(), 1, genesis_config.hash());
  1805. let mut tx_invalid_program_index = tx.clone();
  1806. tx_invalid_program_index.message.instructions[0].program_id_index = 42;
  1807. assert_eq!(
  1808. bank.process_transaction(&tx_invalid_program_index),
  1809. Err(TransactionError::SanitizeFailure)
  1810. );
  1811. let mut tx_invalid_account_index = tx;
  1812. tx_invalid_account_index.message.instructions[0].accounts[0] = 42;
  1813. assert_eq!(
  1814. bank.process_transaction(&tx_invalid_account_index),
  1815. Err(TransactionError::SanitizeFailure)
  1816. );
  1817. }
  1818. #[test]
  1819. fn test_bank_pay_to_self() {
  1820. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(LAMPORTS_PER_SOL);
  1821. let key1 = Keypair::new();
  1822. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1823. let amount = genesis_config.rent.minimum_balance(0);
  1824. bank.transfer(amount, &mint_keypair, &key1.pubkey())
  1825. .unwrap();
  1826. assert_eq!(bank.get_balance(&key1.pubkey()), amount);
  1827. let tx = system_transaction::transfer(&key1, &key1.pubkey(), amount, genesis_config.hash());
  1828. let _res = bank.process_transaction(&tx);
  1829. assert_eq!(bank.get_balance(&key1.pubkey()), amount);
  1830. bank.get_signature_status(&tx.signatures[0])
  1831. .unwrap()
  1832. .unwrap();
  1833. }
  1834. fn new_from_parent(parent: Arc<Bank>) -> Bank {
  1835. let slot = parent.slot() + 1;
  1836. let collector_id = Pubkey::default();
  1837. Bank::new_from_parent(parent, &collector_id, slot)
  1838. }
  1839. fn new_from_parent_with_fork_next_slot(parent: Arc<Bank>, fork: &RwLock<BankForks>) -> Arc<Bank> {
  1840. let slot = parent.slot() + 1;
  1841. new_bank_from_parent_with_bank_forks(fork, parent, &Pubkey::default(), slot)
  1842. }
  1843. /// Verify that the parent's vector is computed correctly
  1844. #[test]
  1845. fn test_bank_parents() {
  1846. let (genesis_config, _) = create_genesis_config(1);
  1847. let parent = Arc::new(Bank::new_for_tests(&genesis_config));
  1848. let bank = new_from_parent(parent.clone());
  1849. assert!(Arc::ptr_eq(&bank.parents()[0], &parent));
  1850. }
  1851. /// Verifies that transactions are dropped if they have already been processed
  1852. #[test]
  1853. fn test_tx_already_processed() {
  1854. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  1855. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1856. let key1 = Keypair::new();
  1857. let mut tx = system_transaction::transfer(
  1858. &mint_keypair,
  1859. &key1.pubkey(),
  1860. genesis_config.rent.minimum_balance(0),
  1861. genesis_config.hash(),
  1862. );
  1863. // First process `tx` so that the status cache is updated
  1864. assert_eq!(bank.process_transaction(&tx), Ok(()));
  1865. // Ensure that signature check works
  1866. assert_eq!(
  1867. bank.process_transaction(&tx),
  1868. Err(TransactionError::AlreadyProcessed)
  1869. );
  1870. // Change transaction signature to simulate processing a transaction with a different signature
  1871. // for the same message.
  1872. tx.signatures[0] = Signature::default();
  1873. // Ensure that message hash check works
  1874. assert_eq!(
  1875. bank.process_transaction(&tx),
  1876. Err(TransactionError::AlreadyProcessed)
  1877. );
  1878. }
  1879. /// Verifies that last ids and status cache are correctly referenced from parent
  1880. #[test]
  1881. fn test_bank_parent_already_processed() {
  1882. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  1883. let key1 = Keypair::new();
  1884. let (parent, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1885. let amount = genesis_config.rent.minimum_balance(0);
  1886. let tx =
  1887. system_transaction::transfer(&mint_keypair, &key1.pubkey(), amount, genesis_config.hash());
  1888. assert_eq!(parent.process_transaction(&tx), Ok(()));
  1889. let bank = new_from_parent_with_fork_next_slot(parent, bank_forks.as_ref());
  1890. assert_eq!(
  1891. bank.process_transaction(&tx),
  1892. Err(TransactionError::AlreadyProcessed)
  1893. );
  1894. }
  1895. /// Verifies that last ids and accounts are correctly referenced from parent
  1896. #[test]
  1897. fn test_bank_parent_account_spend() {
  1898. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(LAMPORTS_PER_SOL);
  1899. let key1 = Keypair::new();
  1900. let key2 = Keypair::new();
  1901. let (parent, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1902. let amount = genesis_config.rent.minimum_balance(0);
  1903. let tx =
  1904. system_transaction::transfer(&mint_keypair, &key1.pubkey(), amount, genesis_config.hash());
  1905. assert_eq!(parent.process_transaction(&tx), Ok(()));
  1906. let bank = new_from_parent_with_fork_next_slot(parent.clone(), bank_forks.as_ref());
  1907. let tx = system_transaction::transfer(&key1, &key2.pubkey(), amount, genesis_config.hash());
  1908. assert_eq!(bank.process_transaction(&tx), Ok(()));
  1909. assert_eq!(parent.get_signature_status(&tx.signatures[0]), None);
  1910. }
  1911. #[test]
  1912. fn test_bank_hash_internal_state() {
  1913. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(LAMPORTS_PER_SOL);
  1914. let (bank0, _bank_forks0) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1915. let (bank1, bank_forks1) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1916. let initial_state = bank0.hash_internal_state();
  1917. assert_eq!(bank1.hash_internal_state(), initial_state);
  1918. // Ensure calling hash_internal_state() again does *not* change the bank hash value
  1919. assert_eq!(bank1.hash_internal_state(), initial_state);
  1920. let amount = genesis_config.rent.minimum_balance(0);
  1921. let pubkey = solana_pubkey::new_rand();
  1922. bank0.transfer(amount, &mint_keypair, &pubkey).unwrap();
  1923. bank0.freeze();
  1924. assert_ne!(bank0.hash_internal_state(), initial_state);
  1925. bank1.transfer(amount, &mint_keypair, &pubkey).unwrap();
  1926. bank1.freeze();
  1927. assert_eq!(bank0.hash_internal_state(), bank1.hash_internal_state());
  1928. // Checkpointing should always result in a new state
  1929. let bank2 = new_from_parent_with_fork_next_slot(bank1, &bank_forks1);
  1930. assert_ne!(bank0.hash_internal_state(), bank2.hash_internal_state());
  1931. let pubkey2 = solana_pubkey::new_rand();
  1932. bank2.transfer(amount, &mint_keypair, &pubkey2).unwrap();
  1933. bank2.squash();
  1934. bank2.force_flush_accounts_cache();
  1935. assert!(bank2.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  1936. }
  1937. #[test]
  1938. fn test_bank_hash_internal_state_verify() {
  1939. for pass in 0..4 {
  1940. let (genesis_config, mint_keypair) =
  1941. create_genesis_config_no_tx_fee_no_rent(LAMPORTS_PER_SOL);
  1942. let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  1943. let amount = genesis_config.rent.minimum_balance(0);
  1944. let pubkey = solana_pubkey::new_rand();
  1945. bank0.transfer(amount, &mint_keypair, &pubkey).unwrap();
  1946. let bank0_state = bank0.hash_internal_state();
  1947. // Checkpointing should result in a new state while freezing the parent
  1948. let bank2 = new_bank_from_parent_with_bank_forks(
  1949. &bank_forks,
  1950. bank0.clone(),
  1951. &solana_pubkey::new_rand(),
  1952. 2,
  1953. );
  1954. assert_ne!(bank0_state, bank2.hash_internal_state());
  1955. // Checkpointing should modify the checkpoint's state when freezed
  1956. assert_ne!(bank0_state, bank0.hash_internal_state());
  1957. // Checkpointing should never modify the checkpoint's state once frozen
  1958. add_root_and_flush_write_cache(&bank0);
  1959. let bank0_state = bank0.hash_internal_state();
  1960. if pass == 0 {
  1961. // we later modify bank 2, so this flush is destructive to the test
  1962. bank2.freeze();
  1963. add_root_and_flush_write_cache(&bank2);
  1964. assert!(bank2.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  1965. }
  1966. let bank3 = new_bank_from_parent_with_bank_forks(
  1967. &bank_forks,
  1968. bank0.clone(),
  1969. &solana_pubkey::new_rand(),
  1970. 3,
  1971. );
  1972. assert_eq!(bank0_state, bank0.hash_internal_state());
  1973. if pass == 0 {
  1974. // this relies on us having set bank2's accounts hash in the pass==0 if above
  1975. assert!(bank2.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  1976. continue;
  1977. }
  1978. if pass == 1 {
  1979. // flushing slot 3 here causes us to mark it as a root. Marking it as a root
  1980. // prevents us from marking slot 2 as a root later since slot 2 is < slot 3.
  1981. // Doing so throws an assert. So, we can't flush 3 until 2 is flushed.
  1982. bank3.freeze();
  1983. add_root_and_flush_write_cache(&bank3);
  1984. assert!(bank3.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  1985. continue;
  1986. }
  1987. let pubkey2 = solana_pubkey::new_rand();
  1988. bank2.transfer(amount, &mint_keypair, &pubkey2).unwrap();
  1989. bank2.freeze(); // <-- keep freeze() *outside* `if pass == 2 {}`
  1990. if pass == 2 {
  1991. add_root_and_flush_write_cache(&bank2);
  1992. assert!(bank2.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  1993. // Verifying the accounts lt hash is only intended to be called at startup, and
  1994. // normally in the background. Since here we're *not* at startup, and doing it
  1995. // in the foreground, the verification uses the accounts index. The test just
  1996. // rooted bank2, and will root bank3 next; but they are on different forks,
  1997. // which is not valid. This causes the accounts index to see accounts from
  1998. // bank2 and bank3, which causes verifying bank3's accounts lt hash to fail.
  1999. // To workaround this "issue", we cannot root bank2 when the accounts lt hash
  2000. // is enabled.
  2001. continue;
  2002. }
  2003. bank3.freeze();
  2004. add_root_and_flush_write_cache(&bank3);
  2005. assert!(bank3.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  2006. }
  2007. }
  2008. #[test]
  2009. #[should_panic(expected = "self.is_frozen()")]
  2010. fn test_verify_hash_unfrozen() {
  2011. let bank = create_simple_test_bank(2_000);
  2012. assert!(bank.verify_hash());
  2013. }
  2014. #[test]
  2015. fn test_verify_snapshot_bank() {
  2016. solana_logger::setup();
  2017. let pubkey = solana_pubkey::new_rand();
  2018. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  2019. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2020. bank.transfer(
  2021. genesis_config.rent.minimum_balance(0),
  2022. &mint_keypair,
  2023. &pubkey,
  2024. )
  2025. .unwrap();
  2026. bank.freeze();
  2027. add_root_and_flush_write_cache(&bank);
  2028. assert!(bank.verify_snapshot_bank(false, false, bank.slot(), None));
  2029. // tamper the bank after freeze!
  2030. bank.increment_signature_count(1);
  2031. assert!(!bank.verify_snapshot_bank(false, false, bank.slot(), None));
  2032. }
  2033. // Test that two bank forks with the same transactions should not hash to the same value.
  2034. #[test]
  2035. fn test_bank_hash_same_transactions_different_fork() {
  2036. solana_logger::setup();
  2037. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  2038. let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2039. bank0.freeze();
  2040. // send the same transfer to both forks
  2041. let pubkey = solana_pubkey::new_rand();
  2042. let amount = genesis_config.rent.minimum_balance(0);
  2043. let bank1 = new_bank_from_parent_with_bank_forks(
  2044. bank_forks.as_ref(),
  2045. bank0.clone(),
  2046. &Pubkey::default(),
  2047. 1,
  2048. );
  2049. bank1.transfer(amount, &mint_keypair, &pubkey).unwrap();
  2050. bank1.freeze();
  2051. let bank2 = new_bank_from_parent_with_bank_forks(
  2052. bank_forks.as_ref(),
  2053. bank0.clone(),
  2054. &Pubkey::default(),
  2055. 2,
  2056. );
  2057. bank2.transfer(amount, &mint_keypair, &pubkey).unwrap();
  2058. bank2.freeze();
  2059. let bank0_hash = bank0.hash();
  2060. let bank1_hash = bank1.hash();
  2061. let bank2_hash = bank2.hash();
  2062. assert_ne!(bank0_hash, bank1_hash);
  2063. assert_ne!(bank0_hash, bank2_hash);
  2064. assert_ne!(bank1_hash, bank2_hash);
  2065. }
  2066. #[test]
  2067. fn test_hash_internal_state_genesis() {
  2068. let bank0 = Bank::new_for_tests(&create_genesis_config(10).0);
  2069. let bank1 = Bank::new_for_tests(&create_genesis_config(20).0);
  2070. assert_ne!(bank0.hash_internal_state(), bank1.hash_internal_state());
  2071. }
  2072. // See that the order of two transfers does not affect the result
  2073. // of hash_internal_state
  2074. #[test]
  2075. fn test_hash_internal_state_order() {
  2076. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  2077. let amount = genesis_config.rent.minimum_balance(0);
  2078. let (bank0, _bank_forks0) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2079. let (bank1, _bank_forks1) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2080. assert_eq!(bank0.hash_internal_state(), bank1.hash_internal_state());
  2081. let key0 = solana_pubkey::new_rand();
  2082. let key1 = solana_pubkey::new_rand();
  2083. bank0.transfer(amount, &mint_keypair, &key0).unwrap();
  2084. bank0.transfer(amount * 2, &mint_keypair, &key1).unwrap();
  2085. bank1.transfer(amount * 2, &mint_keypair, &key1).unwrap();
  2086. bank1.transfer(amount, &mint_keypair, &key0).unwrap();
  2087. assert_eq!(bank0.hash_internal_state(), bank1.hash_internal_state());
  2088. }
  2089. #[test]
  2090. fn test_hash_internal_state_error() {
  2091. solana_logger::setup();
  2092. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  2093. let amount = genesis_config.rent.minimum_balance(0);
  2094. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2095. let key0 = solana_pubkey::new_rand();
  2096. bank.transfer(amount, &mint_keypair, &key0).unwrap();
  2097. let orig = bank.hash_internal_state();
  2098. // Transfer will error but still take a fee
  2099. assert!(bank
  2100. .transfer(LAMPORTS_PER_SOL, &mint_keypair, &key0)
  2101. .is_err());
  2102. assert_ne!(orig, bank.hash_internal_state());
  2103. let orig = bank.hash_internal_state();
  2104. let empty_keypair = Keypair::new();
  2105. assert!(bank.transfer(amount, &empty_keypair, &key0).is_err());
  2106. assert_eq!(orig, bank.hash_internal_state());
  2107. }
  2108. #[test]
  2109. fn test_bank_hash_internal_state_squash() {
  2110. let collector_id = Pubkey::default();
  2111. let bank0 = Arc::new(Bank::new_for_tests(&create_genesis_config(10).0));
  2112. let hash0 = bank0.hash_internal_state();
  2113. // save hash0 because new_from_parent
  2114. // updates sysvar entries
  2115. let bank1 = Bank::new_from_parent(bank0, &collector_id, 1);
  2116. // no delta in bank1, hashes should always update
  2117. assert_ne!(hash0, bank1.hash_internal_state());
  2118. // remove parent
  2119. bank1.squash();
  2120. assert!(bank1.parents().is_empty());
  2121. }
  2122. /// Verifies that last ids and accounts are correctly referenced from parent
  2123. #[test]
  2124. fn test_bank_squash() {
  2125. solana_logger::setup();
  2126. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(2 * LAMPORTS_PER_SOL);
  2127. let key1 = Keypair::new();
  2128. let key2 = Keypair::new();
  2129. let (parent, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2130. let amount = genesis_config.rent.minimum_balance(0);
  2131. let tx_transfer_mint_to_1 =
  2132. system_transaction::transfer(&mint_keypair, &key1.pubkey(), amount, genesis_config.hash());
  2133. trace!("parent process tx ");
  2134. assert_eq!(parent.process_transaction(&tx_transfer_mint_to_1), Ok(()));
  2135. trace!("done parent process tx ");
  2136. assert_eq!(parent.transaction_count(), 1);
  2137. assert_eq!(parent.non_vote_transaction_count_since_restart(), 1);
  2138. assert_eq!(
  2139. parent.get_signature_status(&tx_transfer_mint_to_1.signatures[0]),
  2140. Some(Ok(()))
  2141. );
  2142. trace!("new from parent");
  2143. let bank = new_from_parent_with_fork_next_slot(parent.clone(), bank_forks.as_ref());
  2144. trace!("done new from parent");
  2145. assert_eq!(
  2146. bank.get_signature_status(&tx_transfer_mint_to_1.signatures[0]),
  2147. Some(Ok(()))
  2148. );
  2149. assert_eq!(bank.transaction_count(), parent.transaction_count());
  2150. assert_eq!(
  2151. bank.non_vote_transaction_count_since_restart(),
  2152. parent.non_vote_transaction_count_since_restart()
  2153. );
  2154. let tx_transfer_1_to_2 =
  2155. system_transaction::transfer(&key1, &key2.pubkey(), amount, genesis_config.hash());
  2156. assert_eq!(bank.process_transaction(&tx_transfer_1_to_2), Ok(()));
  2157. assert_eq!(bank.transaction_count(), 2);
  2158. assert_eq!(bank.non_vote_transaction_count_since_restart(), 2);
  2159. assert_eq!(parent.transaction_count(), 1);
  2160. assert_eq!(parent.non_vote_transaction_count_since_restart(), 1);
  2161. assert_eq!(
  2162. parent.get_signature_status(&tx_transfer_1_to_2.signatures[0]),
  2163. None
  2164. );
  2165. for _ in 0..3 {
  2166. // first time these should match what happened above, assert that parents are ok
  2167. assert_eq!(bank.get_balance(&key1.pubkey()), 0);
  2168. assert_eq!(bank.get_account(&key1.pubkey()), None);
  2169. assert_eq!(bank.get_balance(&key2.pubkey()), amount);
  2170. trace!("start");
  2171. assert_eq!(
  2172. bank.get_signature_status(&tx_transfer_mint_to_1.signatures[0]),
  2173. Some(Ok(()))
  2174. );
  2175. assert_eq!(
  2176. bank.get_signature_status(&tx_transfer_1_to_2.signatures[0]),
  2177. Some(Ok(()))
  2178. );
  2179. // works iteration 0, no-ops on iteration 1 and 2
  2180. trace!("SQUASH");
  2181. bank.squash();
  2182. assert_eq!(parent.transaction_count(), 1);
  2183. assert_eq!(parent.non_vote_transaction_count_since_restart(), 1);
  2184. assert_eq!(bank.transaction_count(), 2);
  2185. assert_eq!(bank.non_vote_transaction_count_since_restart(), 2);
  2186. }
  2187. }
  2188. #[test]
  2189. fn test_bank_get_account_in_parent_after_squash() {
  2190. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  2191. let (parent, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2192. let amount = genesis_config.rent.minimum_balance(0);
  2193. let key1 = Keypair::new();
  2194. parent
  2195. .transfer(amount, &mint_keypair, &key1.pubkey())
  2196. .unwrap();
  2197. assert_eq!(parent.get_balance(&key1.pubkey()), amount);
  2198. let bank = new_from_parent(parent.clone());
  2199. bank.squash();
  2200. assert_eq!(parent.get_balance(&key1.pubkey()), amount);
  2201. }
  2202. #[test]
  2203. fn test_bank_get_account_in_parent_after_squash2() {
  2204. solana_logger::setup();
  2205. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  2206. let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2207. let amount = genesis_config.rent.minimum_balance(0);
  2208. let key1 = Keypair::new();
  2209. bank0
  2210. .transfer(amount, &mint_keypair, &key1.pubkey())
  2211. .unwrap();
  2212. assert_eq!(bank0.get_balance(&key1.pubkey()), amount);
  2213. let bank1 = new_bank_from_parent_with_bank_forks(
  2214. bank_forks.as_ref(),
  2215. bank0.clone(),
  2216. &Pubkey::default(),
  2217. 1,
  2218. );
  2219. bank1
  2220. .transfer(3 * amount, &mint_keypair, &key1.pubkey())
  2221. .unwrap();
  2222. let bank2 = new_bank_from_parent_with_bank_forks(
  2223. bank_forks.as_ref(),
  2224. bank0.clone(),
  2225. &Pubkey::default(),
  2226. 2,
  2227. );
  2228. bank2
  2229. .transfer(2 * amount, &mint_keypair, &key1.pubkey())
  2230. .unwrap();
  2231. let bank3 = new_bank_from_parent_with_bank_forks(
  2232. bank_forks.as_ref(),
  2233. bank1.clone(),
  2234. &Pubkey::default(),
  2235. 3,
  2236. );
  2237. bank1.squash();
  2238. // This picks up the values from 1 which is the highest root:
  2239. // TODO: if we need to access rooted banks older than this,
  2240. // need to fix the lookup.
  2241. assert_eq!(bank0.get_balance(&key1.pubkey()), 4 * amount);
  2242. assert_eq!(bank3.get_balance(&key1.pubkey()), 4 * amount);
  2243. assert_eq!(bank2.get_balance(&key1.pubkey()), 3 * amount);
  2244. bank3.squash();
  2245. assert_eq!(bank1.get_balance(&key1.pubkey()), 4 * amount);
  2246. let bank4 = new_bank_from_parent_with_bank_forks(
  2247. bank_forks.as_ref(),
  2248. bank3.clone(),
  2249. &Pubkey::default(),
  2250. 4,
  2251. );
  2252. bank4
  2253. .transfer(4 * amount, &mint_keypair, &key1.pubkey())
  2254. .unwrap();
  2255. assert_eq!(bank4.get_balance(&key1.pubkey()), 8 * amount);
  2256. assert_eq!(bank3.get_balance(&key1.pubkey()), 4 * amount);
  2257. bank4.squash();
  2258. let bank5 = new_bank_from_parent_with_bank_forks(
  2259. bank_forks.as_ref(),
  2260. bank4.clone(),
  2261. &Pubkey::default(),
  2262. 5,
  2263. );
  2264. bank5.squash();
  2265. let bank6 =
  2266. new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank5, &Pubkey::default(), 6);
  2267. bank6.squash();
  2268. // This picks up the values from 4 which is the highest root:
  2269. // TODO: if we need to access rooted banks older than this,
  2270. // need to fix the lookup.
  2271. assert_eq!(bank3.get_balance(&key1.pubkey()), 8 * amount);
  2272. assert_eq!(bank2.get_balance(&key1.pubkey()), 8 * amount);
  2273. assert_eq!(bank4.get_balance(&key1.pubkey()), 8 * amount);
  2274. }
  2275. #[test]
  2276. fn test_bank_get_account_modified_since_parent_with_fixed_root() {
  2277. let pubkey = solana_pubkey::new_rand();
  2278. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  2279. let amount = genesis_config.rent.minimum_balance(0);
  2280. let (bank1, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2281. bank1.transfer(amount, &mint_keypair, &pubkey).unwrap();
  2282. let result = bank1.get_account_modified_since_parent_with_fixed_root(&pubkey);
  2283. assert!(result.is_some());
  2284. let (account, slot) = result.unwrap();
  2285. assert_eq!(account.lamports(), amount);
  2286. assert_eq!(slot, 0);
  2287. let bank2 = new_bank_from_parent_with_bank_forks(
  2288. bank_forks.as_ref(),
  2289. bank1.clone(),
  2290. &Pubkey::default(),
  2291. 1,
  2292. );
  2293. assert!(bank2
  2294. .get_account_modified_since_parent_with_fixed_root(&pubkey)
  2295. .is_none());
  2296. bank2.transfer(2 * amount, &mint_keypair, &pubkey).unwrap();
  2297. let result = bank1.get_account_modified_since_parent_with_fixed_root(&pubkey);
  2298. assert!(result.is_some());
  2299. let (account, slot) = result.unwrap();
  2300. assert_eq!(account.lamports(), amount);
  2301. assert_eq!(slot, 0);
  2302. let result = bank2.get_account_modified_since_parent_with_fixed_root(&pubkey);
  2303. assert!(result.is_some());
  2304. let (account, slot) = result.unwrap();
  2305. assert_eq!(account.lamports(), 3 * amount);
  2306. assert_eq!(slot, 1);
  2307. bank1.squash();
  2308. let bank3 =
  2309. new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank2, &Pubkey::default(), 3);
  2310. assert_eq!(
  2311. None,
  2312. bank3.get_account_modified_since_parent_with_fixed_root(&pubkey)
  2313. );
  2314. }
  2315. #[test]
  2316. fn test_bank_update_sysvar_account() {
  2317. solana_logger::setup();
  2318. // flushing the write cache is destructive, so test has to restart each time we flush and want to do 'illegal' operations once flushed
  2319. for pass in 0..5 {
  2320. use sysvar::clock::Clock;
  2321. let dummy_clock_id = Pubkey::from_str_const("64jsX5hwtsjsKR7eNcNU4yhgwjuXoU9KR2MpnV47iXXz");
  2322. let dummy_rent_epoch = 44;
  2323. let (mut genesis_config, _mint_keypair) = create_genesis_config(500);
  2324. let expected_previous_slot = 3;
  2325. let mut expected_next_slot = expected_previous_slot + 1;
  2326. // First, initialize the clock sysvar
  2327. for feature_id in FeatureSet::default().inactive() {
  2328. activate_feature(&mut genesis_config, *feature_id);
  2329. }
  2330. let bank1 = Arc::new(Bank::new_for_tests(&genesis_config));
  2331. if pass == 0 {
  2332. add_root_and_flush_write_cache(&bank1);
  2333. assert_eq!(
  2334. bank1.calculate_capitalization_for_tests(),
  2335. bank1.capitalization()
  2336. );
  2337. continue;
  2338. }
  2339. assert_capitalization_diff(
  2340. &bank1,
  2341. || {
  2342. bank1.update_sysvar_account(&dummy_clock_id, |optional_account| {
  2343. assert!(optional_account.is_none());
  2344. let mut account = create_account(
  2345. &Clock {
  2346. slot: expected_previous_slot,
  2347. ..Clock::default()
  2348. },
  2349. bank1.inherit_specially_retained_account_fields(optional_account),
  2350. );
  2351. account.set_rent_epoch(dummy_rent_epoch);
  2352. account
  2353. });
  2354. let current_account = bank1.get_account(&dummy_clock_id).unwrap();
  2355. assert_eq!(
  2356. expected_previous_slot,
  2357. from_account::<Clock, _>(&current_account).unwrap().slot
  2358. );
  2359. assert_eq!(dummy_rent_epoch, current_account.rent_epoch());
  2360. },
  2361. |old, new| {
  2362. assert_eq!(
  2363. old + min_rent_exempt_balance_for_sysvars(&bank1, &[sysvar::clock::id()]),
  2364. new
  2365. );
  2366. pass == 1
  2367. },
  2368. );
  2369. if pass == 1 {
  2370. continue;
  2371. }
  2372. assert_capitalization_diff(
  2373. &bank1,
  2374. || {
  2375. bank1.update_sysvar_account(&dummy_clock_id, |optional_account| {
  2376. assert!(optional_account.is_some());
  2377. create_account(
  2378. &Clock {
  2379. slot: expected_previous_slot,
  2380. ..Clock::default()
  2381. },
  2382. bank1.inherit_specially_retained_account_fields(optional_account),
  2383. )
  2384. })
  2385. },
  2386. |old, new| {
  2387. // creating new sysvar twice in a slot shouldn't increment capitalization twice
  2388. assert_eq!(old, new);
  2389. pass == 2
  2390. },
  2391. );
  2392. if pass == 2 {
  2393. continue;
  2394. }
  2395. // Updating should increment the clock's slot
  2396. let bank2 = Arc::new(Bank::new_from_parent(bank1.clone(), &Pubkey::default(), 1));
  2397. add_root_and_flush_write_cache(&bank1);
  2398. assert_capitalization_diff(
  2399. &bank2,
  2400. || {
  2401. bank2.update_sysvar_account(&dummy_clock_id, |optional_account| {
  2402. let slot = from_account::<Clock, _>(optional_account.as_ref().unwrap())
  2403. .unwrap()
  2404. .slot
  2405. + 1;
  2406. create_account(
  2407. &Clock {
  2408. slot,
  2409. ..Clock::default()
  2410. },
  2411. bank2.inherit_specially_retained_account_fields(optional_account),
  2412. )
  2413. });
  2414. let current_account = bank2.get_account(&dummy_clock_id).unwrap();
  2415. assert_eq!(
  2416. expected_next_slot,
  2417. from_account::<Clock, _>(&current_account).unwrap().slot
  2418. );
  2419. assert_eq!(dummy_rent_epoch, current_account.rent_epoch());
  2420. },
  2421. |old, new| {
  2422. // if existing, capitalization shouldn't change
  2423. assert_eq!(old, new);
  2424. pass == 3
  2425. },
  2426. );
  2427. if pass == 3 {
  2428. continue;
  2429. }
  2430. // Updating again should give bank2's sysvar to the closure not bank1's.
  2431. // Thus, increment expected_next_slot accordingly
  2432. expected_next_slot += 1;
  2433. assert_capitalization_diff(
  2434. &bank2,
  2435. || {
  2436. bank2.update_sysvar_account(&dummy_clock_id, |optional_account| {
  2437. let slot = from_account::<Clock, _>(optional_account.as_ref().unwrap())
  2438. .unwrap()
  2439. .slot
  2440. + 1;
  2441. create_account(
  2442. &Clock {
  2443. slot,
  2444. ..Clock::default()
  2445. },
  2446. bank2.inherit_specially_retained_account_fields(optional_account),
  2447. )
  2448. });
  2449. let current_account = bank2.get_account(&dummy_clock_id).unwrap();
  2450. assert_eq!(
  2451. expected_next_slot,
  2452. from_account::<Clock, _>(&current_account).unwrap().slot
  2453. );
  2454. },
  2455. |old, new| {
  2456. // updating twice in a slot shouldn't increment capitalization twice
  2457. assert_eq!(old, new);
  2458. true
  2459. },
  2460. );
  2461. }
  2462. }
  2463. #[test]
  2464. fn test_bank_epoch_vote_accounts() {
  2465. let leader_pubkey = solana_pubkey::new_rand();
  2466. let leader_lamports = 3;
  2467. let mut genesis_config =
  2468. create_genesis_config_with_leader(5, &leader_pubkey, leader_lamports).genesis_config;
  2469. // set this up weird, forces future generation, odd mod(), etc.
  2470. // this says: "vote_accounts for epoch X should be generated at slot index 3 in epoch X-2...
  2471. const SLOTS_PER_EPOCH: u64 = MINIMUM_SLOTS_PER_EPOCH;
  2472. const LEADER_SCHEDULE_SLOT_OFFSET: u64 = SLOTS_PER_EPOCH * 3 - 3;
  2473. // no warmup allows me to do the normal division stuff below
  2474. genesis_config.epoch_schedule =
  2475. EpochSchedule::custom(SLOTS_PER_EPOCH, LEADER_SCHEDULE_SLOT_OFFSET, false);
  2476. let parent = Arc::new(Bank::new_for_tests(&genesis_config));
  2477. let mut leader_vote_stake: Vec<_> = parent
  2478. .epoch_vote_accounts(0)
  2479. .map(|accounts| {
  2480. accounts
  2481. .iter()
  2482. .filter_map(|(pubkey, (stake, account))| {
  2483. if account.node_pubkey() == &leader_pubkey {
  2484. Some((*pubkey, *stake))
  2485. } else {
  2486. None
  2487. }
  2488. })
  2489. .collect()
  2490. })
  2491. .unwrap();
  2492. assert_eq!(leader_vote_stake.len(), 1);
  2493. let (leader_vote_account, leader_stake) = leader_vote_stake.pop().unwrap();
  2494. assert!(leader_stake > 0);
  2495. let leader_stake = Stake {
  2496. delegation: Delegation {
  2497. stake: leader_lamports,
  2498. activation_epoch: u64::MAX, // bootstrap
  2499. ..Delegation::default()
  2500. },
  2501. ..Stake::default()
  2502. };
  2503. let mut epoch = 1;
  2504. loop {
  2505. if epoch > LEADER_SCHEDULE_SLOT_OFFSET / SLOTS_PER_EPOCH {
  2506. break;
  2507. }
  2508. let vote_accounts = parent.epoch_vote_accounts(epoch);
  2509. assert!(vote_accounts.is_some());
  2510. // epoch_stakes are a snapshot at the leader_schedule_slot_offset boundary
  2511. // in the prior epoch (0 in this case)
  2512. assert_eq!(
  2513. leader_stake.stake(0, &StakeHistory::default(), None),
  2514. vote_accounts.unwrap().get(&leader_vote_account).unwrap().0
  2515. );
  2516. epoch += 1;
  2517. }
  2518. // child crosses epoch boundary and is the first slot in the epoch
  2519. let child = Bank::new_from_parent(
  2520. parent.clone(),
  2521. &leader_pubkey,
  2522. SLOTS_PER_EPOCH - (LEADER_SCHEDULE_SLOT_OFFSET % SLOTS_PER_EPOCH),
  2523. );
  2524. assert!(child.epoch_vote_accounts(epoch).is_some());
  2525. assert_eq!(
  2526. leader_stake.stake(child.epoch(), &StakeHistory::default(), None),
  2527. child
  2528. .epoch_vote_accounts(epoch)
  2529. .unwrap()
  2530. .get(&leader_vote_account)
  2531. .unwrap()
  2532. .0
  2533. );
  2534. // child crosses epoch boundary but isn't the first slot in the epoch, still
  2535. // makes an epoch stakes snapshot at 1
  2536. let child = Bank::new_from_parent(
  2537. parent,
  2538. &leader_pubkey,
  2539. SLOTS_PER_EPOCH - (LEADER_SCHEDULE_SLOT_OFFSET % SLOTS_PER_EPOCH) + 1,
  2540. );
  2541. assert!(child.epoch_vote_accounts(epoch).is_some());
  2542. assert_eq!(
  2543. leader_stake.stake(child.epoch(), &StakeHistory::default(), None),
  2544. child
  2545. .epoch_vote_accounts(epoch)
  2546. .unwrap()
  2547. .get(&leader_vote_account)
  2548. .unwrap()
  2549. .0
  2550. );
  2551. }
  2552. #[test]
  2553. fn test_zero_signatures() {
  2554. solana_logger::setup();
  2555. let (genesis_config, mint_keypair) = create_genesis_config(500);
  2556. let mut bank = Bank::new_for_tests(&genesis_config);
  2557. bank.fee_rate_governor.lamports_per_signature = 2;
  2558. let key = solana_pubkey::new_rand();
  2559. let mut transfer_instruction = system_instruction::transfer(&mint_keypair.pubkey(), &key, 0);
  2560. transfer_instruction.accounts[0].is_signer = false;
  2561. let message = Message::new(&[transfer_instruction], None);
  2562. let tx = Transaction::new(&Vec::<&Keypair>::new(), message, bank.last_blockhash());
  2563. assert_eq!(
  2564. bank.process_transaction(&tx),
  2565. Err(TransactionError::SanitizeFailure)
  2566. );
  2567. assert_eq!(bank.get_balance(&key), 0);
  2568. }
  2569. #[test]
  2570. fn test_bank_get_slots_in_epoch() {
  2571. let (genesis_config, _) = create_genesis_config(500);
  2572. let bank = Bank::new_for_tests(&genesis_config);
  2573. assert_eq!(bank.get_slots_in_epoch(0), MINIMUM_SLOTS_PER_EPOCH);
  2574. assert_eq!(bank.get_slots_in_epoch(2), (MINIMUM_SLOTS_PER_EPOCH * 4));
  2575. assert_eq!(
  2576. bank.get_slots_in_epoch(5000),
  2577. genesis_config.epoch_schedule.slots_per_epoch
  2578. );
  2579. }
  2580. #[test]
  2581. fn test_is_delta_true() {
  2582. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  2583. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2584. let key1 = Keypair::new();
  2585. let tx_transfer_mint_to_1 = system_transaction::transfer(
  2586. &mint_keypair,
  2587. &key1.pubkey(),
  2588. genesis_config.rent.minimum_balance(0),
  2589. genesis_config.hash(),
  2590. );
  2591. assert_eq!(bank.process_transaction(&tx_transfer_mint_to_1), Ok(()));
  2592. assert!(bank.is_delta.load(Relaxed));
  2593. let bank1 = new_from_parent(bank.clone());
  2594. let hash1 = bank1.hash_internal_state();
  2595. assert!(!bank1.is_delta.load(Relaxed));
  2596. assert_ne!(hash1, bank.hash());
  2597. // ticks don't make a bank into a delta or change its state unless a block boundary is crossed
  2598. bank1.register_default_tick_for_test();
  2599. assert!(!bank1.is_delta.load(Relaxed));
  2600. assert_eq!(bank1.hash_internal_state(), hash1);
  2601. }
  2602. #[test]
  2603. fn test_is_empty() {
  2604. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  2605. let (bank0, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2606. let key1 = Keypair::new();
  2607. // The zeroth bank is empty becasue there are no transactions
  2608. assert!(bank0.is_empty());
  2609. // Set is_delta to true, bank is no longer empty
  2610. let tx_transfer_mint_to_1 = system_transaction::transfer(
  2611. &mint_keypair,
  2612. &key1.pubkey(),
  2613. genesis_config.rent.minimum_balance(0),
  2614. genesis_config.hash(),
  2615. );
  2616. assert_eq!(bank0.process_transaction(&tx_transfer_mint_to_1), Ok(()));
  2617. assert!(!bank0.is_empty());
  2618. }
  2619. #[test]
  2620. fn test_bank_inherit_tx_count() {
  2621. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  2622. let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2623. // Bank 1
  2624. let bank1 = new_bank_from_parent_with_bank_forks(
  2625. bank_forks.as_ref(),
  2626. bank0.clone(),
  2627. &solana_pubkey::new_rand(),
  2628. 1,
  2629. );
  2630. // Bank 2
  2631. let bank2 = new_bank_from_parent_with_bank_forks(
  2632. bank_forks.as_ref(),
  2633. bank0.clone(),
  2634. &solana_pubkey::new_rand(),
  2635. 2,
  2636. );
  2637. // transfer a token
  2638. assert_eq!(
  2639. bank1.process_transaction(&system_transaction::transfer(
  2640. &mint_keypair,
  2641. &Keypair::new().pubkey(),
  2642. genesis_config.rent.minimum_balance(0),
  2643. genesis_config.hash(),
  2644. )),
  2645. Ok(())
  2646. );
  2647. assert_eq!(bank0.transaction_count(), 0);
  2648. assert_eq!(bank0.non_vote_transaction_count_since_restart(), 0);
  2649. assert_eq!(bank2.transaction_count(), 0);
  2650. assert_eq!(bank2.non_vote_transaction_count_since_restart(), 0);
  2651. assert_eq!(bank1.transaction_count(), 1);
  2652. assert_eq!(bank1.non_vote_transaction_count_since_restart(), 1);
  2653. bank1.squash();
  2654. assert_eq!(bank0.transaction_count(), 0);
  2655. assert_eq!(bank0.non_vote_transaction_count_since_restart(), 0);
  2656. assert_eq!(bank2.transaction_count(), 0);
  2657. assert_eq!(bank2.non_vote_transaction_count_since_restart(), 0);
  2658. assert_eq!(bank1.transaction_count(), 1);
  2659. assert_eq!(bank1.non_vote_transaction_count_since_restart(), 1);
  2660. let bank6 = new_bank_from_parent_with_bank_forks(
  2661. bank_forks.as_ref(),
  2662. bank1.clone(),
  2663. &solana_pubkey::new_rand(),
  2664. 3,
  2665. );
  2666. assert_eq!(bank1.transaction_count(), 1);
  2667. assert_eq!(bank1.non_vote_transaction_count_since_restart(), 1);
  2668. assert_eq!(bank6.transaction_count(), 1);
  2669. assert_eq!(bank6.non_vote_transaction_count_since_restart(), 1);
  2670. bank6.squash();
  2671. assert_eq!(bank6.transaction_count(), 1);
  2672. assert_eq!(bank6.non_vote_transaction_count_since_restart(), 1);
  2673. }
  2674. #[test]
  2675. fn test_bank_inherit_fee_rate_governor() {
  2676. let (mut genesis_config, _mint_keypair) = create_genesis_config(500);
  2677. genesis_config
  2678. .fee_rate_governor
  2679. .target_lamports_per_signature = 123;
  2680. let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
  2681. let bank1 = Arc::new(new_from_parent(bank0.clone()));
  2682. assert_eq!(
  2683. bank0.fee_rate_governor.target_lamports_per_signature / 2,
  2684. bank1
  2685. .fee_rate_governor
  2686. .create_fee_calculator()
  2687. .lamports_per_signature
  2688. );
  2689. }
  2690. #[test]
  2691. fn test_bank_vote_accounts() {
  2692. let GenesisConfigInfo {
  2693. genesis_config,
  2694. mint_keypair,
  2695. ..
  2696. } = create_genesis_config_with_leader(500, &solana_pubkey::new_rand(), 1);
  2697. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2698. let vote_accounts = bank.vote_accounts();
  2699. assert_eq!(vote_accounts.len(), 1); // bootstrap validator has
  2700. // to have a vote account
  2701. let vote_keypair = Keypair::new();
  2702. let instructions = vote_instruction::create_account_with_config(
  2703. &mint_keypair.pubkey(),
  2704. &vote_keypair.pubkey(),
  2705. &VoteInit {
  2706. node_pubkey: mint_keypair.pubkey(),
  2707. authorized_voter: vote_keypair.pubkey(),
  2708. authorized_withdrawer: vote_keypair.pubkey(),
  2709. commission: 0,
  2710. },
  2711. 10,
  2712. vote_instruction::CreateVoteAccountConfig {
  2713. space: VoteStateVersions::vote_state_size_of(true) as u64,
  2714. ..vote_instruction::CreateVoteAccountConfig::default()
  2715. },
  2716. );
  2717. let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
  2718. let transaction = Transaction::new(
  2719. &[&mint_keypair, &vote_keypair],
  2720. message,
  2721. bank.last_blockhash(),
  2722. );
  2723. bank.process_transaction(&transaction).unwrap();
  2724. let vote_accounts = bank.vote_accounts();
  2725. assert_eq!(vote_accounts.len(), 2);
  2726. assert!(vote_accounts.get(&vote_keypair.pubkey()).is_some());
  2727. assert!(bank.withdraw(&vote_keypair.pubkey(), 10).is_ok());
  2728. let vote_accounts = bank.vote_accounts();
  2729. assert_eq!(vote_accounts.len(), 1);
  2730. }
  2731. #[test]
  2732. fn test_bank_cloned_stake_delegations() {
  2733. let GenesisConfigInfo {
  2734. mut genesis_config,
  2735. mint_keypair,
  2736. ..
  2737. } = create_genesis_config_with_leader(
  2738. 123_456_000_000_000,
  2739. &solana_pubkey::new_rand(),
  2740. 123_000_000_000,
  2741. );
  2742. genesis_config.rent = Rent::default();
  2743. for (pubkey, account) in
  2744. solana_program_binaries::by_id(&solana_stake_program::id(), &genesis_config.rent)
  2745. .unwrap()
  2746. .into_iter()
  2747. {
  2748. genesis_config.add_account(pubkey, account);
  2749. }
  2750. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2751. bank.squash();
  2752. let bank = Bank::new_from_parent(bank, &Pubkey::new_unique(), 1);
  2753. let stake_delegations = bank.stakes_cache.stakes().stake_delegations().clone();
  2754. assert_eq!(stake_delegations.len(), 1); // bootstrap validator has
  2755. // to have a stake delegation
  2756. let (vote_balance, stake_balance) = {
  2757. let rent = &bank.rent_collector().rent;
  2758. let vote_rent_exempt_reserve = rent.minimum_balance(VoteStateV3::size_of());
  2759. let stake_rent_exempt_reserve = rent.minimum_balance(StakeStateV2::size_of());
  2760. let minimum_delegation = solana_stake_program::get_minimum_delegation(
  2761. bank.feature_set
  2762. .is_active(&agave_feature_set::stake_raise_minimum_delegation_to_1_sol::id()),
  2763. );
  2764. (
  2765. vote_rent_exempt_reserve,
  2766. stake_rent_exempt_reserve + minimum_delegation,
  2767. )
  2768. };
  2769. let vote_keypair = Keypair::new();
  2770. let mut instructions = vote_instruction::create_account_with_config(
  2771. &mint_keypair.pubkey(),
  2772. &vote_keypair.pubkey(),
  2773. &VoteInit {
  2774. node_pubkey: mint_keypair.pubkey(),
  2775. authorized_voter: vote_keypair.pubkey(),
  2776. authorized_withdrawer: vote_keypair.pubkey(),
  2777. commission: 0,
  2778. },
  2779. vote_balance,
  2780. vote_instruction::CreateVoteAccountConfig {
  2781. space: VoteStateVersions::vote_state_size_of(true) as u64,
  2782. ..vote_instruction::CreateVoteAccountConfig::default()
  2783. },
  2784. );
  2785. let stake_keypair = Keypair::new();
  2786. instructions.extend(stake_instruction::create_account_and_delegate_stake(
  2787. &mint_keypair.pubkey(),
  2788. &stake_keypair.pubkey(),
  2789. &vote_keypair.pubkey(),
  2790. &Authorized::auto(&stake_keypair.pubkey()),
  2791. &Lockup::default(),
  2792. stake_balance,
  2793. ));
  2794. let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
  2795. let transaction = Transaction::new(
  2796. &[&mint_keypair, &vote_keypair, &stake_keypair],
  2797. message,
  2798. bank.last_blockhash(),
  2799. );
  2800. bank.process_transaction(&transaction).unwrap();
  2801. let stake_delegations = bank.stakes_cache.stakes().stake_delegations().clone();
  2802. assert_eq!(stake_delegations.len(), 2);
  2803. assert!(stake_delegations.get(&stake_keypair.pubkey()).is_some());
  2804. }
  2805. #[test]
  2806. fn test_is_delta_with_no_committables() {
  2807. let (genesis_config, mint_keypair) = create_genesis_config(8000);
  2808. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  2809. bank.is_delta.store(false, Relaxed);
  2810. let keypair1 = Keypair::new();
  2811. let keypair2 = Keypair::new();
  2812. let fail_tx =
  2813. system_transaction::transfer(&keypair1, &keypair2.pubkey(), 1, bank.last_blockhash());
  2814. // Should fail with TransactionError::AccountNotFound, which means
  2815. // the account which this tx operated on will not be committed. Thus
  2816. // the bank is_delta should still be false
  2817. assert_eq!(
  2818. bank.process_transaction(&fail_tx),
  2819. Err(TransactionError::AccountNotFound)
  2820. );
  2821. // Check the bank is_delta is still false
  2822. assert!(!bank.is_delta.load(Relaxed));
  2823. // Should fail with InstructionError, but InstructionErrors are committable,
  2824. // so is_delta should be true
  2825. assert_eq!(
  2826. bank.transfer(10_001, &mint_keypair, &solana_pubkey::new_rand()),
  2827. Err(TransactionError::InstructionError(
  2828. 0,
  2829. SystemError::ResultWithNegativeLamports.into(),
  2830. ))
  2831. );
  2832. assert!(bank.is_delta.load(Relaxed));
  2833. }
  2834. #[test]
  2835. fn test_bank_get_program_accounts() {
  2836. let (genesis_config, mint_keypair) = create_genesis_config(500);
  2837. let parent = Arc::new(Bank::new_for_tests(&genesis_config));
  2838. let genesis_accounts: Vec<_> = parent.get_all_accounts(false).unwrap();
  2839. assert!(
  2840. genesis_accounts
  2841. .iter()
  2842. .any(|(pubkey, _, _)| *pubkey == mint_keypair.pubkey()),
  2843. "mint pubkey not found"
  2844. );
  2845. assert!(
  2846. genesis_accounts
  2847. .iter()
  2848. .any(|(_, account, _)| solana_sdk_ids::sysvar::check_id(account.owner())),
  2849. "no sysvars found"
  2850. );
  2851. let bank0 = Arc::new(new_from_parent(parent));
  2852. let pubkey0 = solana_pubkey::new_rand();
  2853. let program_id = Pubkey::from([2; 32]);
  2854. let account0 = AccountSharedData::new(1, 0, &program_id);
  2855. bank0.store_account(&pubkey0, &account0);
  2856. assert_eq!(
  2857. bank0.get_program_accounts_modified_since_parent(&program_id),
  2858. vec![(pubkey0, account0.clone())]
  2859. );
  2860. let bank1 = Arc::new(new_from_parent(bank0.clone()));
  2861. bank1.squash();
  2862. assert_eq!(
  2863. bank0
  2864. .get_program_accounts(&program_id, &ScanConfig::default(),)
  2865. .unwrap(),
  2866. vec![(pubkey0, account0.clone())]
  2867. );
  2868. assert_eq!(
  2869. bank1
  2870. .get_program_accounts(&program_id, &ScanConfig::default(),)
  2871. .unwrap(),
  2872. vec![(pubkey0, account0)]
  2873. );
  2874. assert_eq!(
  2875. bank1.get_program_accounts_modified_since_parent(&program_id),
  2876. vec![]
  2877. );
  2878. let bank2 = Arc::new(new_from_parent(bank1.clone()));
  2879. let pubkey1 = solana_pubkey::new_rand();
  2880. let account1 = AccountSharedData::new(3, 0, &program_id);
  2881. bank2.store_account(&pubkey1, &account1);
  2882. // Accounts with 0 lamports should be filtered out by Accounts::load_by_program()
  2883. let pubkey2 = solana_pubkey::new_rand();
  2884. let account2 = AccountSharedData::new(0, 0, &program_id);
  2885. bank2.store_account(&pubkey2, &account2);
  2886. let bank3 = Arc::new(new_from_parent(bank2));
  2887. bank3.squash();
  2888. assert_eq!(
  2889. bank1
  2890. .get_program_accounts(&program_id, &ScanConfig::default(),)
  2891. .unwrap()
  2892. .len(),
  2893. 2
  2894. );
  2895. assert_eq!(
  2896. bank3
  2897. .get_program_accounts(&program_id, &ScanConfig::default(),)
  2898. .unwrap()
  2899. .len(),
  2900. 2
  2901. );
  2902. }
  2903. #[test]
  2904. fn test_get_filtered_indexed_accounts_limit_exceeded() {
  2905. let (genesis_config, _mint_keypair) = create_genesis_config(500);
  2906. let mut account_indexes = AccountSecondaryIndexes::default();
  2907. account_indexes.indexes.insert(AccountIndex::ProgramId);
  2908. let bank_config = BankTestConfig {
  2909. accounts_db_config: AccountsDbConfig {
  2910. account_indexes: Some(account_indexes),
  2911. ..ACCOUNTS_DB_CONFIG_FOR_TESTING
  2912. },
  2913. };
  2914. let bank = Arc::new(Bank::new_with_config_for_tests(
  2915. &genesis_config,
  2916. bank_config,
  2917. ));
  2918. let address = Pubkey::new_unique();
  2919. let program_id = Pubkey::new_unique();
  2920. let limit = 100;
  2921. let account = AccountSharedData::new(1, limit, &program_id);
  2922. bank.store_account(&address, &account);
  2923. assert!(bank
  2924. .get_filtered_indexed_accounts(
  2925. &IndexKey::ProgramId(program_id),
  2926. |_| true,
  2927. &ScanConfig::default(),
  2928. Some(limit), // limit here will be exceeded, resulting in aborted scan
  2929. )
  2930. .is_err());
  2931. }
  2932. #[test]
  2933. fn test_get_filtered_indexed_accounts() {
  2934. let (genesis_config, _mint_keypair) = create_genesis_config(500);
  2935. let mut account_indexes = AccountSecondaryIndexes::default();
  2936. account_indexes.indexes.insert(AccountIndex::ProgramId);
  2937. let bank_config = BankTestConfig {
  2938. accounts_db_config: AccountsDbConfig {
  2939. account_indexes: Some(account_indexes),
  2940. ..ACCOUNTS_DB_CONFIG_FOR_TESTING
  2941. },
  2942. };
  2943. let bank = Arc::new(Bank::new_with_config_for_tests(
  2944. &genesis_config,
  2945. bank_config,
  2946. ));
  2947. let address = Pubkey::new_unique();
  2948. let program_id = Pubkey::new_unique();
  2949. let account = AccountSharedData::new(1, 0, &program_id);
  2950. bank.store_account(&address, &account);
  2951. let indexed_accounts = bank
  2952. .get_filtered_indexed_accounts(
  2953. &IndexKey::ProgramId(program_id),
  2954. |_| true,
  2955. &ScanConfig::default(),
  2956. None,
  2957. )
  2958. .unwrap();
  2959. assert_eq!(indexed_accounts.len(), 1);
  2960. assert_eq!(indexed_accounts[0], (address, account));
  2961. // Even though the account is re-stored in the bank (and the index) under a new program id,
  2962. // it is still present in the index under the original program id as well. This
  2963. // demonstrates the need for a redundant post-processing filter.
  2964. let another_program_id = Pubkey::new_unique();
  2965. let new_account = AccountSharedData::new(1, 0, &another_program_id);
  2966. let bank = Arc::new(new_from_parent(bank));
  2967. bank.store_account(&address, &new_account);
  2968. let indexed_accounts = bank
  2969. .get_filtered_indexed_accounts(
  2970. &IndexKey::ProgramId(program_id),
  2971. |_| true,
  2972. &ScanConfig::default(),
  2973. None,
  2974. )
  2975. .unwrap();
  2976. assert_eq!(indexed_accounts.len(), 1);
  2977. assert_eq!(indexed_accounts[0], (address, new_account.clone()));
  2978. let indexed_accounts = bank
  2979. .get_filtered_indexed_accounts(
  2980. &IndexKey::ProgramId(another_program_id),
  2981. |_| true,
  2982. &ScanConfig::default(),
  2983. None,
  2984. )
  2985. .unwrap();
  2986. assert_eq!(indexed_accounts.len(), 1);
  2987. assert_eq!(indexed_accounts[0], (address, new_account.clone()));
  2988. // Post-processing filter
  2989. let indexed_accounts = bank
  2990. .get_filtered_indexed_accounts(
  2991. &IndexKey::ProgramId(program_id),
  2992. |account| account.owner() == &program_id,
  2993. &ScanConfig::default(),
  2994. None,
  2995. )
  2996. .unwrap();
  2997. assert!(indexed_accounts.is_empty());
  2998. let indexed_accounts = bank
  2999. .get_filtered_indexed_accounts(
  3000. &IndexKey::ProgramId(another_program_id),
  3001. |account| account.owner() == &another_program_id,
  3002. &ScanConfig::default(),
  3003. None,
  3004. )
  3005. .unwrap();
  3006. assert_eq!(indexed_accounts.len(), 1);
  3007. assert_eq!(indexed_accounts[0], (address, new_account));
  3008. }
  3009. #[test]
  3010. fn test_status_cache_ancestors() {
  3011. solana_logger::setup();
  3012. let (parent, _bank_forks) = create_simple_test_arc_bank(500);
  3013. let bank1 = Arc::new(new_from_parent(parent));
  3014. let mut bank = bank1;
  3015. for _ in 0..MAX_CACHE_ENTRIES * 2 {
  3016. bank = Arc::new(new_from_parent(bank));
  3017. bank.squash();
  3018. }
  3019. let bank = new_from_parent(bank);
  3020. assert_eq!(
  3021. bank.status_cache_ancestors(),
  3022. (bank.slot() - MAX_CACHE_ENTRIES as u64..=bank.slot()).collect::<Vec<_>>()
  3023. );
  3024. }
  3025. #[test]
  3026. fn test_add_builtin() {
  3027. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(500);
  3028. let mut bank = Bank::new_for_tests(&genesis_config);
  3029. fn mock_vote_program_id() -> Pubkey {
  3030. Pubkey::from([42u8; 32])
  3031. }
  3032. declare_process_instruction!(MockBuiltin, 1, |invoke_context| {
  3033. let transaction_context = &invoke_context.transaction_context;
  3034. let instruction_context = transaction_context.get_current_instruction_context()?;
  3035. let program_id = instruction_context.get_program_key()?;
  3036. if mock_vote_program_id() != *program_id {
  3037. return Err(InstructionError::IncorrectProgramId);
  3038. }
  3039. Err(InstructionError::Custom(42))
  3040. });
  3041. assert!(bank.get_account(&mock_vote_program_id()).is_none());
  3042. bank.add_mockup_builtin(mock_vote_program_id(), MockBuiltin::vm);
  3043. assert!(bank.get_account(&mock_vote_program_id()).is_some());
  3044. let mock_account = Keypair::new();
  3045. let mock_validator_identity = Keypair::new();
  3046. let mut instructions = vote_instruction::create_account_with_config(
  3047. &mint_keypair.pubkey(),
  3048. &mock_account.pubkey(),
  3049. &VoteInit {
  3050. node_pubkey: mock_validator_identity.pubkey(),
  3051. ..VoteInit::default()
  3052. },
  3053. 1,
  3054. vote_instruction::CreateVoteAccountConfig {
  3055. space: VoteStateVersions::vote_state_size_of(true) as u64,
  3056. ..vote_instruction::CreateVoteAccountConfig::default()
  3057. },
  3058. );
  3059. instructions[1].program_id = mock_vote_program_id();
  3060. let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
  3061. let transaction = Transaction::new(
  3062. &[&mint_keypair, &mock_account, &mock_validator_identity],
  3063. message,
  3064. bank.last_blockhash(),
  3065. );
  3066. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  3067. assert_eq!(
  3068. bank.process_transaction(&transaction),
  3069. Err(TransactionError::InstructionError(
  3070. 1,
  3071. InstructionError::Custom(42)
  3072. ))
  3073. );
  3074. }
  3075. #[test]
  3076. fn test_add_duplicate_static_program() {
  3077. let GenesisConfigInfo {
  3078. genesis_config,
  3079. mint_keypair,
  3080. ..
  3081. } = create_genesis_config_with_leader(500, &solana_pubkey::new_rand(), 0);
  3082. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  3083. declare_process_instruction!(MockBuiltin, 1, |_invoke_context| {
  3084. Err(InstructionError::Custom(42))
  3085. });
  3086. let mock_account = Keypair::new();
  3087. let mock_validator_identity = Keypair::new();
  3088. let instructions = vote_instruction::create_account_with_config(
  3089. &mint_keypair.pubkey(),
  3090. &mock_account.pubkey(),
  3091. &VoteInit {
  3092. node_pubkey: mock_validator_identity.pubkey(),
  3093. ..VoteInit::default()
  3094. },
  3095. 1,
  3096. vote_instruction::CreateVoteAccountConfig {
  3097. space: VoteStateVersions::vote_state_size_of(true) as u64,
  3098. ..vote_instruction::CreateVoteAccountConfig::default()
  3099. },
  3100. );
  3101. let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
  3102. let transaction = Transaction::new(
  3103. &[&mint_keypair, &mock_account, &mock_validator_identity],
  3104. message,
  3105. bank.last_blockhash(),
  3106. );
  3107. let slot = bank.slot().saturating_add(1);
  3108. let mut bank = Bank::new_from_parent(bank, &Pubkey::default(), slot);
  3109. bank.add_mockup_builtin(solana_vote_program::id(), MockBuiltin::vm);
  3110. let bank = bank_forks
  3111. .write()
  3112. .unwrap()
  3113. .insert(bank)
  3114. .clone_without_scheduler();
  3115. let vote_loader_account = bank.get_account(&solana_vote_program::id()).unwrap();
  3116. let new_vote_loader_account = bank.get_account(&solana_vote_program::id()).unwrap();
  3117. // Vote loader account should not be updated since it was included in the genesis config.
  3118. assert_eq!(vote_loader_account.data(), new_vote_loader_account.data());
  3119. assert_eq!(
  3120. bank.process_transaction(&transaction),
  3121. Err(TransactionError::InstructionError(
  3122. 1,
  3123. InstructionError::Custom(42)
  3124. ))
  3125. );
  3126. }
  3127. #[test]
  3128. fn test_add_instruction_processor_for_existing_unrelated_accounts() {
  3129. for pass in 0..5 {
  3130. let mut bank = create_simple_test_bank(500);
  3131. declare_process_instruction!(MockBuiltin, 1, |_invoke_context| {
  3132. Err(InstructionError::Custom(42))
  3133. });
  3134. // Non-builtin loader accounts can not be used for instruction processing
  3135. {
  3136. let stakes = bank.stakes_cache.stakes();
  3137. assert!(stakes.vote_accounts().as_ref().is_empty());
  3138. }
  3139. assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
  3140. if pass == 0 {
  3141. add_root_and_flush_write_cache(&bank);
  3142. assert_eq!(
  3143. bank.calculate_capitalization_for_tests(),
  3144. bank.capitalization()
  3145. );
  3146. continue;
  3147. }
  3148. let ((vote_id, vote_account), (stake_id, stake_account)) =
  3149. crate::stakes::tests::create_staked_node_accounts(1_0000);
  3150. bank.capitalization
  3151. .fetch_add(vote_account.lamports() + stake_account.lamports(), Relaxed);
  3152. bank.store_account(&vote_id, &vote_account);
  3153. bank.store_account(&stake_id, &stake_account);
  3154. {
  3155. let stakes = bank.stakes_cache.stakes();
  3156. assert!(!stakes.vote_accounts().as_ref().is_empty());
  3157. }
  3158. assert!(!bank.stakes_cache.stakes().stake_delegations().is_empty());
  3159. if pass == 1 {
  3160. add_root_and_flush_write_cache(&bank);
  3161. assert_eq!(
  3162. bank.calculate_capitalization_for_tests(),
  3163. bank.capitalization()
  3164. );
  3165. continue;
  3166. }
  3167. bank.transaction_processor.add_builtin(
  3168. &bank,
  3169. vote_id,
  3170. "mock_program1",
  3171. ProgramCacheEntry::new_builtin(0, 0, MockBuiltin::vm),
  3172. );
  3173. bank.transaction_processor.add_builtin(
  3174. &bank,
  3175. stake_id,
  3176. "mock_program2",
  3177. ProgramCacheEntry::new_builtin(0, 0, MockBuiltin::vm),
  3178. );
  3179. {
  3180. let stakes = bank.stakes_cache.stakes();
  3181. assert!(stakes.vote_accounts().as_ref().is_empty());
  3182. }
  3183. assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
  3184. if pass == 2 {
  3185. add_root_and_flush_write_cache(&bank);
  3186. assert_eq!(
  3187. bank.calculate_capitalization_for_tests(),
  3188. bank.capitalization()
  3189. );
  3190. continue;
  3191. }
  3192. assert_eq!(
  3193. "mock_program1",
  3194. String::from_utf8_lossy(bank.get_account(&vote_id).unwrap_or_default().data())
  3195. );
  3196. assert_eq!(
  3197. "mock_program2",
  3198. String::from_utf8_lossy(bank.get_account(&stake_id).unwrap_or_default().data())
  3199. );
  3200. // Re-adding builtin programs should be no-op
  3201. let old_hash = bank.calculate_accounts_lt_hash_for_tests();
  3202. bank.add_mockup_builtin(vote_id, MockBuiltin::vm);
  3203. bank.add_mockup_builtin(stake_id, MockBuiltin::vm);
  3204. add_root_and_flush_write_cache(&bank);
  3205. let new_hash = bank.calculate_accounts_lt_hash_for_tests();
  3206. assert_eq!(old_hash, new_hash);
  3207. {
  3208. let stakes = bank.stakes_cache.stakes();
  3209. assert!(stakes.vote_accounts().as_ref().is_empty());
  3210. }
  3211. assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
  3212. assert_eq!(
  3213. bank.calculate_capitalization_for_tests(),
  3214. bank.capitalization()
  3215. );
  3216. assert_eq!(
  3217. "mock_program1",
  3218. String::from_utf8_lossy(bank.get_account(&vote_id).unwrap_or_default().data())
  3219. );
  3220. assert_eq!(
  3221. "mock_program2",
  3222. String::from_utf8_lossy(bank.get_account(&stake_id).unwrap_or_default().data())
  3223. );
  3224. }
  3225. }
  3226. #[allow(deprecated)]
  3227. #[test]
  3228. fn test_recent_blockhashes_sysvar() {
  3229. let (mut bank, _bank_forks) = create_simple_test_arc_bank(500);
  3230. for i in 1..5 {
  3231. let bhq_account = bank.get_account(&sysvar::recent_blockhashes::id()).unwrap();
  3232. let recent_blockhashes =
  3233. from_account::<sysvar::recent_blockhashes::RecentBlockhashes, _>(&bhq_account).unwrap();
  3234. // Check length
  3235. assert_eq!(recent_blockhashes.len(), i);
  3236. let most_recent_hash = recent_blockhashes.iter().next().unwrap().blockhash;
  3237. // Check order
  3238. assert!(bank.is_hash_valid_for_age(&most_recent_hash, 0));
  3239. goto_end_of_slot(bank.clone());
  3240. bank = Arc::new(new_from_parent(bank));
  3241. }
  3242. }
  3243. #[allow(deprecated)]
  3244. #[test]
  3245. fn test_blockhash_queue_sysvar_consistency() {
  3246. let (bank, _bank_forks) = create_simple_test_arc_bank(100_000);
  3247. goto_end_of_slot(bank.clone());
  3248. let bhq_account = bank.get_account(&sysvar::recent_blockhashes::id()).unwrap();
  3249. let recent_blockhashes =
  3250. from_account::<sysvar::recent_blockhashes::RecentBlockhashes, _>(&bhq_account).unwrap();
  3251. let sysvar_recent_blockhash = recent_blockhashes[0].blockhash;
  3252. let bank_last_blockhash = bank.last_blockhash();
  3253. assert_eq!(sysvar_recent_blockhash, bank_last_blockhash);
  3254. }
  3255. #[test]
  3256. fn test_hash_internal_state_unchanged() {
  3257. let (genesis_config, _) = create_genesis_config(500);
  3258. let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
  3259. bank0.freeze();
  3260. let bank0_hash = bank0.hash();
  3261. let bank1 = Bank::new_from_parent(bank0, &Pubkey::default(), 1);
  3262. bank1.freeze();
  3263. let bank1_hash = bank1.hash();
  3264. // Checkpointing should always result in a new state
  3265. assert_ne!(bank0_hash, bank1_hash);
  3266. }
  3267. #[test]
  3268. fn test_hash_internal_state_unchanged_with_ticks() {
  3269. let (genesis_config, _) = create_genesis_config(500);
  3270. let bank = Arc::new(Bank::new_for_tests(&genesis_config));
  3271. let bank1 = new_from_parent(bank);
  3272. let hash1 = bank1.hash_internal_state();
  3273. // ticks don't change its state even if a slot boundary is crossed
  3274. // because blockhashes are only recorded at block boundaries
  3275. for _ in 0..genesis_config.ticks_per_slot {
  3276. assert_eq!(bank1.hash_internal_state(), hash1);
  3277. bank1.register_default_tick_for_test();
  3278. }
  3279. assert_eq!(bank1.hash_internal_state(), hash1);
  3280. }
  3281. #[ignore]
  3282. #[test]
  3283. fn test_banks_leak() {
  3284. fn add_lotsa_stake_accounts(genesis_config: &mut GenesisConfig) {
  3285. const LOTSA: usize = 4_096;
  3286. (0..LOTSA).for_each(|_| {
  3287. let pubkey = solana_pubkey::new_rand();
  3288. genesis_config.add_account(
  3289. pubkey,
  3290. stake_state::create_lockup_stake_account(
  3291. &Authorized::auto(&pubkey),
  3292. &Lockup::default(),
  3293. &Rent::default(),
  3294. 50_000_000,
  3295. ),
  3296. );
  3297. });
  3298. }
  3299. solana_logger::setup();
  3300. let (mut genesis_config, _) = create_genesis_config(100_000_000_000_000);
  3301. add_lotsa_stake_accounts(&mut genesis_config);
  3302. let (mut bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  3303. let mut num_banks = 0;
  3304. let pid = std::process::id();
  3305. #[cfg(not(target_os = "linux"))]
  3306. error!(
  3307. "\nYou can run this to watch RAM:\n while read -p 'banks: '; do echo $(( $(ps -o vsize= \
  3308. -p {pid})/$REPLY));done"
  3309. );
  3310. loop {
  3311. num_banks += 1;
  3312. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3313. if num_banks % 100 == 0 {
  3314. #[cfg(target_os = "linux")]
  3315. {
  3316. let pages_consumed = std::fs::read_to_string(format!("/proc/{pid}/statm"))
  3317. .unwrap()
  3318. .split_whitespace()
  3319. .next()
  3320. .unwrap()
  3321. .parse::<usize>()
  3322. .unwrap();
  3323. error!(
  3324. "at {} banks: {} mem or {}kB/bank",
  3325. num_banks,
  3326. pages_consumed * 4096,
  3327. (pages_consumed * 4) / num_banks
  3328. );
  3329. }
  3330. #[cfg(not(target_os = "linux"))]
  3331. {
  3332. error!("{num_banks} banks, sleeping for 5 sec");
  3333. std::thread::sleep(Duration::from_secs(5));
  3334. }
  3335. }
  3336. }
  3337. }
  3338. pub(in crate::bank) fn get_nonce_blockhash(bank: &Bank, nonce_pubkey: &Pubkey) -> Option<Hash> {
  3339. let account = bank.get_account(nonce_pubkey)?;
  3340. let nonce_data = get_nonce_data_from_account(&account)?;
  3341. Some(nonce_data.blockhash())
  3342. }
  3343. pub(in crate::bank) fn get_nonce_data_from_account(
  3344. account: &AccountSharedData,
  3345. ) -> Option<nonce::state::Data> {
  3346. let nonce_versions = StateMut::<nonce::versions::Versions>::state(account).ok()?;
  3347. if let nonce::state::State::Initialized(nonce_data) = nonce_versions.state() {
  3348. Some(nonce_data.clone())
  3349. } else {
  3350. None
  3351. }
  3352. }
  3353. fn nonce_setup(
  3354. bank: &Arc<Bank>,
  3355. mint_keypair: &Keypair,
  3356. custodian_lamports: u64,
  3357. nonce_lamports: u64,
  3358. nonce_authority: Option<Pubkey>,
  3359. ) -> Result<(Keypair, Keypair)> {
  3360. let custodian_keypair = Keypair::new();
  3361. let nonce_keypair = Keypair::new();
  3362. /* Setup accounts */
  3363. let mut setup_ixs = vec![system_instruction::transfer(
  3364. &mint_keypair.pubkey(),
  3365. &custodian_keypair.pubkey(),
  3366. custodian_lamports,
  3367. )];
  3368. let nonce_authority = nonce_authority.unwrap_or_else(|| nonce_keypair.pubkey());
  3369. setup_ixs.extend_from_slice(&system_instruction::create_nonce_account(
  3370. &custodian_keypair.pubkey(),
  3371. &nonce_keypair.pubkey(),
  3372. &nonce_authority,
  3373. nonce_lamports,
  3374. ));
  3375. let message = Message::new(&setup_ixs, Some(&mint_keypair.pubkey()));
  3376. let setup_tx = Transaction::new(
  3377. &[mint_keypair, &custodian_keypair, &nonce_keypair],
  3378. message,
  3379. bank.last_blockhash(),
  3380. );
  3381. bank.process_transaction(&setup_tx)?;
  3382. Ok((custodian_keypair, nonce_keypair))
  3383. }
  3384. type NonceSetup = (Arc<Bank>, Keypair, Keypair, Keypair, Arc<RwLock<BankForks>>);
  3385. pub(in crate::bank) fn setup_nonce_with_bank<F>(
  3386. supply_lamports: u64,
  3387. mut genesis_cfg_fn: F,
  3388. custodian_lamports: u64,
  3389. nonce_lamports: u64,
  3390. nonce_authority: Option<Pubkey>,
  3391. feature_set: FeatureSet,
  3392. ) -> Result<NonceSetup>
  3393. where
  3394. F: FnMut(&mut GenesisConfig),
  3395. {
  3396. let (mut genesis_config, mint_keypair) = create_genesis_config(supply_lamports);
  3397. genesis_config.rent.lamports_per_byte_year = 0;
  3398. genesis_cfg_fn(&mut genesis_config);
  3399. let mut bank = Bank::new_for_tests(&genesis_config);
  3400. bank.feature_set = Arc::new(feature_set);
  3401. let (mut bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
  3402. // Banks 0 and 1 have no fees, wait two blocks before
  3403. // initializing our nonce accounts
  3404. for _ in 0..2 {
  3405. goto_end_of_slot(bank.clone());
  3406. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3407. }
  3408. let (custodian_keypair, nonce_keypair) = nonce_setup(
  3409. &bank,
  3410. &mint_keypair,
  3411. custodian_lamports,
  3412. nonce_lamports,
  3413. nonce_authority,
  3414. )?;
  3415. // The setup nonce is not valid to be used until the next bank
  3416. // so wait one more block
  3417. goto_end_of_slot(bank.clone());
  3418. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3419. Ok((
  3420. bank,
  3421. mint_keypair,
  3422. custodian_keypair,
  3423. nonce_keypair,
  3424. bank_forks,
  3425. ))
  3426. }
  3427. impl Bank {
  3428. pub(in crate::bank) fn next_durable_nonce(&self) -> DurableNonce {
  3429. let hash_queue = self.blockhash_queue.read().unwrap();
  3430. let last_blockhash = hash_queue.last_hash();
  3431. DurableNonce::from_blockhash(&last_blockhash)
  3432. }
  3433. }
  3434. #[test]
  3435. fn test_assign_from_nonce_account_fail() {
  3436. let (bank, _bank_forks) = create_simple_test_arc_bank(100_000_000);
  3437. let nonce = Keypair::new();
  3438. let nonce_account = AccountSharedData::new_data(
  3439. 42_424_242,
  3440. &nonce::versions::Versions::new(nonce::state::State::Initialized(
  3441. nonce::state::Data::default(),
  3442. )),
  3443. &system_program::id(),
  3444. )
  3445. .unwrap();
  3446. let blockhash = bank.last_blockhash();
  3447. bank.store_account(&nonce.pubkey(), &nonce_account);
  3448. let ix = system_instruction::assign(&nonce.pubkey(), &Pubkey::from([9u8; 32]));
  3449. let message = Message::new(&[ix], Some(&nonce.pubkey()));
  3450. let tx = Transaction::new(&[&nonce], message, blockhash);
  3451. let expect = Err(TransactionError::InstructionError(
  3452. 0,
  3453. InstructionError::ModifiedProgramId,
  3454. ));
  3455. assert_eq!(bank.process_transaction(&tx), expect);
  3456. }
  3457. #[test]
  3458. fn test_nonce_must_be_advanceable() {
  3459. let mut bank = create_simple_test_bank(100_000_000);
  3460. bank.feature_set = Arc::new(FeatureSet::all_enabled());
  3461. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  3462. let nonce_keypair = Keypair::new();
  3463. let nonce_authority = nonce_keypair.pubkey();
  3464. let durable_nonce = DurableNonce::from_blockhash(&bank.last_blockhash());
  3465. let nonce_account =
  3466. AccountSharedData::new_data(
  3467. 42_424_242,
  3468. &nonce::versions::Versions::new(nonce::state::State::Initialized(
  3469. nonce::state::Data::new(nonce_authority, durable_nonce, 5000),
  3470. )),
  3471. &system_program::id(),
  3472. )
  3473. .unwrap();
  3474. bank.store_account(&nonce_keypair.pubkey(), &nonce_account);
  3475. let ix = system_instruction::advance_nonce_account(&nonce_keypair.pubkey(), &nonce_authority);
  3476. let message = Message::new(&[ix], Some(&nonce_keypair.pubkey()));
  3477. let tx = Transaction::new(&[&nonce_keypair], message, *durable_nonce.as_hash());
  3478. assert_eq!(
  3479. bank.process_transaction(&tx),
  3480. Err(TransactionError::BlockhashNotFound)
  3481. );
  3482. }
  3483. #[test]
  3484. fn test_nonce_transaction() {
  3485. let (mut bank, _mint_keypair, custodian_keypair, nonce_keypair, bank_forks) =
  3486. setup_nonce_with_bank(
  3487. 10_000_000,
  3488. |_| {},
  3489. 5_000_000,
  3490. 250_000,
  3491. None,
  3492. FeatureSet::all_enabled(),
  3493. )
  3494. .unwrap();
  3495. let alice_keypair = Keypair::new();
  3496. let alice_pubkey = alice_keypair.pubkey();
  3497. let custodian_pubkey = custodian_keypair.pubkey();
  3498. let nonce_pubkey = nonce_keypair.pubkey();
  3499. assert_eq!(bank.get_balance(&custodian_pubkey), 4_750_000);
  3500. assert_eq!(bank.get_balance(&nonce_pubkey), 250_000);
  3501. /* Grab the hash stored in the nonce account */
  3502. let nonce_hash = get_nonce_blockhash(&bank, &nonce_pubkey).unwrap();
  3503. /* Kick nonce hash off the blockhash_queue */
  3504. for _ in 0..MAX_RECENT_BLOCKHASHES + 1 {
  3505. goto_end_of_slot(bank.clone());
  3506. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3507. }
  3508. /* Expect a non-Nonce transfer to fail */
  3509. assert_eq!(
  3510. bank.process_transaction(&system_transaction::transfer(
  3511. &custodian_keypair,
  3512. &alice_pubkey,
  3513. 100_000,
  3514. nonce_hash
  3515. ),),
  3516. Err(TransactionError::BlockhashNotFound),
  3517. );
  3518. /* Check fee not charged */
  3519. assert_eq!(bank.get_balance(&custodian_pubkey), 4_750_000);
  3520. /* Nonce transfer */
  3521. let nonce_tx = Transaction::new_signed_with_payer(
  3522. &[
  3523. system_instruction::advance_nonce_account(&nonce_pubkey, &nonce_pubkey),
  3524. system_instruction::transfer(&custodian_pubkey, &alice_pubkey, 100_000),
  3525. ],
  3526. Some(&custodian_pubkey),
  3527. &[&custodian_keypair, &nonce_keypair],
  3528. nonce_hash,
  3529. );
  3530. assert_eq!(bank.process_transaction(&nonce_tx), Ok(()));
  3531. /* Check balances */
  3532. let mut recent_message = nonce_tx.message;
  3533. recent_message.recent_blockhash = bank.last_blockhash();
  3534. let mut expected_balance = 4_650_000
  3535. - bank
  3536. .get_fee_for_message(&new_sanitized_message(recent_message))
  3537. .unwrap();
  3538. assert_eq!(bank.get_balance(&custodian_pubkey), expected_balance);
  3539. assert_eq!(bank.get_balance(&nonce_pubkey), 250_000);
  3540. assert_eq!(bank.get_balance(&alice_pubkey), 100_000);
  3541. /* Confirm stored nonce has advanced */
  3542. let new_nonce = get_nonce_blockhash(&bank, &nonce_pubkey).unwrap();
  3543. assert_ne!(nonce_hash, new_nonce);
  3544. /* Nonce re-use fails */
  3545. let nonce_tx = Transaction::new_signed_with_payer(
  3546. &[
  3547. system_instruction::advance_nonce_account(&nonce_pubkey, &nonce_pubkey),
  3548. system_instruction::transfer(&custodian_pubkey, &alice_pubkey, 100_000),
  3549. ],
  3550. Some(&custodian_pubkey),
  3551. &[&custodian_keypair, &nonce_keypair],
  3552. nonce_hash,
  3553. );
  3554. assert_eq!(
  3555. bank.process_transaction(&nonce_tx),
  3556. Err(TransactionError::BlockhashNotFound)
  3557. );
  3558. /* Check fee not charged and nonce not advanced */
  3559. assert_eq!(bank.get_balance(&custodian_pubkey), expected_balance);
  3560. assert_eq!(
  3561. new_nonce,
  3562. get_nonce_blockhash(&bank, &nonce_pubkey).unwrap()
  3563. );
  3564. let nonce_hash = new_nonce;
  3565. /* Kick nonce hash off the blockhash_queue */
  3566. for _ in 0..MAX_RECENT_BLOCKHASHES + 1 {
  3567. goto_end_of_slot(bank.clone());
  3568. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3569. }
  3570. let nonce_tx = Transaction::new_signed_with_payer(
  3571. &[
  3572. system_instruction::advance_nonce_account(&nonce_pubkey, &nonce_pubkey),
  3573. system_instruction::transfer(&custodian_pubkey, &alice_pubkey, 100_000_000),
  3574. ],
  3575. Some(&custodian_pubkey),
  3576. &[&custodian_keypair, &nonce_keypair],
  3577. nonce_hash,
  3578. );
  3579. assert_eq!(
  3580. bank.process_transaction(&nonce_tx),
  3581. Err(TransactionError::InstructionError(
  3582. 1,
  3583. solana_system_interface::error::SystemError::ResultWithNegativeLamports.into(),
  3584. ))
  3585. );
  3586. /* Check fee charged and nonce has advanced */
  3587. let mut recent_message = nonce_tx.message.clone();
  3588. recent_message.recent_blockhash = bank.last_blockhash();
  3589. expected_balance -= bank
  3590. .get_fee_for_message(&new_sanitized_message(recent_message))
  3591. .unwrap();
  3592. assert_eq!(bank.get_balance(&custodian_pubkey), expected_balance);
  3593. assert_ne!(
  3594. nonce_hash,
  3595. get_nonce_blockhash(&bank, &nonce_pubkey).unwrap()
  3596. );
  3597. /* Confirm replaying a TX that failed with InstructionError::* now
  3598. * fails with TransactionError::BlockhashNotFound
  3599. */
  3600. assert_eq!(
  3601. bank.process_transaction(&nonce_tx),
  3602. Err(TransactionError::BlockhashNotFound),
  3603. );
  3604. }
  3605. #[test]
  3606. fn test_nonce_transaction_with_tx_wide_caps() {
  3607. let feature_set = FeatureSet::all_enabled();
  3608. let (mut bank, _mint_keypair, custodian_keypair, nonce_keypair, bank_forks) =
  3609. setup_nonce_with_bank(10_000_000, |_| {}, 5_000_000, 250_000, None, feature_set).unwrap();
  3610. let alice_keypair = Keypair::new();
  3611. let alice_pubkey = alice_keypair.pubkey();
  3612. let custodian_pubkey = custodian_keypair.pubkey();
  3613. let nonce_pubkey = nonce_keypair.pubkey();
  3614. assert_eq!(bank.get_balance(&custodian_pubkey), 4_750_000);
  3615. assert_eq!(bank.get_balance(&nonce_pubkey), 250_000);
  3616. /* Grab the hash stored in the nonce account */
  3617. let nonce_hash = get_nonce_blockhash(&bank, &nonce_pubkey).unwrap();
  3618. /* Kick nonce hash off the blockhash_queue */
  3619. for _ in 0..MAX_RECENT_BLOCKHASHES + 1 {
  3620. goto_end_of_slot(bank.clone());
  3621. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3622. }
  3623. /* Expect a non-Nonce transfer to fail */
  3624. assert_eq!(
  3625. bank.process_transaction(&system_transaction::transfer(
  3626. &custodian_keypair,
  3627. &alice_pubkey,
  3628. 100_000,
  3629. nonce_hash
  3630. ),),
  3631. Err(TransactionError::BlockhashNotFound),
  3632. );
  3633. /* Check fee not charged */
  3634. assert_eq!(bank.get_balance(&custodian_pubkey), 4_750_000);
  3635. /* Nonce transfer */
  3636. let nonce_tx = Transaction::new_signed_with_payer(
  3637. &[
  3638. system_instruction::advance_nonce_account(&nonce_pubkey, &nonce_pubkey),
  3639. system_instruction::transfer(&custodian_pubkey, &alice_pubkey, 100_000),
  3640. ],
  3641. Some(&custodian_pubkey),
  3642. &[&custodian_keypair, &nonce_keypair],
  3643. nonce_hash,
  3644. );
  3645. assert_eq!(bank.process_transaction(&nonce_tx), Ok(()));
  3646. /* Check balances */
  3647. let mut recent_message = nonce_tx.message;
  3648. recent_message.recent_blockhash = bank.last_blockhash();
  3649. let mut expected_balance = 4_650_000
  3650. - bank
  3651. .get_fee_for_message(&new_sanitized_message(recent_message))
  3652. .unwrap();
  3653. assert_eq!(bank.get_balance(&custodian_pubkey), expected_balance);
  3654. assert_eq!(bank.get_balance(&nonce_pubkey), 250_000);
  3655. assert_eq!(bank.get_balance(&alice_pubkey), 100_000);
  3656. /* Confirm stored nonce has advanced */
  3657. let new_nonce = get_nonce_blockhash(&bank, &nonce_pubkey).unwrap();
  3658. assert_ne!(nonce_hash, new_nonce);
  3659. /* Nonce re-use fails */
  3660. let nonce_tx = Transaction::new_signed_with_payer(
  3661. &[
  3662. system_instruction::advance_nonce_account(&nonce_pubkey, &nonce_pubkey),
  3663. system_instruction::transfer(&custodian_pubkey, &alice_pubkey, 100_000),
  3664. ],
  3665. Some(&custodian_pubkey),
  3666. &[&custodian_keypair, &nonce_keypair],
  3667. nonce_hash,
  3668. );
  3669. assert_eq!(
  3670. bank.process_transaction(&nonce_tx),
  3671. Err(TransactionError::BlockhashNotFound)
  3672. );
  3673. /* Check fee not charged and nonce not advanced */
  3674. assert_eq!(bank.get_balance(&custodian_pubkey), expected_balance);
  3675. assert_eq!(
  3676. new_nonce,
  3677. get_nonce_blockhash(&bank, &nonce_pubkey).unwrap()
  3678. );
  3679. let nonce_hash = new_nonce;
  3680. /* Kick nonce hash off the blockhash_queue */
  3681. for _ in 0..MAX_RECENT_BLOCKHASHES + 1 {
  3682. goto_end_of_slot(bank.clone());
  3683. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3684. }
  3685. let nonce_tx = Transaction::new_signed_with_payer(
  3686. &[
  3687. system_instruction::advance_nonce_account(&nonce_pubkey, &nonce_pubkey),
  3688. system_instruction::transfer(&custodian_pubkey, &alice_pubkey, 100_000_000),
  3689. ],
  3690. Some(&custodian_pubkey),
  3691. &[&custodian_keypair, &nonce_keypair],
  3692. nonce_hash,
  3693. );
  3694. assert_eq!(
  3695. bank.process_transaction(&nonce_tx),
  3696. Err(TransactionError::InstructionError(
  3697. 1,
  3698. solana_system_interface::error::SystemError::ResultWithNegativeLamports.into(),
  3699. ))
  3700. );
  3701. /* Check fee charged and nonce has advanced */
  3702. let mut recent_message = nonce_tx.message.clone();
  3703. recent_message.recent_blockhash = bank.last_blockhash();
  3704. expected_balance -= bank
  3705. .get_fee_for_message(&new_sanitized_message(recent_message))
  3706. .unwrap();
  3707. assert_eq!(bank.get_balance(&custodian_pubkey), expected_balance);
  3708. assert_ne!(
  3709. nonce_hash,
  3710. get_nonce_blockhash(&bank, &nonce_pubkey).unwrap()
  3711. );
  3712. /* Confirm replaying a TX that failed with InstructionError::* now
  3713. * fails with TransactionError::BlockhashNotFound
  3714. */
  3715. assert_eq!(
  3716. bank.process_transaction(&nonce_tx),
  3717. Err(TransactionError::BlockhashNotFound),
  3718. );
  3719. }
  3720. #[test]
  3721. fn test_nonce_authority() {
  3722. solana_logger::setup();
  3723. let (mut bank, _mint_keypair, custodian_keypair, nonce_keypair, bank_forks) =
  3724. setup_nonce_with_bank(
  3725. 10_000_000,
  3726. |_| {},
  3727. 5_000_000,
  3728. 250_000,
  3729. None,
  3730. FeatureSet::all_enabled(),
  3731. )
  3732. .unwrap();
  3733. let alice_keypair = Keypair::new();
  3734. let alice_pubkey = alice_keypair.pubkey();
  3735. let custodian_pubkey = custodian_keypair.pubkey();
  3736. let nonce_pubkey = nonce_keypair.pubkey();
  3737. let bad_nonce_authority_keypair = Keypair::new();
  3738. let bad_nonce_authority = bad_nonce_authority_keypair.pubkey();
  3739. let custodian_account = bank.get_account(&custodian_pubkey).unwrap();
  3740. debug!("alice: {alice_pubkey}");
  3741. debug!("custodian: {custodian_pubkey}");
  3742. debug!("nonce: {nonce_pubkey}");
  3743. debug!("nonce account: {:?}", bank.get_account(&nonce_pubkey));
  3744. debug!("cust: {custodian_account:?}");
  3745. let nonce_hash = get_nonce_blockhash(&bank, &nonce_pubkey).unwrap();
  3746. for _ in 0..MAX_RECENT_BLOCKHASHES + 1 {
  3747. goto_end_of_slot(bank.clone());
  3748. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3749. }
  3750. let nonce_tx = Transaction::new_signed_with_payer(
  3751. &[
  3752. system_instruction::advance_nonce_account(&nonce_pubkey, &bad_nonce_authority),
  3753. system_instruction::transfer(&custodian_pubkey, &alice_pubkey, 42),
  3754. ],
  3755. Some(&custodian_pubkey),
  3756. &[&custodian_keypair, &bad_nonce_authority_keypair],
  3757. nonce_hash,
  3758. );
  3759. debug!("{nonce_tx:?}");
  3760. let initial_custodian_balance = custodian_account.lamports();
  3761. assert_eq!(
  3762. bank.process_transaction(&nonce_tx),
  3763. Err(TransactionError::BlockhashNotFound),
  3764. );
  3765. /* Check fee was *not* charged and nonce has *not* advanced */
  3766. let mut recent_message = nonce_tx.message;
  3767. recent_message.recent_blockhash = bank.last_blockhash();
  3768. assert_eq!(
  3769. bank.get_balance(&custodian_pubkey),
  3770. initial_custodian_balance
  3771. );
  3772. assert_eq!(
  3773. nonce_hash,
  3774. get_nonce_blockhash(&bank, &nonce_pubkey).unwrap()
  3775. );
  3776. }
  3777. #[test]
  3778. fn test_nonce_payer() {
  3779. solana_logger::setup();
  3780. let nonce_starting_balance = 250_000;
  3781. let (mut bank, _mint_keypair, custodian_keypair, nonce_keypair, bank_forks) =
  3782. setup_nonce_with_bank(
  3783. 10_000_000,
  3784. |_| {},
  3785. 5_000_000,
  3786. nonce_starting_balance,
  3787. None,
  3788. FeatureSet::all_enabled(),
  3789. )
  3790. .unwrap();
  3791. let alice_keypair = Keypair::new();
  3792. let alice_pubkey = alice_keypair.pubkey();
  3793. let custodian_pubkey = custodian_keypair.pubkey();
  3794. let nonce_pubkey = nonce_keypair.pubkey();
  3795. debug!("alice: {alice_pubkey}");
  3796. debug!("custodian: {custodian_pubkey}");
  3797. debug!("nonce: {nonce_pubkey}");
  3798. debug!("nonce account: {:?}", bank.get_account(&nonce_pubkey));
  3799. debug!("cust: {:?}", bank.get_account(&custodian_pubkey));
  3800. let nonce_hash = get_nonce_blockhash(&bank, &nonce_pubkey).unwrap();
  3801. for _ in 0..MAX_RECENT_BLOCKHASHES + 1 {
  3802. goto_end_of_slot(bank.clone());
  3803. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3804. }
  3805. let nonce_tx = Transaction::new_signed_with_payer(
  3806. &[
  3807. system_instruction::advance_nonce_account(&nonce_pubkey, &nonce_pubkey),
  3808. system_instruction::transfer(&custodian_pubkey, &alice_pubkey, 100_000_000),
  3809. ],
  3810. Some(&nonce_pubkey),
  3811. &[&custodian_keypair, &nonce_keypair],
  3812. nonce_hash,
  3813. );
  3814. debug!("{nonce_tx:?}");
  3815. assert_eq!(
  3816. bank.process_transaction(&nonce_tx),
  3817. Err(TransactionError::InstructionError(
  3818. 1,
  3819. solana_system_interface::error::SystemError::ResultWithNegativeLamports.into(),
  3820. ))
  3821. );
  3822. /* Check fee charged and nonce has advanced */
  3823. let mut recent_message = nonce_tx.message;
  3824. recent_message.recent_blockhash = bank.last_blockhash();
  3825. assert_eq!(
  3826. bank.get_balance(&nonce_pubkey),
  3827. nonce_starting_balance
  3828. - bank
  3829. .get_fee_for_message(&new_sanitized_message(recent_message))
  3830. .unwrap()
  3831. );
  3832. assert_ne!(
  3833. nonce_hash,
  3834. get_nonce_blockhash(&bank, &nonce_pubkey).unwrap()
  3835. );
  3836. }
  3837. #[test]
  3838. fn test_nonce_payer_tx_wide_cap() {
  3839. solana_logger::setup();
  3840. let nonce_starting_balance =
  3841. 250_000 + FeeStructure::default().compute_fee_bins.last().unwrap().fee;
  3842. let feature_set = FeatureSet::all_enabled();
  3843. let (mut bank, _mint_keypair, custodian_keypair, nonce_keypair, bank_forks) =
  3844. setup_nonce_with_bank(
  3845. 10_000_000,
  3846. |_| {},
  3847. 5_000_000,
  3848. nonce_starting_balance,
  3849. None,
  3850. feature_set,
  3851. )
  3852. .unwrap();
  3853. let alice_keypair = Keypair::new();
  3854. let alice_pubkey = alice_keypair.pubkey();
  3855. let custodian_pubkey = custodian_keypair.pubkey();
  3856. let nonce_pubkey = nonce_keypair.pubkey();
  3857. debug!("alice: {alice_pubkey}");
  3858. debug!("custodian: {custodian_pubkey}");
  3859. debug!("nonce: {nonce_pubkey}");
  3860. debug!("nonce account: {:?}", bank.get_account(&nonce_pubkey));
  3861. debug!("cust: {:?}", bank.get_account(&custodian_pubkey));
  3862. let nonce_hash = get_nonce_blockhash(&bank, &nonce_pubkey).unwrap();
  3863. for _ in 0..MAX_RECENT_BLOCKHASHES + 1 {
  3864. goto_end_of_slot(bank.clone());
  3865. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3866. }
  3867. let nonce_tx = Transaction::new_signed_with_payer(
  3868. &[
  3869. system_instruction::advance_nonce_account(&nonce_pubkey, &nonce_pubkey),
  3870. system_instruction::transfer(&custodian_pubkey, &alice_pubkey, 100_000_000),
  3871. ],
  3872. Some(&nonce_pubkey),
  3873. &[&custodian_keypair, &nonce_keypair],
  3874. nonce_hash,
  3875. );
  3876. debug!("{nonce_tx:?}");
  3877. assert_eq!(
  3878. bank.process_transaction(&nonce_tx),
  3879. Err(TransactionError::InstructionError(
  3880. 1,
  3881. solana_system_interface::error::SystemError::ResultWithNegativeLamports.into(),
  3882. ))
  3883. );
  3884. /* Check fee charged and nonce has advanced */
  3885. let mut recent_message = nonce_tx.message;
  3886. recent_message.recent_blockhash = bank.last_blockhash();
  3887. assert_eq!(
  3888. bank.get_balance(&nonce_pubkey),
  3889. nonce_starting_balance
  3890. - bank
  3891. .get_fee_for_message(&new_sanitized_message(recent_message))
  3892. .unwrap()
  3893. );
  3894. assert_ne!(
  3895. nonce_hash,
  3896. get_nonce_blockhash(&bank, &nonce_pubkey).unwrap()
  3897. );
  3898. }
  3899. #[test]
  3900. fn test_nonce_fee_calculator_updates() {
  3901. let (mut genesis_config, mint_keypair) = create_genesis_config(1_000_000);
  3902. genesis_config.rent.lamports_per_byte_year = 0;
  3903. let mut bank = Bank::new_for_tests(&genesis_config);
  3904. bank.feature_set = Arc::new(FeatureSet::all_enabled());
  3905. let (mut bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
  3906. // Deliberately use bank 0 to initialize nonce account, so that nonce account fee_calculator indicates 0 fees
  3907. let (custodian_keypair, nonce_keypair) =
  3908. nonce_setup(&bank, &mint_keypair, 500_000, 100_000, None).unwrap();
  3909. let custodian_pubkey = custodian_keypair.pubkey();
  3910. let nonce_pubkey = nonce_keypair.pubkey();
  3911. // Grab the hash and fee_calculator stored in the nonce account
  3912. let (stored_nonce_hash, stored_fee_calculator) = bank
  3913. .get_account(&nonce_pubkey)
  3914. .and_then(|acc| {
  3915. let nonce_versions = StateMut::<nonce::versions::Versions>::state(&acc);
  3916. match nonce_versions.ok()?.state() {
  3917. nonce::state::State::Initialized(ref data) => {
  3918. Some((data.blockhash(), data.fee_calculator))
  3919. }
  3920. _ => None,
  3921. }
  3922. })
  3923. .unwrap();
  3924. // Kick nonce hash off the blockhash_queue
  3925. for _ in 0..MAX_RECENT_BLOCKHASHES + 1 {
  3926. goto_end_of_slot(bank.clone());
  3927. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3928. }
  3929. // Nonce transfer
  3930. let nonce_tx = Transaction::new_signed_with_payer(
  3931. &[
  3932. system_instruction::advance_nonce_account(&nonce_pubkey, &nonce_pubkey),
  3933. system_instruction::transfer(&custodian_pubkey, &solana_pubkey::new_rand(), 100_000),
  3934. ],
  3935. Some(&custodian_pubkey),
  3936. &[&custodian_keypair, &nonce_keypair],
  3937. stored_nonce_hash,
  3938. );
  3939. bank.process_transaction(&nonce_tx).unwrap();
  3940. // Grab the new hash and fee_calculator; both should be updated
  3941. let (nonce_hash, fee_calculator) = bank
  3942. .get_account(&nonce_pubkey)
  3943. .and_then(|acc| {
  3944. let nonce_versions = StateMut::<nonce::versions::Versions>::state(&acc);
  3945. match nonce_versions.ok()?.state() {
  3946. nonce::state::State::Initialized(ref data) => {
  3947. Some((data.blockhash(), data.fee_calculator))
  3948. }
  3949. _ => None,
  3950. }
  3951. })
  3952. .unwrap();
  3953. assert_ne!(stored_nonce_hash, nonce_hash);
  3954. assert_ne!(stored_fee_calculator, fee_calculator);
  3955. }
  3956. #[test]
  3957. fn test_nonce_fee_calculator_updates_tx_wide_cap() {
  3958. let (mut genesis_config, mint_keypair) = create_genesis_config(1_000_000);
  3959. genesis_config.rent.lamports_per_byte_year = 0;
  3960. let mut bank = Bank::new_for_tests(&genesis_config);
  3961. bank.feature_set = Arc::new(FeatureSet::all_enabled());
  3962. let (mut bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
  3963. // Deliberately use bank 0 to initialize nonce account, so that nonce account fee_calculator indicates 0 fees
  3964. let (custodian_keypair, nonce_keypair) =
  3965. nonce_setup(&bank, &mint_keypair, 500_000, 100_000, None).unwrap();
  3966. let custodian_pubkey = custodian_keypair.pubkey();
  3967. let nonce_pubkey = nonce_keypair.pubkey();
  3968. // Grab the hash and fee_calculator stored in the nonce account
  3969. let (stored_nonce_hash, stored_fee_calculator) = bank
  3970. .get_account(&nonce_pubkey)
  3971. .and_then(|acc| {
  3972. let nonce_versions = StateMut::<nonce::versions::Versions>::state(&acc);
  3973. match nonce_versions.ok()?.state() {
  3974. nonce::state::State::Initialized(ref data) => {
  3975. Some((data.blockhash(), data.fee_calculator))
  3976. }
  3977. _ => None,
  3978. }
  3979. })
  3980. .unwrap();
  3981. // Kick nonce hash off the blockhash_queue
  3982. for _ in 0..MAX_RECENT_BLOCKHASHES + 1 {
  3983. goto_end_of_slot(bank.clone());
  3984. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  3985. }
  3986. // Nonce transfer
  3987. let nonce_tx = Transaction::new_signed_with_payer(
  3988. &[
  3989. system_instruction::advance_nonce_account(&nonce_pubkey, &nonce_pubkey),
  3990. system_instruction::transfer(&custodian_pubkey, &solana_pubkey::new_rand(), 100_000),
  3991. ],
  3992. Some(&custodian_pubkey),
  3993. &[&custodian_keypair, &nonce_keypair],
  3994. stored_nonce_hash,
  3995. );
  3996. bank.process_transaction(&nonce_tx).unwrap();
  3997. // Grab the new hash and fee_calculator; both should be updated
  3998. let (nonce_hash, fee_calculator) = bank
  3999. .get_account(&nonce_pubkey)
  4000. .and_then(|acc| {
  4001. let nonce_versions = StateMut::<nonce::versions::Versions>::state(&acc);
  4002. match nonce_versions.ok()?.state() {
  4003. nonce::state::State::Initialized(ref data) => {
  4004. Some((data.blockhash(), data.fee_calculator))
  4005. }
  4006. _ => None,
  4007. }
  4008. })
  4009. .unwrap();
  4010. assert_ne!(stored_nonce_hash, nonce_hash);
  4011. assert_ne!(stored_fee_calculator, fee_calculator);
  4012. }
  4013. #[test]
  4014. fn test_check_ro_durable_nonce_fails() {
  4015. let (mut bank, _mint_keypair, custodian_keypair, nonce_keypair, bank_forks) =
  4016. setup_nonce_with_bank(
  4017. 10_000_000,
  4018. |_| {},
  4019. 5_000_000,
  4020. 250_000,
  4021. None,
  4022. FeatureSet::all_enabled(),
  4023. )
  4024. .unwrap();
  4025. let custodian_pubkey = custodian_keypair.pubkey();
  4026. let nonce_pubkey = nonce_keypair.pubkey();
  4027. let nonce_hash = get_nonce_blockhash(&bank, &nonce_pubkey).unwrap();
  4028. let account_metas = vec![
  4029. AccountMeta::new_readonly(nonce_pubkey, false),
  4030. #[allow(deprecated)]
  4031. AccountMeta::new_readonly(sysvar::recent_blockhashes::id(), false),
  4032. AccountMeta::new_readonly(nonce_pubkey, true),
  4033. ];
  4034. let nonce_instruction = Instruction::new_with_bincode(
  4035. system_program::id(),
  4036. &system_instruction::SystemInstruction::AdvanceNonceAccount,
  4037. account_metas,
  4038. );
  4039. let tx = Transaction::new_signed_with_payer(
  4040. &[nonce_instruction],
  4041. Some(&custodian_pubkey),
  4042. &[&custodian_keypair, &nonce_keypair],
  4043. nonce_hash,
  4044. );
  4045. // SanitizedMessage::get_durable_nonce returns None because nonce
  4046. // account is not writable. Durable nonce and blockhash domains are
  4047. // separate, so the recent_blockhash (== durable nonce) in the
  4048. // transaction is not found in the hash queue.
  4049. assert_eq!(
  4050. bank.process_transaction(&tx),
  4051. Err(TransactionError::BlockhashNotFound),
  4052. );
  4053. // Kick nonce hash off the blockhash_queue
  4054. for _ in 0..MAX_RECENT_BLOCKHASHES + 1 {
  4055. goto_end_of_slot(bank.clone());
  4056. bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref())
  4057. }
  4058. // Caught by the runtime because it is a nonce transaction
  4059. assert_eq!(
  4060. bank.process_transaction(&tx),
  4061. Err(TransactionError::BlockhashNotFound)
  4062. );
  4063. let (_, lamports_per_signature) = bank.last_blockhash_and_lamports_per_signature();
  4064. assert_eq!(
  4065. bank.check_load_and_advance_message_nonce_account(
  4066. &new_sanitized_message(tx.message().clone()),
  4067. &bank.next_durable_nonce(),
  4068. lamports_per_signature,
  4069. ),
  4070. None
  4071. );
  4072. }
  4073. #[test]
  4074. fn test_collect_balances() {
  4075. let (parent, _bank_forks) = create_simple_test_arc_bank(500);
  4076. let bank0 = Arc::new(new_from_parent(parent));
  4077. let keypair = Keypair::new();
  4078. let pubkey0 = solana_pubkey::new_rand();
  4079. let pubkey1 = solana_pubkey::new_rand();
  4080. let program_id = Pubkey::from([2; 32]);
  4081. let keypair_account = AccountSharedData::new(8, 0, &program_id);
  4082. let account0 = AccountSharedData::new(11, 0, &program_id);
  4083. let program_account = AccountSharedData::new(1, 10, &Pubkey::default());
  4084. bank0.store_account(&keypair.pubkey(), &keypair_account);
  4085. bank0.store_account(&pubkey0, &account0);
  4086. bank0.store_account(&program_id, &program_account);
  4087. let instructions = vec![CompiledInstruction::new(1, &(), vec![0])];
  4088. let tx0 = Transaction::new_with_compiled_instructions(
  4089. &[&keypair],
  4090. &[pubkey0],
  4091. Hash::default(),
  4092. vec![program_id],
  4093. instructions,
  4094. );
  4095. let instructions = vec![CompiledInstruction::new(1, &(), vec![0])];
  4096. let tx1 = Transaction::new_with_compiled_instructions(
  4097. &[&keypair],
  4098. &[pubkey1],
  4099. Hash::default(),
  4100. vec![program_id],
  4101. instructions,
  4102. );
  4103. let txs = vec![tx0, tx1];
  4104. let batch = bank0.prepare_batch_for_tests(txs.clone());
  4105. let balances = bank0.collect_balances(&batch);
  4106. assert_eq!(balances.len(), 2);
  4107. assert_eq!(balances[0], vec![8, 11, 1]);
  4108. assert_eq!(balances[1], vec![8, 0, 1]);
  4109. let txs: Vec<_> = txs.into_iter().rev().collect();
  4110. let batch = bank0.prepare_batch_for_tests(txs);
  4111. let balances = bank0.collect_balances(&batch);
  4112. assert_eq!(balances.len(), 2);
  4113. assert_eq!(balances[0], vec![8, 0, 1]);
  4114. assert_eq!(balances[1], vec![8, 11, 1]);
  4115. }
  4116. #[test]
  4117. fn test_pre_post_transaction_balances() {
  4118. let (mut genesis_config, _mint_keypair) = create_genesis_config(500_000);
  4119. let fee_rate_governor = FeeRateGovernor::new(5000, 0);
  4120. genesis_config.fee_rate_governor = fee_rate_governor;
  4121. let (parent, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  4122. let bank0 = new_from_parent_with_fork_next_slot(parent, bank_forks.as_ref());
  4123. let keypair0 = Keypair::new();
  4124. let keypair1 = Keypair::new();
  4125. let pubkey0 = solana_pubkey::new_rand();
  4126. let pubkey1 = solana_pubkey::new_rand();
  4127. let pubkey2 = solana_pubkey::new_rand();
  4128. let keypair0_account = AccountSharedData::new(908_000, 0, &Pubkey::default());
  4129. let keypair1_account = AccountSharedData::new(909_000, 0, &Pubkey::default());
  4130. let account0 = AccountSharedData::new(911_000, 0, &Pubkey::default());
  4131. bank0.store_account(&keypair0.pubkey(), &keypair0_account);
  4132. bank0.store_account(&keypair1.pubkey(), &keypair1_account);
  4133. bank0.store_account(&pubkey0, &account0);
  4134. let blockhash = bank0.last_blockhash();
  4135. let tx0 = system_transaction::transfer(&keypair0, &pubkey0, 2_000, blockhash);
  4136. let tx1 = system_transaction::transfer(&Keypair::new(), &pubkey1, 2_000, blockhash);
  4137. let tx2 = system_transaction::transfer(&keypair1, &pubkey2, 912_000, blockhash);
  4138. let txs = vec![tx0, tx1, tx2];
  4139. let lock_result = bank0.prepare_batch_for_tests(txs);
  4140. let (commit_results, balance_collector) = bank0.load_execute_and_commit_transactions(
  4141. &lock_result,
  4142. MAX_PROCESSING_AGE,
  4143. ExecutionRecordingConfig {
  4144. enable_cpi_recording: false,
  4145. enable_log_recording: false,
  4146. enable_return_data_recording: false,
  4147. enable_transaction_balance_recording: true,
  4148. },
  4149. &mut ExecuteTimings::default(),
  4150. None,
  4151. );
  4152. let (native_pre, native_post, _, _) = balance_collector.unwrap().into_vecs();
  4153. let transaction_balances_set = TransactionBalancesSet::new(native_pre, native_post);
  4154. assert_eq!(transaction_balances_set.pre_balances.len(), 3);
  4155. assert_eq!(transaction_balances_set.post_balances.len(), 3);
  4156. assert!(commit_results[0].was_executed_successfully());
  4157. assert_eq!(
  4158. transaction_balances_set.pre_balances[0],
  4159. vec![908_000, 911_000, 1]
  4160. );
  4161. assert_eq!(
  4162. transaction_balances_set.post_balances[0],
  4163. vec![901_000, 913_000, 1]
  4164. );
  4165. // Failed transactions still produce balance sets
  4166. // This is a TransactionError - not possible to charge fees
  4167. assert_matches!(commit_results[1], Err(TransactionError::AccountNotFound));
  4168. assert_eq!(transaction_balances_set.pre_balances[1], vec![0, 0, 1]);
  4169. assert_eq!(transaction_balances_set.post_balances[1], vec![0, 0, 1]);
  4170. // Failed transactions still produce balance sets
  4171. // This is an InstructionError - fees charged
  4172. assert_eq!(
  4173. commit_results[2].as_ref().unwrap().status,
  4174. Err(TransactionError::InstructionError(
  4175. 0,
  4176. InstructionError::Custom(1),
  4177. )),
  4178. );
  4179. assert_eq!(
  4180. transaction_balances_set.pre_balances[2],
  4181. vec![909_000, 0, 1]
  4182. );
  4183. assert_eq!(
  4184. transaction_balances_set.post_balances[2],
  4185. vec![904_000, 0, 1]
  4186. );
  4187. }
  4188. #[test]
  4189. fn test_transaction_with_duplicate_accounts_in_instruction() {
  4190. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(500);
  4191. let mock_program_id = Pubkey::from([2u8; 32]);
  4192. let (bank, _bank_forks) =
  4193. Bank::new_with_mockup_builtin_for_tests(&genesis_config, mock_program_id, MockBuiltin::vm);
  4194. declare_process_instruction!(MockBuiltin, 1, |invoke_context| {
  4195. let transaction_context = &invoke_context.transaction_context;
  4196. let instruction_context = transaction_context.get_current_instruction_context()?;
  4197. let instruction_data = instruction_context.get_instruction_data();
  4198. let lamports = u64::from_le_bytes(instruction_data.try_into().unwrap());
  4199. instruction_context
  4200. .try_borrow_instruction_account(2)?
  4201. .checked_sub_lamports(lamports)?;
  4202. instruction_context
  4203. .try_borrow_instruction_account(1)?
  4204. .checked_add_lamports(lamports)?;
  4205. instruction_context
  4206. .try_borrow_instruction_account(0)?
  4207. .checked_sub_lamports(lamports)?;
  4208. instruction_context
  4209. .try_borrow_instruction_account(1)?
  4210. .checked_add_lamports(lamports)?;
  4211. Ok(())
  4212. });
  4213. let from_pubkey = solana_pubkey::new_rand();
  4214. let to_pubkey = solana_pubkey::new_rand();
  4215. let dup_pubkey = from_pubkey;
  4216. let from_account = AccountSharedData::new(100 * LAMPORTS_PER_SOL, 1, &mock_program_id);
  4217. let to_account = AccountSharedData::new(0, 1, &mock_program_id);
  4218. bank.store_account(&from_pubkey, &from_account);
  4219. bank.store_account(&to_pubkey, &to_account);
  4220. let account_metas = vec![
  4221. AccountMeta::new(from_pubkey, false),
  4222. AccountMeta::new(to_pubkey, false),
  4223. AccountMeta::new(dup_pubkey, false),
  4224. ];
  4225. let instruction =
  4226. Instruction::new_with_bincode(mock_program_id, &(10 * LAMPORTS_PER_SOL), account_metas);
  4227. let tx = Transaction::new_signed_with_payer(
  4228. &[instruction],
  4229. Some(&mint_keypair.pubkey()),
  4230. &[&mint_keypair],
  4231. bank.last_blockhash(),
  4232. );
  4233. let result = bank.process_transaction(&tx);
  4234. assert_eq!(result, Ok(()));
  4235. assert_eq!(bank.get_balance(&from_pubkey), 80 * LAMPORTS_PER_SOL);
  4236. assert_eq!(bank.get_balance(&to_pubkey), 20 * LAMPORTS_PER_SOL);
  4237. }
  4238. #[test]
  4239. fn test_transaction_with_program_ids_passed_to_programs() {
  4240. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(500);
  4241. let mock_program_id = Pubkey::from([2u8; 32]);
  4242. let (bank, _bank_forks) =
  4243. Bank::new_with_mockup_builtin_for_tests(&genesis_config, mock_program_id, MockBuiltin::vm);
  4244. let from_pubkey = solana_pubkey::new_rand();
  4245. let to_pubkey = solana_pubkey::new_rand();
  4246. let dup_pubkey = from_pubkey;
  4247. let from_account = AccountSharedData::new(100, 1, &mock_program_id);
  4248. let to_account = AccountSharedData::new(0, 1, &mock_program_id);
  4249. bank.store_account(&from_pubkey, &from_account);
  4250. bank.store_account(&to_pubkey, &to_account);
  4251. let account_metas = vec![
  4252. AccountMeta::new(from_pubkey, false),
  4253. AccountMeta::new(to_pubkey, false),
  4254. AccountMeta::new(dup_pubkey, false),
  4255. AccountMeta::new(mock_program_id, false),
  4256. ];
  4257. let instruction = Instruction::new_with_bincode(mock_program_id, &10, account_metas);
  4258. let tx = Transaction::new_signed_with_payer(
  4259. &[instruction],
  4260. Some(&mint_keypair.pubkey()),
  4261. &[&mint_keypair],
  4262. bank.last_blockhash(),
  4263. );
  4264. let result = bank.process_transaction(&tx);
  4265. assert_eq!(result, Ok(()));
  4266. }
  4267. #[test]
  4268. fn test_account_ids_after_program_ids() {
  4269. solana_logger::setup();
  4270. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(500);
  4271. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  4272. let from_pubkey = solana_pubkey::new_rand();
  4273. let to_pubkey = solana_pubkey::new_rand();
  4274. let account_metas = vec![
  4275. AccountMeta::new(from_pubkey, false),
  4276. AccountMeta::new(to_pubkey, false),
  4277. ];
  4278. let instruction = Instruction::new_with_bincode(solana_vote_program::id(), &10, account_metas);
  4279. let mut tx = Transaction::new_signed_with_payer(
  4280. &[instruction],
  4281. Some(&mint_keypair.pubkey()),
  4282. &[&mint_keypair],
  4283. bank.last_blockhash(),
  4284. );
  4285. tx.message.account_keys.push(solana_pubkey::new_rand());
  4286. let slot = bank.slot().saturating_add(1);
  4287. let mut bank = Bank::new_from_parent(bank, &Pubkey::default(), slot);
  4288. bank.add_mockup_builtin(solana_vote_program::id(), MockBuiltin::vm);
  4289. let bank = bank_forks
  4290. .write()
  4291. .unwrap()
  4292. .insert(bank)
  4293. .clone_without_scheduler();
  4294. let result = bank.process_transaction(&tx);
  4295. assert_eq!(result, Ok(()));
  4296. let account = bank.get_account(&solana_vote_program::id()).unwrap();
  4297. info!("account: {account:?}");
  4298. assert!(account.executable());
  4299. }
  4300. #[test]
  4301. fn test_incinerator() {
  4302. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(1_000_000_000_000);
  4303. let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  4304. // Move to the first normal slot so normal rent behaviour applies
  4305. let bank = new_bank_from_parent_with_bank_forks(
  4306. bank_forks.as_ref(),
  4307. bank0,
  4308. &Pubkey::default(),
  4309. genesis_config.epoch_schedule.first_normal_slot,
  4310. );
  4311. let pre_capitalization = bank.capitalization();
  4312. // Burn a non-rent exempt amount
  4313. let burn_amount = bank.get_minimum_balance_for_rent_exemption(0) - 1;
  4314. assert_eq!(bank.get_balance(&incinerator::id()), 0);
  4315. bank.transfer(burn_amount, &mint_keypair, &incinerator::id())
  4316. .unwrap();
  4317. assert_eq!(bank.get_balance(&incinerator::id()), burn_amount);
  4318. bank.freeze();
  4319. assert_eq!(bank.get_balance(&incinerator::id()), 0);
  4320. // Ensure that no rent was collected, and the entire burn amount was removed from bank
  4321. // capitalization
  4322. assert_eq!(bank.capitalization(), pre_capitalization - burn_amount);
  4323. }
  4324. #[test]
  4325. fn test_duplicate_account_key() {
  4326. solana_logger::setup();
  4327. let (genesis_config, mint_keypair) = create_genesis_config(500);
  4328. let (bank, _bank_forks) = Bank::new_with_mockup_builtin_for_tests(
  4329. &genesis_config,
  4330. solana_vote_program::id(),
  4331. MockBuiltin::vm,
  4332. );
  4333. let from_pubkey = solana_pubkey::new_rand();
  4334. let to_pubkey = solana_pubkey::new_rand();
  4335. let account_metas = vec![
  4336. AccountMeta::new(from_pubkey, false),
  4337. AccountMeta::new(to_pubkey, false),
  4338. ];
  4339. let instruction = Instruction::new_with_bincode(solana_vote_program::id(), &10, account_metas);
  4340. let mut tx = Transaction::new_signed_with_payer(
  4341. &[instruction],
  4342. Some(&mint_keypair.pubkey()),
  4343. &[&mint_keypair],
  4344. bank.last_blockhash(),
  4345. );
  4346. tx.message.account_keys.push(from_pubkey);
  4347. let result = bank.process_transaction(&tx);
  4348. assert_eq!(result, Err(TransactionError::AccountLoadedTwice));
  4349. }
  4350. #[test]
  4351. fn test_process_transaction_with_too_many_account_locks() {
  4352. solana_logger::setup();
  4353. let (genesis_config, mint_keypair) = create_genesis_config(500);
  4354. let (bank, _bank_forks) = Bank::new_with_mockup_builtin_for_tests(
  4355. &genesis_config,
  4356. solana_vote_program::id(),
  4357. MockBuiltin::vm,
  4358. );
  4359. let from_pubkey = solana_pubkey::new_rand();
  4360. let to_pubkey = solana_pubkey::new_rand();
  4361. let account_metas = vec![
  4362. AccountMeta::new(from_pubkey, false),
  4363. AccountMeta::new(to_pubkey, false),
  4364. ];
  4365. let instruction = Instruction::new_with_bincode(solana_vote_program::id(), &10, account_metas);
  4366. let mut tx = Transaction::new_signed_with_payer(
  4367. &[instruction],
  4368. Some(&mint_keypair.pubkey()),
  4369. &[&mint_keypair],
  4370. bank.last_blockhash(),
  4371. );
  4372. let transaction_account_lock_limit = bank.get_transaction_account_lock_limit();
  4373. while tx.message.account_keys.len() <= transaction_account_lock_limit {
  4374. tx.message.account_keys.push(solana_pubkey::new_rand());
  4375. }
  4376. let result = bank.process_transaction(&tx);
  4377. assert_eq!(result, Err(TransactionError::TooManyAccountLocks));
  4378. }
  4379. #[test]
  4380. fn test_program_id_as_payer() {
  4381. solana_logger::setup();
  4382. let (genesis_config, mint_keypair) = create_genesis_config(500);
  4383. let mut bank = Bank::new_for_tests(&genesis_config);
  4384. let from_pubkey = solana_pubkey::new_rand();
  4385. let to_pubkey = solana_pubkey::new_rand();
  4386. let account_metas = vec![
  4387. AccountMeta::new(from_pubkey, false),
  4388. AccountMeta::new(to_pubkey, false),
  4389. ];
  4390. bank.add_mockup_builtin(solana_vote_program::id(), MockBuiltin::vm);
  4391. let instruction = Instruction::new_with_bincode(solana_vote_program::id(), &10, account_metas);
  4392. let mut tx = Transaction::new_signed_with_payer(
  4393. &[instruction],
  4394. Some(&mint_keypair.pubkey()),
  4395. &[&mint_keypair],
  4396. bank.last_blockhash(),
  4397. );
  4398. info!(
  4399. "mint: {} account keys: {:?}",
  4400. mint_keypair.pubkey(),
  4401. tx.message.account_keys
  4402. );
  4403. assert_eq!(tx.message.account_keys.len(), 4);
  4404. tx.message.account_keys.clear();
  4405. tx.message.account_keys.push(solana_vote_program::id());
  4406. tx.message.account_keys.push(mint_keypair.pubkey());
  4407. tx.message.account_keys.push(from_pubkey);
  4408. tx.message.account_keys.push(to_pubkey);
  4409. tx.message.instructions[0].program_id_index = 0;
  4410. tx.message.instructions[0].accounts.clear();
  4411. tx.message.instructions[0].accounts.push(2);
  4412. tx.message.instructions[0].accounts.push(3);
  4413. let result = bank.process_transaction(&tx);
  4414. assert_eq!(result, Err(TransactionError::SanitizeFailure));
  4415. }
  4416. #[test]
  4417. fn test_ref_account_key_after_program_id() {
  4418. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(500);
  4419. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  4420. let from_pubkey = solana_pubkey::new_rand();
  4421. let to_pubkey = solana_pubkey::new_rand();
  4422. let account_metas = vec![
  4423. AccountMeta::new(from_pubkey, false),
  4424. AccountMeta::new(to_pubkey, false),
  4425. ];
  4426. let slot = bank.slot().saturating_add(1);
  4427. let mut bank = Bank::new_from_parent(bank, &Pubkey::default(), slot);
  4428. bank.add_mockup_builtin(solana_vote_program::id(), MockBuiltin::vm);
  4429. let bank = bank_forks
  4430. .write()
  4431. .unwrap()
  4432. .insert(bank)
  4433. .clone_without_scheduler();
  4434. let instruction = Instruction::new_with_bincode(solana_vote_program::id(), &10, account_metas);
  4435. let mut tx = Transaction::new_signed_with_payer(
  4436. &[instruction],
  4437. Some(&mint_keypair.pubkey()),
  4438. &[&mint_keypair],
  4439. bank.last_blockhash(),
  4440. );
  4441. tx.message.account_keys.push(solana_pubkey::new_rand());
  4442. assert_eq!(tx.message.account_keys.len(), 5);
  4443. tx.message.instructions[0].accounts.remove(0);
  4444. tx.message.instructions[0].accounts.push(4);
  4445. let result = bank.process_transaction(&tx);
  4446. assert_eq!(result, Ok(()));
  4447. }
  4448. #[test]
  4449. fn test_fuzz_instructions() {
  4450. solana_logger::setup();
  4451. use rand::{thread_rng, Rng};
  4452. let bank = create_simple_test_bank(1_000_000_000);
  4453. let max_programs = 5;
  4454. let program_keys: Vec<_> = (0..max_programs)
  4455. .enumerate()
  4456. .map(|i| {
  4457. let key = solana_pubkey::new_rand();
  4458. let name = format!("program{i:?}");
  4459. bank.transaction_processor.add_builtin(
  4460. &bank,
  4461. key,
  4462. name.as_str(),
  4463. ProgramCacheEntry::new_builtin(0, 0, MockBuiltin::vm),
  4464. );
  4465. (key, name.as_bytes().to_vec())
  4466. })
  4467. .collect();
  4468. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  4469. let max_keys = MAX_STATIC_ACCOUNTS_PER_PACKET;
  4470. let keys: Vec<_> = (0..max_keys)
  4471. .enumerate()
  4472. .map(|_| {
  4473. let key = solana_pubkey::new_rand();
  4474. let balance = if thread_rng().gen_ratio(9, 10) {
  4475. let lamports = if thread_rng().gen_ratio(1, 5) {
  4476. thread_rng().gen_range(0..10)
  4477. } else {
  4478. thread_rng().gen_range(20..100)
  4479. };
  4480. let space = thread_rng().gen_range(0..10);
  4481. let owner = Pubkey::default();
  4482. let account = AccountSharedData::new(lamports, space, &owner);
  4483. bank.store_account(&key, &account);
  4484. lamports
  4485. } else {
  4486. 0
  4487. };
  4488. (key, balance)
  4489. })
  4490. .collect();
  4491. let mut results = HashMap::new();
  4492. for _ in 0..2_000 {
  4493. let num_keys = if thread_rng().gen_ratio(1, 5) {
  4494. thread_rng().gen_range(0..max_keys)
  4495. } else {
  4496. thread_rng().gen_range(1..4)
  4497. };
  4498. let num_instructions = thread_rng().gen_range(0..max_keys - num_keys);
  4499. let mut account_keys: Vec<_> = if thread_rng().gen_ratio(1, 5) {
  4500. (0..num_keys)
  4501. .map(|_| {
  4502. let idx = thread_rng().gen_range(0..keys.len());
  4503. keys[idx].0
  4504. })
  4505. .collect()
  4506. } else {
  4507. let mut inserted = HashSet::new();
  4508. (0..num_keys)
  4509. .map(|_| {
  4510. let mut idx;
  4511. loop {
  4512. idx = thread_rng().gen_range(0..keys.len());
  4513. if !inserted.contains(&idx) {
  4514. break;
  4515. }
  4516. }
  4517. inserted.insert(idx);
  4518. keys[idx].0
  4519. })
  4520. .collect()
  4521. };
  4522. let instructions: Vec<_> = if num_keys > 0 {
  4523. (0..num_instructions)
  4524. .map(|_| {
  4525. let num_accounts_to_pass = thread_rng().gen_range(0..num_keys);
  4526. let account_indexes = (0..num_accounts_to_pass)
  4527. .map(|_| thread_rng().gen_range(0..num_keys))
  4528. .collect();
  4529. let program_index: u8 = thread_rng().gen_range(0..num_keys);
  4530. if thread_rng().gen_ratio(4, 5) {
  4531. let programs_index = thread_rng().gen_range(0..program_keys.len());
  4532. account_keys[program_index as usize] = program_keys[programs_index].0;
  4533. }
  4534. CompiledInstruction::new(program_index, &10, account_indexes)
  4535. })
  4536. .collect()
  4537. } else {
  4538. vec![]
  4539. };
  4540. let account_keys_len = std::cmp::max(account_keys.len(), 2);
  4541. let num_signatures = if thread_rng().gen_ratio(1, 5) {
  4542. thread_rng().gen_range(0..account_keys_len + 10)
  4543. } else {
  4544. thread_rng().gen_range(1..account_keys_len)
  4545. };
  4546. let num_required_signatures = if thread_rng().gen_ratio(1, 5) {
  4547. thread_rng().gen_range(0..account_keys_len + 10) as u8
  4548. } else {
  4549. thread_rng().gen_range(1..std::cmp::max(2, num_signatures)) as u8
  4550. };
  4551. let num_readonly_signed_accounts = if thread_rng().gen_ratio(1, 5) {
  4552. thread_rng().gen_range(0..account_keys_len) as u8
  4553. } else {
  4554. let max = if num_required_signatures > 1 {
  4555. num_required_signatures - 1
  4556. } else {
  4557. 1
  4558. };
  4559. thread_rng().gen_range(0..max)
  4560. };
  4561. let num_readonly_unsigned_accounts = if thread_rng().gen_ratio(1, 5)
  4562. || (num_required_signatures as usize) >= account_keys_len
  4563. {
  4564. thread_rng().gen_range(0..account_keys_len) as u8
  4565. } else {
  4566. thread_rng().gen_range(0..account_keys_len - num_required_signatures as usize) as u8
  4567. };
  4568. let header = MessageHeader {
  4569. num_required_signatures,
  4570. num_readonly_signed_accounts,
  4571. num_readonly_unsigned_accounts,
  4572. };
  4573. let message = Message {
  4574. header,
  4575. account_keys,
  4576. recent_blockhash: bank.last_blockhash(),
  4577. instructions,
  4578. };
  4579. let tx = Transaction {
  4580. signatures: vec![Signature::default(); num_signatures],
  4581. message,
  4582. };
  4583. let result = bank.process_transaction(&tx);
  4584. for (key, balance) in &keys {
  4585. assert_eq!(bank.get_balance(key), *balance);
  4586. }
  4587. for (key, name) in &program_keys {
  4588. let account = bank.get_account(key).unwrap();
  4589. assert!(account.executable());
  4590. assert_eq!(account.data(), name);
  4591. }
  4592. info!("result: {result:?}");
  4593. let result_key = format!("{result:?}");
  4594. *results.entry(result_key).or_insert(0) += 1;
  4595. }
  4596. info!("results: {results:?}");
  4597. }
  4598. // DEVELOPERS: This test is intended to ensure that the bank hash remains
  4599. // consistent across all changes, including feature set changes. If you add a
  4600. // new feature that affects the bank hash, you should update this test to use a
  4601. // test matrix that tests the bank hash calculation with and without your
  4602. // added feature.
  4603. #[test]
  4604. fn test_bank_hash_consistency() {
  4605. let account = AccountSharedData::new(1_000_000_000_000, 0, &system_program::id());
  4606. let mut genesis_config = GenesisConfig::new(&[(Pubkey::from([42; 32]), account)], &[]);
  4607. // Override the creation time to ensure bank hash consistency
  4608. genesis_config.creation_time = 0;
  4609. genesis_config.cluster_type = ClusterType::MainnetBeta;
  4610. // Set the feature set to all enabled so that we detect any inconsistencies
  4611. // in the hash computation that may arise from feature set changes
  4612. let feature_set = FeatureSet::all_enabled();
  4613. let mut bank = Arc::new(Bank::new_with_paths(
  4614. &genesis_config,
  4615. Arc::new(RuntimeConfig::default()),
  4616. vec![],
  4617. None,
  4618. None,
  4619. false,
  4620. Some(BankTestConfig::default().accounts_db_config),
  4621. None,
  4622. Some(Pubkey::from([42; 32])),
  4623. Arc::default(),
  4624. None,
  4625. Some(feature_set),
  4626. ));
  4627. loop {
  4628. goto_end_of_slot(Arc::clone(&bank));
  4629. if bank.slot == 0 {
  4630. assert_eq!(bank.epoch(), 0);
  4631. assert_eq!(
  4632. bank.hash().to_string(),
  4633. "EzyLJJki4ALhQAq5wbmiNctDhytQckGJRXnk9APKXv7r",
  4634. );
  4635. }
  4636. if bank.slot == 32 {
  4637. assert_eq!(bank.epoch(), 1);
  4638. assert_eq!(
  4639. bank.hash().to_string(),
  4640. "6h1KzSuTW6MwkgjtEbrv6AyUZ2NHtSxCQi8epjHDFYh8"
  4641. );
  4642. }
  4643. if bank.slot == 128 {
  4644. assert_eq!(bank.epoch(), 2);
  4645. assert_eq!(
  4646. bank.hash().to_string(),
  4647. "4GX3883TVK7SQfbPUHem4HXcqdHU2DZVAB6yEXspn2qe"
  4648. );
  4649. break;
  4650. }
  4651. bank = Arc::new(new_from_parent(bank));
  4652. }
  4653. }
  4654. #[ignore]
  4655. #[test]
  4656. fn test_same_program_id_uses_unique_executable_accounts() {
  4657. declare_process_instruction!(MockBuiltin, 1, |invoke_context| {
  4658. let transaction_context = &invoke_context.transaction_context;
  4659. let instruction_context = transaction_context.get_current_instruction_context()?;
  4660. let program_idx = instruction_context.get_index_of_program_account_in_transaction()?;
  4661. let mut acc = transaction_context.accounts().try_borrow_mut(program_idx)?;
  4662. acc.set_data(vec![1, 2]);
  4663. Ok(())
  4664. });
  4665. let (genesis_config, mint_keypair) = create_genesis_config(50000);
  4666. let program1_pubkey = solana_pubkey::new_rand();
  4667. let (bank, _bank_forks) =
  4668. Bank::new_with_mockup_builtin_for_tests(&genesis_config, program1_pubkey, MockBuiltin::vm);
  4669. // Add a new program owned by the first
  4670. let program2_pubkey = solana_pubkey::new_rand();
  4671. let mut program2_account = AccountSharedData::new(1, 1, &program1_pubkey);
  4672. program2_account.set_executable(true);
  4673. bank.store_account(&program2_pubkey, &program2_account);
  4674. let instruction = Instruction::new_with_bincode(program2_pubkey, &10, vec![]);
  4675. let tx = Transaction::new_signed_with_payer(
  4676. &[instruction.clone(), instruction],
  4677. Some(&mint_keypair.pubkey()),
  4678. &[&mint_keypair],
  4679. bank.last_blockhash(),
  4680. );
  4681. assert!(bank.process_transaction(&tx).is_ok());
  4682. assert_eq!(6, bank.get_account(&program1_pubkey).unwrap().data().len());
  4683. assert_eq!(1, bank.get_account(&program2_pubkey).unwrap().data().len());
  4684. }
  4685. fn get_shrink_account_size() -> usize {
  4686. let (genesis_config, _mint_keypair) = create_genesis_config(1_000_000_000);
  4687. // Set root for bank 0, with caching disabled so we can get the size
  4688. // of the storage for this slot
  4689. let bank0 = Arc::new(Bank::new_with_config_for_tests(
  4690. &genesis_config,
  4691. BankTestConfig::default(),
  4692. ));
  4693. goto_end_of_slot(bank0.clone());
  4694. bank0.freeze();
  4695. bank0.squash();
  4696. add_root_and_flush_write_cache(&bank0);
  4697. let sizes = bank0
  4698. .rc
  4699. .accounts
  4700. .accounts_db
  4701. .sizes_of_accounts_in_storage_for_tests(0);
  4702. // Create an account such that it takes DEFAULT_ACCOUNTS_SHRINK_RATIO of the total account space for
  4703. // the slot, so when it gets pruned, the storage entry will become a shrink candidate.
  4704. let bank0_total_size: usize = sizes.into_iter().sum();
  4705. let pubkey0_size = (bank0_total_size as f64 / (1.0 - DEFAULT_ACCOUNTS_SHRINK_RATIO)).ceil();
  4706. assert!(
  4707. pubkey0_size / (pubkey0_size + bank0_total_size as f64) > DEFAULT_ACCOUNTS_SHRINK_RATIO
  4708. );
  4709. pubkey0_size as usize
  4710. }
  4711. #[test]
  4712. fn test_clean_nonrooted() {
  4713. solana_logger::setup();
  4714. let (genesis_config, _mint_keypair) = create_genesis_config(1_000_000_000);
  4715. let pubkey0 = Pubkey::from([0; 32]);
  4716. let pubkey1 = Pubkey::from([1; 32]);
  4717. info!("pubkey0: {pubkey0}");
  4718. info!("pubkey1: {pubkey1}");
  4719. // Set root for bank 0, with caching enabled
  4720. let bank0 = Arc::new(Bank::new_with_config_for_tests(
  4721. &genesis_config,
  4722. BankTestConfig::default(),
  4723. ));
  4724. let account_zero = AccountSharedData::new(0, 0, &Pubkey::new_unique());
  4725. goto_end_of_slot(bank0.clone());
  4726. bank0.freeze();
  4727. bank0.squash();
  4728. // Flush now so that accounts cache cleaning doesn't clean up bank 0 when later
  4729. // slots add updates to the cache
  4730. bank0.force_flush_accounts_cache();
  4731. // Store some lamports in bank 1
  4732. let some_lamports = 123;
  4733. let bank1 = Arc::new(Bank::new_from_parent(bank0.clone(), &Pubkey::default(), 1));
  4734. test_utils::deposit(&bank1, &pubkey0, some_lamports).unwrap();
  4735. goto_end_of_slot(bank1.clone());
  4736. bank1.freeze();
  4737. bank1.flush_accounts_cache_slot_for_tests();
  4738. bank1.print_accounts_stats();
  4739. // Store some lamports for pubkey1 in bank 2, root bank 2
  4740. // bank2's parent is bank0
  4741. let bank2 = Arc::new(Bank::new_from_parent(bank0, &Pubkey::default(), 2));
  4742. test_utils::deposit(&bank2, &pubkey1, some_lamports).unwrap();
  4743. bank2.store_account(&pubkey0, &account_zero);
  4744. goto_end_of_slot(bank2.clone());
  4745. bank2.freeze();
  4746. bank2.squash();
  4747. bank2.force_flush_accounts_cache();
  4748. bank2.print_accounts_stats();
  4749. drop(bank1);
  4750. // Clean accounts, which should add earlier slots to the shrink
  4751. // candidate set
  4752. bank2.clean_accounts_for_tests();
  4753. let bank3 = Arc::new(Bank::new_from_parent(bank2, &Pubkey::default(), 3));
  4754. test_utils::deposit(&bank3, &pubkey1, some_lamports + 1).unwrap();
  4755. goto_end_of_slot(bank3.clone());
  4756. bank3.freeze();
  4757. bank3.squash();
  4758. bank3.force_flush_accounts_cache();
  4759. bank3.clean_accounts_for_tests();
  4760. assert_eq!(
  4761. bank3.rc.accounts.accounts_db.ref_count_for_pubkey(&pubkey0),
  4762. 2
  4763. );
  4764. assert!(bank3
  4765. .rc
  4766. .accounts
  4767. .accounts_db
  4768. .storage
  4769. .get_slot_storage_entry(1)
  4770. .is_none());
  4771. bank3.print_accounts_stats();
  4772. }
  4773. #[test]
  4774. fn test_shrink_candidate_slots_cached() {
  4775. solana_logger::setup();
  4776. let (genesis_config, _mint_keypair) = create_genesis_config(1_000_000_000);
  4777. let pubkey0 = solana_pubkey::new_rand();
  4778. let pubkey1 = solana_pubkey::new_rand();
  4779. let pubkey2 = solana_pubkey::new_rand();
  4780. // Set root for bank 0, with caching enabled
  4781. let bank0 = Arc::new(Bank::new_with_config_for_tests(
  4782. &genesis_config,
  4783. BankTestConfig::default(),
  4784. ));
  4785. let pubkey0_size = get_shrink_account_size();
  4786. let account0 = AccountSharedData::new(1000, pubkey0_size, &Pubkey::new_unique());
  4787. bank0.store_account(&pubkey0, &account0);
  4788. goto_end_of_slot(bank0.clone());
  4789. bank0.freeze();
  4790. bank0.squash();
  4791. // Flush now so that accounts cache cleaning doesn't clean up bank 0 when later
  4792. // slots add updates to the cache
  4793. bank0.force_flush_accounts_cache();
  4794. // Store some lamports in bank 1
  4795. let some_lamports = 123;
  4796. let bank1 = Arc::new(new_from_parent(bank0));
  4797. test_utils::deposit(&bank1, &pubkey1, some_lamports).unwrap();
  4798. test_utils::deposit(&bank1, &pubkey2, some_lamports).unwrap();
  4799. goto_end_of_slot(bank1.clone());
  4800. bank1.freeze();
  4801. bank1.squash();
  4802. // Flush now so that accounts cache cleaning doesn't clean up bank 0 when later
  4803. // slots add updates to the cache
  4804. bank1.force_flush_accounts_cache();
  4805. // Store some lamports for pubkey1 in bank 2, root bank 2
  4806. let bank2 = Arc::new(new_from_parent(bank1));
  4807. test_utils::deposit(&bank2, &pubkey1, some_lamports).unwrap();
  4808. bank2.store_account(&pubkey0, &account0);
  4809. goto_end_of_slot(bank2.clone());
  4810. bank2.freeze();
  4811. bank2.squash();
  4812. bank2.force_flush_accounts_cache();
  4813. // Clean accounts, which should add earlier slots to the shrink
  4814. // candidate set
  4815. bank2.clean_accounts_for_tests();
  4816. // Slots 0 and 1 should be candidates for shrinking, but slot 2
  4817. // shouldn't because none of its accounts are outdated by a later
  4818. // root
  4819. assert_eq!(bank2.shrink_candidate_slots(), 2);
  4820. let alive_counts: Vec<usize> = (0..3)
  4821. .map(|slot| {
  4822. bank2
  4823. .rc
  4824. .accounts
  4825. .accounts_db
  4826. .alive_account_count_in_slot(slot)
  4827. })
  4828. .collect();
  4829. // No more slots should be shrunk
  4830. assert_eq!(bank2.shrink_candidate_slots(), 0);
  4831. // alive_counts represents the count of alive accounts in the three slots 0,1,2
  4832. assert_eq!(alive_counts, vec![12, 1, 6]);
  4833. }
  4834. #[test]
  4835. fn test_add_builtin_no_overwrite() {
  4836. let slot = 123;
  4837. let program_id = solana_pubkey::new_rand();
  4838. let (parent_bank, _bank_forks) = create_simple_test_arc_bank(100_000);
  4839. let mut bank = Arc::new(Bank::new_from_parent(parent_bank, &Pubkey::default(), slot));
  4840. assert_eq!(bank.get_account_modified_slot(&program_id), None);
  4841. Arc::get_mut(&mut bank)
  4842. .unwrap()
  4843. .add_mockup_builtin(program_id, MockBuiltin::vm);
  4844. assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
  4845. let mut bank = Arc::new(new_from_parent(bank));
  4846. Arc::get_mut(&mut bank)
  4847. .unwrap()
  4848. .add_mockup_builtin(program_id, MockBuiltin::vm);
  4849. assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
  4850. }
  4851. #[test]
  4852. fn test_add_builtin_loader_no_overwrite() {
  4853. let slot = 123;
  4854. let loader_id = solana_pubkey::new_rand();
  4855. let (parent_bank, _bank_forks) = create_simple_test_arc_bank(100_000);
  4856. let mut bank = Arc::new(Bank::new_from_parent(parent_bank, &Pubkey::default(), slot));
  4857. assert_eq!(bank.get_account_modified_slot(&loader_id), None);
  4858. Arc::get_mut(&mut bank)
  4859. .unwrap()
  4860. .add_mockup_builtin(loader_id, MockBuiltin::vm);
  4861. assert_eq!(bank.get_account_modified_slot(&loader_id).unwrap().1, slot);
  4862. let mut bank = Arc::new(new_from_parent(bank));
  4863. Arc::get_mut(&mut bank)
  4864. .unwrap()
  4865. .add_mockup_builtin(loader_id, MockBuiltin::vm);
  4866. assert_eq!(bank.get_account_modified_slot(&loader_id).unwrap().1, slot);
  4867. }
  4868. #[test]
  4869. fn test_add_builtin_account() {
  4870. for pass in 0..5 {
  4871. let (mut genesis_config, _mint_keypair) = create_genesis_config(100_000);
  4872. activate_all_features(&mut genesis_config);
  4873. let slot = 123;
  4874. // The account at program_id will be created initially with just 1 lamport.
  4875. let program_id = Pubkey::new_from_array([0xFF; 32]);
  4876. let bank = Arc::new(Bank::new_from_parent(
  4877. Arc::new(Bank::new_for_tests(&genesis_config)),
  4878. &Pubkey::default(),
  4879. slot,
  4880. ));
  4881. add_root_and_flush_write_cache(&bank.parent().unwrap());
  4882. assert_eq!(bank.get_account_modified_slot(&program_id), None);
  4883. assert_capitalization_diff(
  4884. &bank,
  4885. || bank.add_builtin_account("mock_program", &program_id),
  4886. |old, new| {
  4887. assert_eq!(old + 1, new);
  4888. pass == 0
  4889. },
  4890. );
  4891. if pass == 0 {
  4892. continue;
  4893. }
  4894. assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
  4895. let bank = Arc::new(new_from_parent(bank));
  4896. add_root_and_flush_write_cache(&bank.parent().unwrap());
  4897. assert_capitalization_diff(
  4898. &bank,
  4899. || bank.add_builtin_account("mock_program", &program_id),
  4900. |old, new| {
  4901. assert_eq!(old, new);
  4902. pass == 1
  4903. },
  4904. );
  4905. if pass == 1 {
  4906. continue;
  4907. }
  4908. assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
  4909. let bank = Arc::new(new_from_parent(bank));
  4910. add_root_and_flush_write_cache(&bank.parent().unwrap());
  4911. // No builtin replacement should happen if the program id is already assigned to a
  4912. // builtin.
  4913. assert_capitalization_diff(
  4914. &bank,
  4915. || bank.add_builtin_account("mock_program v2", &program_id),
  4916. |old, new| {
  4917. assert_eq!(old, new);
  4918. pass == 2
  4919. },
  4920. );
  4921. if pass == 2 {
  4922. continue;
  4923. }
  4924. // No replacement should have happened
  4925. assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
  4926. }
  4927. }
  4928. /// useful to adapt tests written prior to introduction of the write cache
  4929. /// to use the write cache
  4930. fn add_root_and_flush_write_cache(bank: &Bank) {
  4931. bank.rc.accounts.add_root(bank.slot());
  4932. bank.flush_accounts_cache_slot_for_tests()
  4933. }
  4934. #[test]
  4935. fn test_add_builtin_account_inherited_cap_while_replacing() {
  4936. for pass in 0..4 {
  4937. let (genesis_config, mint_keypair) = create_genesis_config(100_000);
  4938. let bank = Bank::new_for_tests(&genesis_config);
  4939. let program_id = solana_pubkey::new_rand();
  4940. bank.add_builtin_account("mock_program", &program_id);
  4941. if pass == 0 {
  4942. add_root_and_flush_write_cache(&bank);
  4943. assert_eq!(
  4944. bank.capitalization(),
  4945. bank.calculate_capitalization_for_tests()
  4946. );
  4947. continue;
  4948. }
  4949. // someone mess with program_id's balance
  4950. bank.withdraw(&mint_keypair.pubkey(), 10).unwrap();
  4951. if pass == 1 {
  4952. add_root_and_flush_write_cache(&bank);
  4953. assert_ne!(
  4954. bank.capitalization(),
  4955. bank.calculate_capitalization_for_tests()
  4956. );
  4957. continue;
  4958. }
  4959. test_utils::deposit(&bank, &program_id, 10).unwrap();
  4960. if pass == 2 {
  4961. add_root_and_flush_write_cache(&bank);
  4962. assert_eq!(
  4963. bank.capitalization(),
  4964. bank.calculate_capitalization_for_tests()
  4965. );
  4966. continue;
  4967. }
  4968. bank.add_builtin_account("mock_program v2", &program_id);
  4969. add_root_and_flush_write_cache(&bank);
  4970. assert_eq!(
  4971. bank.capitalization(),
  4972. bank.calculate_capitalization_for_tests()
  4973. );
  4974. }
  4975. }
  4976. #[test]
  4977. fn test_add_builtin_account_squatted_while_not_replacing() {
  4978. for pass in 0..3 {
  4979. let (genesis_config, mint_keypair) = create_genesis_config(100_000);
  4980. let bank = Bank::new_for_tests(&genesis_config);
  4981. let program_id = solana_pubkey::new_rand();
  4982. // someone managed to squat at program_id!
  4983. bank.withdraw(&mint_keypair.pubkey(), 10).unwrap();
  4984. if pass == 0 {
  4985. add_root_and_flush_write_cache(&bank);
  4986. assert_ne!(
  4987. bank.capitalization(),
  4988. bank.calculate_capitalization_for_tests()
  4989. );
  4990. continue;
  4991. }
  4992. test_utils::deposit(&bank, &program_id, 10).unwrap();
  4993. if pass == 1 {
  4994. add_root_and_flush_write_cache(&bank);
  4995. assert_eq!(
  4996. bank.capitalization(),
  4997. bank.calculate_capitalization_for_tests()
  4998. );
  4999. continue;
  5000. }
  5001. bank.add_builtin_account("mock_program", &program_id);
  5002. add_root_and_flush_write_cache(&bank);
  5003. assert_eq!(
  5004. bank.capitalization(),
  5005. bank.calculate_capitalization_for_tests()
  5006. );
  5007. }
  5008. }
  5009. #[test]
  5010. #[should_panic(
  5011. expected = "Can't change frozen bank by adding not-existing new builtin program \
  5012. (mock_program, CiXgo2KHKSDmDnV1F6B69eWFgNAPiSBjjYvfB4cvRNre). Maybe, inconsistent \
  5013. program activation is detected on snapshot restore?"
  5014. )]
  5015. fn test_add_builtin_account_after_frozen() {
  5016. let slot = 123;
  5017. let program_id = Pubkey::from_str("CiXgo2KHKSDmDnV1F6B69eWFgNAPiSBjjYvfB4cvRNre").unwrap();
  5018. let (parent_bank, _bank_forks) = create_simple_test_arc_bank(100_000);
  5019. let bank = Bank::new_from_parent(parent_bank, &Pubkey::default(), slot);
  5020. bank.freeze();
  5021. bank.add_builtin_account("mock_program", &program_id);
  5022. }
  5023. #[test]
  5024. fn test_add_precompiled_account() {
  5025. for pass in 0..2 {
  5026. let (mut genesis_config, _mint_keypair) = create_genesis_config(100_000);
  5027. activate_all_features(&mut genesis_config);
  5028. let slot = 123;
  5029. let program_id = solana_pubkey::new_rand();
  5030. let bank = Arc::new(Bank::new_from_parent(
  5031. Arc::new(Bank::new_for_tests(&genesis_config)),
  5032. &Pubkey::default(),
  5033. slot,
  5034. ));
  5035. add_root_and_flush_write_cache(&bank.parent().unwrap());
  5036. assert_eq!(bank.get_account_modified_slot(&program_id), None);
  5037. assert_capitalization_diff(
  5038. &bank,
  5039. || bank.add_precompiled_account(&program_id),
  5040. |old, new| {
  5041. assert_eq!(old + 1, new);
  5042. pass == 0
  5043. },
  5044. );
  5045. if pass == 0 {
  5046. continue;
  5047. }
  5048. assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
  5049. let bank = Arc::new(new_from_parent(bank));
  5050. add_root_and_flush_write_cache(&bank.parent().unwrap());
  5051. assert_capitalization_diff(
  5052. &bank,
  5053. || bank.add_precompiled_account(&program_id),
  5054. |old, new| {
  5055. assert_eq!(old, new);
  5056. true
  5057. },
  5058. );
  5059. assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
  5060. }
  5061. }
  5062. #[test]
  5063. fn test_add_precompiled_account_inherited_cap_while_replacing() {
  5064. // when we flush the cache, it has side effects, so we have to restart the test each time we flush the cache
  5065. // and then want to continue modifying the bank
  5066. for pass in 0..4 {
  5067. let (genesis_config, mint_keypair) = create_genesis_config(100_000);
  5068. let bank = Bank::new_for_tests(&genesis_config);
  5069. let program_id = solana_pubkey::new_rand();
  5070. bank.add_precompiled_account(&program_id);
  5071. if pass == 0 {
  5072. add_root_and_flush_write_cache(&bank);
  5073. assert_eq!(
  5074. bank.capitalization(),
  5075. bank.calculate_capitalization_for_tests()
  5076. );
  5077. continue;
  5078. }
  5079. // someone mess with program_id's balance
  5080. bank.withdraw(&mint_keypair.pubkey(), 10).unwrap();
  5081. if pass == 1 {
  5082. add_root_and_flush_write_cache(&bank);
  5083. assert_ne!(
  5084. bank.capitalization(),
  5085. bank.calculate_capitalization_for_tests()
  5086. );
  5087. continue;
  5088. }
  5089. test_utils::deposit(&bank, &program_id, 10).unwrap();
  5090. if pass == 2 {
  5091. add_root_and_flush_write_cache(&bank);
  5092. assert_eq!(
  5093. bank.capitalization(),
  5094. bank.calculate_capitalization_for_tests()
  5095. );
  5096. continue;
  5097. }
  5098. bank.add_precompiled_account(&program_id);
  5099. add_root_and_flush_write_cache(&bank);
  5100. assert_eq!(
  5101. bank.capitalization(),
  5102. bank.calculate_capitalization_for_tests()
  5103. );
  5104. }
  5105. }
  5106. #[test]
  5107. fn test_add_precompiled_account_squatted_while_not_replacing() {
  5108. for pass in 0..3 {
  5109. let (genesis_config, mint_keypair) = create_genesis_config(100_000);
  5110. let bank = Bank::new_for_tests(&genesis_config);
  5111. let program_id = solana_pubkey::new_rand();
  5112. // someone managed to squat at program_id!
  5113. bank.withdraw(&mint_keypair.pubkey(), 10).unwrap();
  5114. if pass == 0 {
  5115. add_root_and_flush_write_cache(&bank);
  5116. assert_ne!(
  5117. bank.capitalization(),
  5118. bank.calculate_capitalization_for_tests()
  5119. );
  5120. continue;
  5121. }
  5122. test_utils::deposit(&bank, &program_id, 10).unwrap();
  5123. if pass == 1 {
  5124. add_root_and_flush_write_cache(&bank);
  5125. assert_eq!(
  5126. bank.capitalization(),
  5127. bank.calculate_capitalization_for_tests()
  5128. );
  5129. continue;
  5130. }
  5131. bank.add_precompiled_account(&program_id);
  5132. add_root_and_flush_write_cache(&bank);
  5133. assert_eq!(
  5134. bank.capitalization(),
  5135. bank.calculate_capitalization_for_tests()
  5136. );
  5137. }
  5138. }
  5139. #[test]
  5140. #[should_panic(
  5141. expected = "Can't change frozen bank by adding not-existing new precompiled program \
  5142. (CiXgo2KHKSDmDnV1F6B69eWFgNAPiSBjjYvfB4cvRNre). Maybe, inconsistent program \
  5143. activation is detected on snapshot restore?"
  5144. )]
  5145. fn test_add_precompiled_account_after_frozen() {
  5146. let slot = 123;
  5147. let program_id = Pubkey::from_str("CiXgo2KHKSDmDnV1F6B69eWFgNAPiSBjjYvfB4cvRNre").unwrap();
  5148. let (parent_bank, _bank_forks) = create_simple_test_arc_bank(100_000);
  5149. let bank = Bank::new_from_parent(parent_bank, &Pubkey::default(), slot);
  5150. bank.freeze();
  5151. bank.add_precompiled_account(&program_id);
  5152. }
  5153. #[test]
  5154. fn test_reconfigure_token2_native_mint() {
  5155. solana_logger::setup();
  5156. let genesis_config =
  5157. create_genesis_config_with_leader(5, &solana_pubkey::new_rand(), 0).genesis_config;
  5158. let bank = Arc::new(Bank::new_for_tests(&genesis_config));
  5159. assert_eq!(bank.get_balance(&token::native_mint::id()), 1000000000);
  5160. let native_mint_account = bank.get_account(&token::native_mint::id()).unwrap();
  5161. assert_eq!(native_mint_account.data().len(), 82);
  5162. assert_eq!(native_mint_account.owner(), &token::id());
  5163. }
  5164. #[test]
  5165. fn test_bank_load_program() {
  5166. solana_logger::setup();
  5167. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(1_000_000_000);
  5168. let bank = Bank::new_for_tests(&genesis_config);
  5169. let (bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
  5170. goto_end_of_slot(bank.clone());
  5171. let bank = new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), 42);
  5172. let bank = new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), 50);
  5173. let program_key = solana_pubkey::new_rand();
  5174. let programdata_key = solana_pubkey::new_rand();
  5175. let mut file = File::open("../programs/bpf_loader/test_elfs/out/noop_aligned.so").unwrap();
  5176. let mut elf = Vec::new();
  5177. file.read_to_end(&mut elf).unwrap();
  5178. let mut program_account = AccountSharedData::new_data(
  5179. 40,
  5180. &UpgradeableLoaderState::Program {
  5181. programdata_address: programdata_key,
  5182. },
  5183. &bpf_loader_upgradeable::id(),
  5184. )
  5185. .unwrap();
  5186. program_account.set_executable(true);
  5187. program_account.set_rent_epoch(1);
  5188. let programdata_data_offset = UpgradeableLoaderState::size_of_programdata_metadata();
  5189. let mut programdata_account = AccountSharedData::new(
  5190. 40,
  5191. programdata_data_offset + elf.len(),
  5192. &bpf_loader_upgradeable::id(),
  5193. );
  5194. programdata_account
  5195. .set_state(&UpgradeableLoaderState::ProgramData {
  5196. slot: 42,
  5197. upgrade_authority_address: None,
  5198. })
  5199. .unwrap();
  5200. programdata_account.data_as_mut_slice()[programdata_data_offset..].copy_from_slice(&elf);
  5201. programdata_account.set_rent_epoch(1);
  5202. bank.store_account_and_update_capitalization(&program_key, &program_account);
  5203. bank.store_account_and_update_capitalization(&programdata_key, &programdata_account);
  5204. let instruction = Instruction::new_with_bytes(program_key, &[], Vec::new());
  5205. let invocation_message = Message::new(&[instruction], Some(&mint_keypair.pubkey()));
  5206. let binding = mint_keypair.insecure_clone();
  5207. let transaction = Transaction::new(
  5208. &[&binding],
  5209. invocation_message.clone(),
  5210. bank.last_blockhash(),
  5211. );
  5212. assert!(bank.process_transaction(&transaction).is_ok());
  5213. {
  5214. let program_cache = bank
  5215. .transaction_processor
  5216. .global_program_cache
  5217. .read()
  5218. .unwrap();
  5219. let [program] = program_cache.get_slot_versions_for_tests(&program_key) else {
  5220. panic!();
  5221. };
  5222. assert_matches!(program.program, ProgramCacheEntryType::Loaded(_));
  5223. assert_eq!(
  5224. program.account_size,
  5225. program_account.data().len() + programdata_account.data().len()
  5226. );
  5227. }
  5228. }
  5229. #[allow(deprecated)]
  5230. #[test_case(false; "informal_loaded_size")]
  5231. #[test_case(true; "simd186_loaded_size")]
  5232. fn test_bpf_loader_upgradeable_deploy_with_max_len(formalize_loaded_transaction_data_size: bool) {
  5233. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(1_000_000_000);
  5234. let mut bank = Bank::new_for_tests(&genesis_config);
  5235. bank.feature_set = Arc::new(FeatureSet::all_enabled());
  5236. if !formalize_loaded_transaction_data_size {
  5237. bank.deactivate_feature(&feature_set::formalize_loaded_transaction_data_size::id());
  5238. }
  5239. let (bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
  5240. let mut bank_client = BankClient::new_shared(bank.clone());
  5241. // Setup keypairs and addresses
  5242. let payer_keypair = Keypair::new();
  5243. let program_keypair = Keypair::new();
  5244. let buffer_address = Pubkey::new_unique();
  5245. let (programdata_address, _) = Pubkey::find_program_address(
  5246. &[program_keypair.pubkey().as_ref()],
  5247. &bpf_loader_upgradeable::id(),
  5248. );
  5249. let upgrade_authority_keypair = Keypair::new();
  5250. // Test nonexistent program invocation
  5251. let instruction = Instruction::new_with_bytes(program_keypair.pubkey(), &[], Vec::new());
  5252. let invocation_message = Message::new(&[instruction], Some(&mint_keypair.pubkey()));
  5253. let binding = mint_keypair.insecure_clone();
  5254. let transaction = Transaction::new(
  5255. &[&binding],
  5256. invocation_message.clone(),
  5257. bank.last_blockhash(),
  5258. );
  5259. assert_eq!(
  5260. bank.process_transaction(&transaction),
  5261. Err(TransactionError::ProgramAccountNotFound),
  5262. );
  5263. {
  5264. // Make sure it is not in the cache because the account owner is not a loader
  5265. let program_cache = bank
  5266. .transaction_processor
  5267. .global_program_cache
  5268. .read()
  5269. .unwrap();
  5270. let slot_versions = program_cache.get_slot_versions_for_tests(&program_keypair.pubkey());
  5271. assert!(slot_versions.is_empty());
  5272. }
  5273. // Advance bank to get a new last blockhash so that when we retry invocation
  5274. // after creating the program, the new transaction created below with the
  5275. // same `invocation_message` as above doesn't return `AlreadyProcessed` when
  5276. // processed.
  5277. goto_end_of_slot(bank.clone());
  5278. let bank = bank_client
  5279. .advance_slot(1, bank_forks.as_ref(), &mint_keypair.pubkey())
  5280. .unwrap();
  5281. // Load program file
  5282. let mut file = File::open("../programs/bpf_loader/test_elfs/out/noop_aligned.so")
  5283. .expect("file open failed");
  5284. let mut elf = Vec::new();
  5285. file.read_to_end(&mut elf).unwrap();
  5286. // Compute rent exempt balances
  5287. let program_len = elf.len();
  5288. let min_program_balance =
  5289. bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program());
  5290. let min_buffer_balance = bank.get_minimum_balance_for_rent_exemption(
  5291. UpgradeableLoaderState::size_of_buffer(program_len),
  5292. );
  5293. let min_programdata_balance = bank.get_minimum_balance_for_rent_exemption(
  5294. UpgradeableLoaderState::size_of_programdata(program_len),
  5295. );
  5296. // Setup accounts
  5297. let buffer_account = {
  5298. let mut account = AccountSharedData::new(
  5299. min_buffer_balance,
  5300. UpgradeableLoaderState::size_of_buffer(elf.len()),
  5301. &bpf_loader_upgradeable::id(),
  5302. );
  5303. account
  5304. .set_state(&UpgradeableLoaderState::Buffer {
  5305. authority_address: Some(upgrade_authority_keypair.pubkey()),
  5306. })
  5307. .unwrap();
  5308. account
  5309. .data_as_mut_slice()
  5310. .get_mut(UpgradeableLoaderState::size_of_buffer_metadata()..)
  5311. .unwrap()
  5312. .copy_from_slice(&elf);
  5313. account
  5314. };
  5315. let program_account = AccountSharedData::new(
  5316. min_programdata_balance,
  5317. UpgradeableLoaderState::size_of_program(),
  5318. &bpf_loader_upgradeable::id(),
  5319. );
  5320. let programdata_account = AccountSharedData::new(
  5321. 1,
  5322. UpgradeableLoaderState::size_of_programdata(elf.len()),
  5323. &bpf_loader_upgradeable::id(),
  5324. );
  5325. // Test uninitialized program invocation
  5326. bank.store_account(&program_keypair.pubkey(), &program_account);
  5327. let transaction = Transaction::new(
  5328. &[&binding],
  5329. invocation_message.clone(),
  5330. bank.last_blockhash(),
  5331. );
  5332. assert_eq!(
  5333. bank.process_transaction(&transaction),
  5334. Err(TransactionError::InstructionError(
  5335. 0,
  5336. InstructionError::UnsupportedProgramId
  5337. )),
  5338. );
  5339. {
  5340. let program_cache = bank
  5341. .transaction_processor
  5342. .global_program_cache
  5343. .read()
  5344. .unwrap();
  5345. let slot_versions = program_cache.get_slot_versions_for_tests(&program_keypair.pubkey());
  5346. assert_eq!(slot_versions.len(), 1);
  5347. assert_eq!(slot_versions[0].deployment_slot, bank.slot());
  5348. assert_eq!(slot_versions[0].effective_slot, bank.slot());
  5349. assert!(matches!(
  5350. slot_versions[0].program,
  5351. ProgramCacheEntryType::Closed,
  5352. ));
  5353. }
  5354. // Test buffer invocation
  5355. bank.store_account(&buffer_address, &buffer_account);
  5356. let instruction = Instruction::new_with_bytes(buffer_address, &[], Vec::new());
  5357. let message = Message::new(&[instruction], Some(&mint_keypair.pubkey()));
  5358. let transaction = Transaction::new(&[&binding], message, bank.last_blockhash());
  5359. assert_eq!(
  5360. bank.process_transaction(&transaction),
  5361. Err(TransactionError::InstructionError(
  5362. 0,
  5363. InstructionError::UnsupportedProgramId,
  5364. )),
  5365. );
  5366. {
  5367. let program_cache = bank
  5368. .transaction_processor
  5369. .global_program_cache
  5370. .read()
  5371. .unwrap();
  5372. let slot_versions = program_cache.get_slot_versions_for_tests(&buffer_address);
  5373. assert_eq!(slot_versions.len(), 1);
  5374. assert_eq!(slot_versions[0].deployment_slot, bank.slot());
  5375. assert_eq!(slot_versions[0].effective_slot, bank.slot());
  5376. assert!(matches!(
  5377. slot_versions[0].program,
  5378. ProgramCacheEntryType::Closed,
  5379. ));
  5380. }
  5381. // Test successful deploy
  5382. let payer_base_balance = LAMPORTS_PER_SOL;
  5383. let deploy_fees = {
  5384. let fee_calculator = genesis_config.fee_rate_governor.create_fee_calculator();
  5385. 3 * fee_calculator.lamports_per_signature
  5386. };
  5387. let min_payer_balance = min_program_balance
  5388. .saturating_add(min_programdata_balance)
  5389. .saturating_sub(min_buffer_balance.saturating_add(deploy_fees));
  5390. bank.store_account(
  5391. &payer_keypair.pubkey(),
  5392. &AccountSharedData::new(
  5393. payer_base_balance.saturating_add(min_payer_balance),
  5394. 0,
  5395. &system_program::id(),
  5396. ),
  5397. );
  5398. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5399. bank.store_account(&programdata_address, &AccountSharedData::default());
  5400. let message = Message::new(
  5401. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5402. &payer_keypair.pubkey(),
  5403. &program_keypair.pubkey(),
  5404. &buffer_address,
  5405. &upgrade_authority_keypair.pubkey(),
  5406. min_program_balance,
  5407. elf.len(),
  5408. )
  5409. .unwrap(),
  5410. Some(&payer_keypair.pubkey()),
  5411. );
  5412. assert!(bank_client
  5413. .send_and_confirm_message(
  5414. &[&payer_keypair, &program_keypair, &upgrade_authority_keypair],
  5415. message
  5416. )
  5417. .is_ok());
  5418. assert_eq!(
  5419. bank.get_balance(&payer_keypair.pubkey()),
  5420. payer_base_balance
  5421. );
  5422. assert_eq!(bank.get_balance(&buffer_address), 0);
  5423. assert_eq!(None, bank.get_account(&buffer_address));
  5424. let post_program_account = bank.get_account(&program_keypair.pubkey()).unwrap();
  5425. assert_eq!(post_program_account.lamports(), min_program_balance);
  5426. assert_eq!(post_program_account.owner(), &bpf_loader_upgradeable::id());
  5427. assert_eq!(
  5428. post_program_account.data().len(),
  5429. UpgradeableLoaderState::size_of_program()
  5430. );
  5431. let state: UpgradeableLoaderState = post_program_account.state().unwrap();
  5432. assert_eq!(
  5433. state,
  5434. UpgradeableLoaderState::Program {
  5435. programdata_address
  5436. }
  5437. );
  5438. let post_programdata_account = bank.get_account(&programdata_address).unwrap();
  5439. assert_eq!(post_programdata_account.lamports(), min_programdata_balance);
  5440. assert_eq!(
  5441. post_programdata_account.owner(),
  5442. &bpf_loader_upgradeable::id()
  5443. );
  5444. let state: UpgradeableLoaderState = post_programdata_account.state().unwrap();
  5445. assert_eq!(
  5446. state,
  5447. UpgradeableLoaderState::ProgramData {
  5448. slot: bank_client.get_slot().unwrap(),
  5449. upgrade_authority_address: Some(upgrade_authority_keypair.pubkey())
  5450. }
  5451. );
  5452. for (i, byte) in post_programdata_account
  5453. .data()
  5454. .get(UpgradeableLoaderState::size_of_programdata_metadata()..)
  5455. .unwrap()
  5456. .iter()
  5457. .enumerate()
  5458. {
  5459. assert_eq!(*elf.get(i).unwrap(), *byte);
  5460. }
  5461. // Advance the bank so that the program becomes effective
  5462. goto_end_of_slot(bank.clone());
  5463. let bank = bank_client
  5464. .advance_slot(1, bank_forks.as_ref(), &mint_keypair.pubkey())
  5465. .unwrap();
  5466. // Invoke the deployed program
  5467. let transaction = Transaction::new(&[&binding], invocation_message, bank.last_blockhash());
  5468. assert!(bank.process_transaction(&transaction).is_ok());
  5469. {
  5470. let program_cache = bank
  5471. .transaction_processor
  5472. .global_program_cache
  5473. .read()
  5474. .unwrap();
  5475. let slot_versions = program_cache.get_slot_versions_for_tests(&program_keypair.pubkey());
  5476. assert_eq!(slot_versions.len(), 2);
  5477. assert_eq!(slot_versions[0].deployment_slot, bank.slot() - 1);
  5478. assert_eq!(slot_versions[0].effective_slot, bank.slot() - 1);
  5479. assert!(matches!(
  5480. slot_versions[0].program,
  5481. ProgramCacheEntryType::Closed,
  5482. ));
  5483. assert_eq!(slot_versions[1].deployment_slot, bank.slot() - 1);
  5484. assert_eq!(slot_versions[1].effective_slot, bank.slot());
  5485. assert!(matches!(
  5486. slot_versions[1].program,
  5487. ProgramCacheEntryType::Loaded(_),
  5488. ));
  5489. }
  5490. // Test initialized program account
  5491. bank.clear_signatures();
  5492. bank.store_account(&buffer_address, &buffer_account);
  5493. let bank = bank_client
  5494. .advance_slot(1, bank_forks.as_ref(), &mint_keypair.pubkey())
  5495. .unwrap();
  5496. let message = Message::new(
  5497. &[Instruction::new_with_bincode(
  5498. bpf_loader_upgradeable::id(),
  5499. &UpgradeableLoaderInstruction::DeployWithMaxDataLen {
  5500. max_data_len: elf.len(),
  5501. },
  5502. vec![
  5503. AccountMeta::new(mint_keypair.pubkey(), true),
  5504. AccountMeta::new(programdata_address, false),
  5505. AccountMeta::new(program_keypair.pubkey(), false),
  5506. AccountMeta::new(buffer_address, false),
  5507. AccountMeta::new_readonly(sysvar::rent::id(), false),
  5508. AccountMeta::new_readonly(sysvar::clock::id(), false),
  5509. AccountMeta::new_readonly(system_program::id(), false),
  5510. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), true),
  5511. ],
  5512. )],
  5513. Some(&mint_keypair.pubkey()),
  5514. );
  5515. assert_eq!(
  5516. TransactionError::InstructionError(0, InstructionError::AccountAlreadyInitialized),
  5517. bank_client
  5518. .send_and_confirm_message(&[&mint_keypair, &upgrade_authority_keypair], message)
  5519. .unwrap_err()
  5520. .unwrap()
  5521. );
  5522. // Test initialized ProgramData account
  5523. bank.clear_signatures();
  5524. bank.store_account(&buffer_address, &buffer_account);
  5525. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5526. let message = Message::new(
  5527. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5528. &mint_keypair.pubkey(),
  5529. &program_keypair.pubkey(),
  5530. &buffer_address,
  5531. &upgrade_authority_keypair.pubkey(),
  5532. min_program_balance,
  5533. elf.len(),
  5534. )
  5535. .unwrap(),
  5536. Some(&mint_keypair.pubkey()),
  5537. );
  5538. assert_eq!(
  5539. TransactionError::InstructionError(1, InstructionError::Custom(0)),
  5540. bank_client
  5541. .send_and_confirm_message(
  5542. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5543. message
  5544. )
  5545. .unwrap_err()
  5546. .unwrap()
  5547. );
  5548. // Test deploy no authority
  5549. bank.clear_signatures();
  5550. bank.store_account(&buffer_address, &buffer_account);
  5551. bank.store_account(&program_keypair.pubkey(), &program_account);
  5552. bank.store_account(&programdata_address, &programdata_account);
  5553. let message = Message::new(
  5554. &[Instruction::new_with_bincode(
  5555. bpf_loader_upgradeable::id(),
  5556. &UpgradeableLoaderInstruction::DeployWithMaxDataLen {
  5557. max_data_len: elf.len(),
  5558. },
  5559. vec![
  5560. AccountMeta::new(mint_keypair.pubkey(), true),
  5561. AccountMeta::new(programdata_address, false),
  5562. AccountMeta::new(program_keypair.pubkey(), false),
  5563. AccountMeta::new(buffer_address, false),
  5564. AccountMeta::new_readonly(sysvar::rent::id(), false),
  5565. AccountMeta::new_readonly(sysvar::clock::id(), false),
  5566. AccountMeta::new_readonly(system_program::id(), false),
  5567. ],
  5568. )],
  5569. Some(&mint_keypair.pubkey()),
  5570. );
  5571. assert_eq!(
  5572. TransactionError::InstructionError(0, InstructionError::NotEnoughAccountKeys),
  5573. bank_client
  5574. .send_and_confirm_message(&[&mint_keypair], message)
  5575. .unwrap_err()
  5576. .unwrap()
  5577. );
  5578. // Test deploy authority not a signer
  5579. bank.clear_signatures();
  5580. bank.store_account(&buffer_address, &buffer_account);
  5581. bank.store_account(&program_keypair.pubkey(), &program_account);
  5582. bank.store_account(&programdata_address, &programdata_account);
  5583. let message = Message::new(
  5584. &[Instruction::new_with_bincode(
  5585. bpf_loader_upgradeable::id(),
  5586. &UpgradeableLoaderInstruction::DeployWithMaxDataLen {
  5587. max_data_len: elf.len(),
  5588. },
  5589. vec![
  5590. AccountMeta::new(mint_keypair.pubkey(), true),
  5591. AccountMeta::new(programdata_address, false),
  5592. AccountMeta::new(program_keypair.pubkey(), false),
  5593. AccountMeta::new(buffer_address, false),
  5594. AccountMeta::new_readonly(sysvar::rent::id(), false),
  5595. AccountMeta::new_readonly(sysvar::clock::id(), false),
  5596. AccountMeta::new_readonly(system_program::id(), false),
  5597. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), false),
  5598. ],
  5599. )],
  5600. Some(&mint_keypair.pubkey()),
  5601. );
  5602. assert_eq!(
  5603. TransactionError::InstructionError(0, InstructionError::MissingRequiredSignature),
  5604. bank_client
  5605. .send_and_confirm_message(&[&mint_keypair], message)
  5606. .unwrap_err()
  5607. .unwrap()
  5608. );
  5609. // Test invalid Buffer account state
  5610. bank.clear_signatures();
  5611. bank.store_account(&buffer_address, &AccountSharedData::default());
  5612. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5613. bank.store_account(&programdata_address, &AccountSharedData::default());
  5614. let message = Message::new(
  5615. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5616. &mint_keypair.pubkey(),
  5617. &program_keypair.pubkey(),
  5618. &buffer_address,
  5619. &upgrade_authority_keypair.pubkey(),
  5620. min_program_balance,
  5621. elf.len(),
  5622. )
  5623. .unwrap(),
  5624. Some(&mint_keypair.pubkey()),
  5625. );
  5626. assert_eq!(
  5627. TransactionError::InstructionError(1, InstructionError::InvalidAccountData),
  5628. bank_client
  5629. .send_and_confirm_message(
  5630. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5631. message
  5632. )
  5633. .unwrap_err()
  5634. .unwrap()
  5635. );
  5636. // Test program account not rent exempt
  5637. bank.clear_signatures();
  5638. bank.store_account(&buffer_address, &buffer_account);
  5639. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5640. bank.store_account(&programdata_address, &AccountSharedData::default());
  5641. let message = Message::new(
  5642. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5643. &mint_keypair.pubkey(),
  5644. &program_keypair.pubkey(),
  5645. &buffer_address,
  5646. &upgrade_authority_keypair.pubkey(),
  5647. min_program_balance.saturating_sub(1),
  5648. elf.len(),
  5649. )
  5650. .unwrap(),
  5651. Some(&mint_keypair.pubkey()),
  5652. );
  5653. assert_eq!(
  5654. TransactionError::InstructionError(1, InstructionError::ExecutableAccountNotRentExempt),
  5655. bank_client
  5656. .send_and_confirm_message(
  5657. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5658. message
  5659. )
  5660. .unwrap_err()
  5661. .unwrap()
  5662. );
  5663. // Test program account not rent exempt because data is larger than needed
  5664. bank.clear_signatures();
  5665. bank.store_account(&buffer_address, &buffer_account);
  5666. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5667. bank.store_account(&programdata_address, &AccountSharedData::default());
  5668. let mut instructions = solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5669. &mint_keypair.pubkey(),
  5670. &program_keypair.pubkey(),
  5671. &buffer_address,
  5672. &upgrade_authority_keypair.pubkey(),
  5673. min_program_balance,
  5674. elf.len(),
  5675. )
  5676. .unwrap();
  5677. *instructions.get_mut(0).unwrap() = system_instruction::create_account(
  5678. &mint_keypair.pubkey(),
  5679. &program_keypair.pubkey(),
  5680. min_program_balance,
  5681. (UpgradeableLoaderState::size_of_program() as u64).saturating_add(1),
  5682. &bpf_loader_upgradeable::id(),
  5683. );
  5684. let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
  5685. assert_eq!(
  5686. TransactionError::InstructionError(1, InstructionError::ExecutableAccountNotRentExempt),
  5687. bank_client
  5688. .send_and_confirm_message(
  5689. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5690. message
  5691. )
  5692. .unwrap_err()
  5693. .unwrap()
  5694. );
  5695. // Test program account too small
  5696. bank.clear_signatures();
  5697. bank.store_account(&buffer_address, &buffer_account);
  5698. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5699. bank.store_account(&programdata_address, &AccountSharedData::default());
  5700. let mut instructions = solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5701. &mint_keypair.pubkey(),
  5702. &program_keypair.pubkey(),
  5703. &buffer_address,
  5704. &upgrade_authority_keypair.pubkey(),
  5705. min_program_balance,
  5706. elf.len(),
  5707. )
  5708. .unwrap();
  5709. *instructions.get_mut(0).unwrap() = system_instruction::create_account(
  5710. &mint_keypair.pubkey(),
  5711. &program_keypair.pubkey(),
  5712. min_program_balance,
  5713. (UpgradeableLoaderState::size_of_program() as u64).saturating_sub(1),
  5714. &bpf_loader_upgradeable::id(),
  5715. );
  5716. let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
  5717. assert_eq!(
  5718. TransactionError::InstructionError(1, InstructionError::AccountDataTooSmall),
  5719. bank_client
  5720. .send_and_confirm_message(
  5721. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5722. message
  5723. )
  5724. .unwrap_err()
  5725. .unwrap()
  5726. );
  5727. // Test Insufficient payer funds (need more funds to cover the
  5728. // difference between buffer lamports and programdata lamports)
  5729. bank.clear_signatures();
  5730. bank.store_account(
  5731. &mint_keypair.pubkey(),
  5732. &AccountSharedData::new(
  5733. deploy_fees.saturating_add(min_program_balance),
  5734. 0,
  5735. &system_program::id(),
  5736. ),
  5737. );
  5738. bank.store_account(&buffer_address, &buffer_account);
  5739. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5740. bank.store_account(&programdata_address, &AccountSharedData::default());
  5741. let message = Message::new(
  5742. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5743. &mint_keypair.pubkey(),
  5744. &program_keypair.pubkey(),
  5745. &buffer_address,
  5746. &upgrade_authority_keypair.pubkey(),
  5747. min_program_balance,
  5748. elf.len(),
  5749. )
  5750. .unwrap(),
  5751. Some(&mint_keypair.pubkey()),
  5752. );
  5753. assert_eq!(
  5754. TransactionError::InstructionError(1, InstructionError::Custom(1)),
  5755. bank_client
  5756. .send_and_confirm_message(
  5757. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5758. message
  5759. )
  5760. .unwrap_err()
  5761. .unwrap()
  5762. );
  5763. bank.store_account(
  5764. &mint_keypair.pubkey(),
  5765. &AccountSharedData::new(1_000_000_000, 0, &system_program::id()),
  5766. );
  5767. // Test max_data_len
  5768. bank.clear_signatures();
  5769. bank.store_account(&buffer_address, &buffer_account);
  5770. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5771. bank.store_account(&programdata_address, &AccountSharedData::default());
  5772. let message = Message::new(
  5773. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5774. &mint_keypair.pubkey(),
  5775. &program_keypair.pubkey(),
  5776. &buffer_address,
  5777. &upgrade_authority_keypair.pubkey(),
  5778. min_program_balance,
  5779. elf.len().saturating_sub(1),
  5780. )
  5781. .unwrap(),
  5782. Some(&mint_keypair.pubkey()),
  5783. );
  5784. assert_eq!(
  5785. TransactionError::InstructionError(1, InstructionError::AccountDataTooSmall),
  5786. bank_client
  5787. .send_and_confirm_message(
  5788. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5789. message
  5790. )
  5791. .unwrap_err()
  5792. .unwrap()
  5793. );
  5794. // Test max_data_len too large
  5795. bank.clear_signatures();
  5796. bank.store_account(
  5797. &mint_keypair.pubkey(),
  5798. &AccountSharedData::new(u64::MAX / 2, 0, &system_program::id()),
  5799. );
  5800. let mut modified_buffer_account = buffer_account.clone();
  5801. modified_buffer_account.set_lamports(u64::MAX / 2);
  5802. bank.store_account(&buffer_address, &modified_buffer_account);
  5803. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5804. bank.store_account(&programdata_address, &AccountSharedData::default());
  5805. let message = Message::new(
  5806. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5807. &mint_keypair.pubkey(),
  5808. &program_keypair.pubkey(),
  5809. &buffer_address,
  5810. &upgrade_authority_keypair.pubkey(),
  5811. min_program_balance,
  5812. usize::MAX,
  5813. )
  5814. .unwrap(),
  5815. Some(&mint_keypair.pubkey()),
  5816. );
  5817. assert_eq!(
  5818. TransactionError::InstructionError(1, InstructionError::InvalidArgument),
  5819. bank_client
  5820. .send_and_confirm_message(
  5821. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5822. message
  5823. )
  5824. .unwrap_err()
  5825. .unwrap()
  5826. );
  5827. fn truncate_data(account: &mut AccountSharedData, len: usize) {
  5828. let mut data = account.data().to_vec();
  5829. data.truncate(len);
  5830. account.set_data(data);
  5831. }
  5832. // Test Bad ELF data
  5833. bank.clear_signatures();
  5834. let mut modified_buffer_account = buffer_account;
  5835. truncate_data(
  5836. &mut modified_buffer_account,
  5837. UpgradeableLoaderState::size_of_buffer(1),
  5838. );
  5839. bank.store_account(&buffer_address, &modified_buffer_account);
  5840. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5841. bank.store_account(&programdata_address, &AccountSharedData::default());
  5842. let message = Message::new(
  5843. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5844. &mint_keypair.pubkey(),
  5845. &program_keypair.pubkey(),
  5846. &buffer_address,
  5847. &upgrade_authority_keypair.pubkey(),
  5848. min_program_balance,
  5849. elf.len(),
  5850. )
  5851. .unwrap(),
  5852. Some(&mint_keypair.pubkey()),
  5853. );
  5854. assert_eq!(
  5855. TransactionError::InstructionError(1, InstructionError::InvalidAccountData),
  5856. bank_client
  5857. .send_and_confirm_message(
  5858. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5859. message
  5860. )
  5861. .unwrap_err()
  5862. .unwrap()
  5863. );
  5864. // Test small buffer account
  5865. bank.clear_signatures();
  5866. let mut modified_buffer_account = AccountSharedData::new(
  5867. min_programdata_balance,
  5868. UpgradeableLoaderState::size_of_buffer(elf.len()),
  5869. &bpf_loader_upgradeable::id(),
  5870. );
  5871. modified_buffer_account
  5872. .set_state(&UpgradeableLoaderState::Buffer {
  5873. authority_address: Some(upgrade_authority_keypair.pubkey()),
  5874. })
  5875. .unwrap();
  5876. modified_buffer_account
  5877. .data_as_mut_slice()
  5878. .get_mut(UpgradeableLoaderState::size_of_buffer_metadata()..)
  5879. .unwrap()
  5880. .copy_from_slice(&elf);
  5881. truncate_data(&mut modified_buffer_account, 5);
  5882. bank.store_account(&buffer_address, &modified_buffer_account);
  5883. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5884. bank.store_account(&programdata_address, &AccountSharedData::default());
  5885. let message = Message::new(
  5886. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5887. &mint_keypair.pubkey(),
  5888. &program_keypair.pubkey(),
  5889. &buffer_address,
  5890. &upgrade_authority_keypair.pubkey(),
  5891. min_program_balance,
  5892. elf.len(),
  5893. )
  5894. .unwrap(),
  5895. Some(&mint_keypair.pubkey()),
  5896. );
  5897. assert_eq!(
  5898. TransactionError::InstructionError(1, InstructionError::InvalidAccountData),
  5899. bank_client
  5900. .send_and_confirm_message(
  5901. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5902. message
  5903. )
  5904. .unwrap_err()
  5905. .unwrap()
  5906. );
  5907. // Mismatched buffer and program authority
  5908. bank.clear_signatures();
  5909. let mut modified_buffer_account = AccountSharedData::new(
  5910. min_programdata_balance,
  5911. UpgradeableLoaderState::size_of_buffer(elf.len()),
  5912. &bpf_loader_upgradeable::id(),
  5913. );
  5914. modified_buffer_account
  5915. .set_state(&UpgradeableLoaderState::Buffer {
  5916. authority_address: Some(buffer_address),
  5917. })
  5918. .unwrap();
  5919. modified_buffer_account
  5920. .data_as_mut_slice()
  5921. .get_mut(UpgradeableLoaderState::size_of_buffer_metadata()..)
  5922. .unwrap()
  5923. .copy_from_slice(&elf);
  5924. bank.store_account(&buffer_address, &modified_buffer_account);
  5925. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5926. bank.store_account(&programdata_address, &AccountSharedData::default());
  5927. let message = Message::new(
  5928. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5929. &mint_keypair.pubkey(),
  5930. &program_keypair.pubkey(),
  5931. &buffer_address,
  5932. &upgrade_authority_keypair.pubkey(),
  5933. min_program_balance,
  5934. elf.len(),
  5935. )
  5936. .unwrap(),
  5937. Some(&mint_keypair.pubkey()),
  5938. );
  5939. assert_eq!(
  5940. TransactionError::InstructionError(1, InstructionError::IncorrectAuthority),
  5941. bank_client
  5942. .send_and_confirm_message(
  5943. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5944. message
  5945. )
  5946. .unwrap_err()
  5947. .unwrap()
  5948. );
  5949. // Deploy buffer with mismatched None authority
  5950. bank.clear_signatures();
  5951. let mut modified_buffer_account = AccountSharedData::new(
  5952. min_programdata_balance,
  5953. UpgradeableLoaderState::size_of_buffer(elf.len()),
  5954. &bpf_loader_upgradeable::id(),
  5955. );
  5956. modified_buffer_account
  5957. .set_state(&UpgradeableLoaderState::Buffer {
  5958. authority_address: None,
  5959. })
  5960. .unwrap();
  5961. modified_buffer_account
  5962. .data_as_mut_slice()
  5963. .get_mut(UpgradeableLoaderState::size_of_buffer_metadata()..)
  5964. .unwrap()
  5965. .copy_from_slice(&elf);
  5966. bank.store_account(&buffer_address, &modified_buffer_account);
  5967. bank.store_account(&program_keypair.pubkey(), &AccountSharedData::default());
  5968. bank.store_account(&programdata_address, &AccountSharedData::default());
  5969. let message = Message::new(
  5970. &solana_loader_v3_interface::instruction::deploy_with_max_program_len(
  5971. &mint_keypair.pubkey(),
  5972. &program_keypair.pubkey(),
  5973. &buffer_address,
  5974. &upgrade_authority_keypair.pubkey(),
  5975. min_program_balance,
  5976. elf.len(),
  5977. )
  5978. .unwrap(),
  5979. Some(&mint_keypair.pubkey()),
  5980. );
  5981. assert_eq!(
  5982. TransactionError::InstructionError(1, InstructionError::IncorrectAuthority),
  5983. bank_client
  5984. .send_and_confirm_message(
  5985. &[&mint_keypair, &program_keypair, &upgrade_authority_keypair],
  5986. message
  5987. )
  5988. .unwrap_err()
  5989. .unwrap()
  5990. );
  5991. }
  5992. #[test]
  5993. fn test_compute_active_feature_set() {
  5994. let (bank0, _bank_forks) = create_simple_test_arc_bank(100_000);
  5995. let mut bank = Bank::new_from_parent(bank0, &Pubkey::default(), 1);
  5996. let test_feature = "TestFeature11111111111111111111111111111111"
  5997. .parse::<Pubkey>()
  5998. .unwrap();
  5999. let mut feature_set = FeatureSet::default();
  6000. feature_set.inactive_mut().insert(test_feature);
  6001. bank.feature_set = Arc::new(feature_set.clone());
  6002. let (feature_set, new_activations) = bank.compute_active_feature_set(true);
  6003. assert!(new_activations.is_empty());
  6004. assert!(!feature_set.is_active(&test_feature));
  6005. // Depositing into the `test_feature` account should do nothing
  6006. test_utils::deposit(&bank, &test_feature, 42).unwrap();
  6007. let (feature_set, new_activations) = bank.compute_active_feature_set(true);
  6008. assert!(new_activations.is_empty());
  6009. assert!(!feature_set.is_active(&test_feature));
  6010. // Request `test_feature` activation
  6011. let feature = Feature::default();
  6012. assert_eq!(feature.activated_at, None);
  6013. bank.store_account(&test_feature, &feature::create_account(&feature, 42));
  6014. let feature = feature::from_account(&bank.get_account(&test_feature).expect("get_account"))
  6015. .expect("from_account");
  6016. assert_eq!(feature.activated_at, None);
  6017. // Run `compute_active_feature_set` excluding pending activation
  6018. let (feature_set, new_activations) = bank.compute_active_feature_set(false);
  6019. assert!(new_activations.is_empty());
  6020. assert!(!feature_set.is_active(&test_feature));
  6021. // Run `compute_active_feature_set` including pending activation
  6022. let (_feature_set, new_activations) = bank.compute_active_feature_set(true);
  6023. assert_eq!(new_activations.len(), 1);
  6024. assert!(new_activations.contains(&test_feature));
  6025. // Actually activate the pending activation
  6026. bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, true);
  6027. let feature = feature::from_account(&bank.get_account(&test_feature).expect("get_account"))
  6028. .expect("from_account");
  6029. assert_eq!(feature.activated_at, Some(1));
  6030. let (feature_set, new_activations) = bank.compute_active_feature_set(true);
  6031. assert!(new_activations.is_empty());
  6032. assert!(feature_set.is_active(&test_feature));
  6033. }
  6034. #[test]
  6035. fn test_reserved_account_keys() {
  6036. let (bank0, _bank_forks) = create_simple_test_arc_bank(100_000);
  6037. let mut bank = Bank::new_from_parent(bank0, &Pubkey::default(), 1);
  6038. let test_feature_id = Pubkey::new_unique();
  6039. bank.feature_set = Arc::new(FeatureSet::new(
  6040. AHashMap::new(),
  6041. AHashSet::from([test_feature_id]),
  6042. ));
  6043. bank.reserved_account_keys = Arc::new(ReservedAccountKeys::new(&[
  6044. ReservedAccount::new_active(system_program::id()),
  6045. ReservedAccount::new_pending(Pubkey::new_unique(), test_feature_id),
  6046. ]));
  6047. assert_eq!(
  6048. bank.get_reserved_account_keys().len(),
  6049. 1,
  6050. "before activating the test feature, bank should already have an active reserved key"
  6051. );
  6052. bank.store_account(
  6053. &test_feature_id,
  6054. &feature::create_account(&Feature::default(), 42),
  6055. );
  6056. bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, true);
  6057. assert_eq!(
  6058. bank.get_reserved_account_keys().len(),
  6059. 2,
  6060. "after activating the test feature, bank should have another active reserved key"
  6061. );
  6062. }
  6063. #[test]
  6064. fn test_block_limits() {
  6065. const MAX_WRITABLE_ACCOUNT_UNITS_SIMD_0306_FIRST: u64 = 24_000_000;
  6066. const MAX_WRITABLE_ACCOUNT_UNITS_SIMD_0306_SECOND: u64 = 40_000_000;
  6067. let (bank0, _bank_forks) = create_simple_test_arc_bank(100_000);
  6068. let mut bank = Bank::new_from_parent(bank0, &Pubkey::default(), 1);
  6069. // Ensure increased block limits features are inactive.
  6070. assert!(!bank
  6071. .feature_set
  6072. .is_active(&feature_set::raise_block_limits_to_100m::id()));
  6073. assert_eq!(
  6074. bank.read_cost_tracker().unwrap().get_block_limit(),
  6075. MAX_BLOCK_UNITS,
  6076. "before activating the feature, bank should have old/default limit"
  6077. );
  6078. assert!(!bank
  6079. .feature_set
  6080. .is_active(&feature_set::raise_account_cu_limit::id()));
  6081. assert_eq!(
  6082. bank.read_cost_tracker().unwrap().get_account_limit(),
  6083. MAX_WRITABLE_ACCOUNT_UNITS,
  6084. "before activating the feature, bank should have old/default limit"
  6085. );
  6086. // Activate `raise_block_limits_to_100m` feature
  6087. bank.store_account(
  6088. &feature_set::raise_block_limits_to_100m::id(),
  6089. &feature::create_account(&Feature::default(), 42),
  6090. );
  6091. // apply_feature_activations for `FinishInit` will not cause the block limit to be updated
  6092. bank.apply_feature_activations(ApplyFeatureActivationsCaller::FinishInit, true);
  6093. assert_eq!(
  6094. bank.read_cost_tracker().unwrap().get_block_limit(),
  6095. MAX_BLOCK_UNITS,
  6096. "before activating the feature, bank should have old/default limit"
  6097. );
  6098. // apply_feature_activations for `NewFromParent` will cause feature to be activated
  6099. bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, true);
  6100. assert_eq!(
  6101. bank.read_cost_tracker().unwrap().get_block_limit(),
  6102. MAX_BLOCK_UNITS_SIMD_0286,
  6103. "after activating the feature, bank should have new limit"
  6104. );
  6105. assert_eq!(
  6106. bank.read_cost_tracker().unwrap().get_account_limit(),
  6107. MAX_WRITABLE_ACCOUNT_UNITS,
  6108. "after activating the feature, bank should have new limit"
  6109. );
  6110. // Make sure the limits propagate to the child-bank.
  6111. let mut bank = Bank::new_from_parent(Arc::new(bank), &Pubkey::default(), 2);
  6112. assert_eq!(
  6113. bank.read_cost_tracker().unwrap().get_block_limit(),
  6114. MAX_BLOCK_UNITS_SIMD_0286,
  6115. "child bank should have new limit"
  6116. );
  6117. // Activate `raise_account_cu_limit` feature
  6118. bank.store_account(
  6119. &feature_set::raise_account_cu_limit::id(),
  6120. &feature::create_account(&Feature::default(), 42),
  6121. );
  6122. // apply_feature_activations for `FinishInit` will not cause the block limit to be updated
  6123. bank.apply_feature_activations(ApplyFeatureActivationsCaller::FinishInit, true);
  6124. assert_eq!(
  6125. bank.read_cost_tracker().unwrap().get_account_limit(),
  6126. MAX_WRITABLE_ACCOUNT_UNITS,
  6127. "before activating the feature, bank should have old/default limit"
  6128. );
  6129. // apply_feature_activations for `NewFromParent` will cause feature to be activated
  6130. bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, true);
  6131. assert_eq!(
  6132. bank.read_cost_tracker().unwrap().get_account_limit(),
  6133. MAX_WRITABLE_ACCOUNT_UNITS_SIMD_0306_SECOND,
  6134. "after activating the feature, bank should have new limit"
  6135. );
  6136. // Test SIMD-0306 getting activated first
  6137. let (bank0, _bank_forks) = create_simple_test_arc_bank(100_000);
  6138. let mut bank = Bank::new_from_parent(bank0, &Pubkey::default(), 1);
  6139. // Activate `raise_account_cu_limit` feature
  6140. bank.store_account(
  6141. &feature_set::raise_account_cu_limit::id(),
  6142. &feature::create_account(&Feature::default(), 42),
  6143. );
  6144. // apply_feature_activations for `FinishInit` will not cause the block limit to be updated
  6145. bank.apply_feature_activations(ApplyFeatureActivationsCaller::FinishInit, true);
  6146. assert_eq!(
  6147. bank.read_cost_tracker().unwrap().get_account_limit(),
  6148. MAX_WRITABLE_ACCOUNT_UNITS,
  6149. "before activating the feature, bank should have old/default limit"
  6150. );
  6151. // apply_feature_activations for `NewFromParent` will cause feature to be activated
  6152. bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, true);
  6153. assert_eq!(
  6154. bank.read_cost_tracker().unwrap().get_block_limit(),
  6155. MAX_BLOCK_UNITS,
  6156. "after activating the feature, bank should have new limit"
  6157. );
  6158. assert_eq!(
  6159. bank.read_cost_tracker().unwrap().get_account_limit(),
  6160. MAX_WRITABLE_ACCOUNT_UNITS_SIMD_0306_FIRST,
  6161. "after activating the feature, bank should have new limit"
  6162. );
  6163. // Activate `raise_block_limits_to_100m` feature
  6164. bank.store_account(
  6165. &feature_set::raise_block_limits_to_100m::id(),
  6166. &feature::create_account(&Feature::default(), 42),
  6167. );
  6168. // apply_feature_activations for `FinishInit` will not cause the block limit to be updated
  6169. bank.apply_feature_activations(ApplyFeatureActivationsCaller::FinishInit, true);
  6170. assert_eq!(
  6171. bank.read_cost_tracker().unwrap().get_block_limit(),
  6172. MAX_BLOCK_UNITS,
  6173. "before activating the feature, bank should have old/default limit"
  6174. );
  6175. // apply_feature_activations for `NewFromParent` will cause feature to be activated
  6176. bank.apply_feature_activations(ApplyFeatureActivationsCaller::NewFromParent, true);
  6177. assert_eq!(
  6178. bank.read_cost_tracker().unwrap().get_block_limit(),
  6179. MAX_BLOCK_UNITS_SIMD_0286,
  6180. "after activating the feature, bank should have new limit"
  6181. );
  6182. assert_eq!(
  6183. bank.read_cost_tracker().unwrap().get_account_limit(),
  6184. MAX_WRITABLE_ACCOUNT_UNITS_SIMD_0306_SECOND,
  6185. "after activating the feature, bank should have new limit"
  6186. );
  6187. // Test starting from a genesis config with and without feature account
  6188. let (mut genesis_config, _keypair) = create_genesis_config(100_000);
  6189. // Without feature account in genesis, old limits are used.
  6190. let bank = Bank::new_for_tests(&genesis_config);
  6191. assert_eq!(
  6192. bank.read_cost_tracker().unwrap().get_block_limit(),
  6193. MAX_BLOCK_UNITS,
  6194. "before activating the feature, bank should have old/default limit"
  6195. );
  6196. assert_eq!(
  6197. bank.read_cost_tracker().unwrap().get_account_limit(),
  6198. MAX_WRITABLE_ACCOUNT_UNITS,
  6199. "before activating the feature, bank should have old/default limit"
  6200. );
  6201. activate_feature(
  6202. &mut genesis_config,
  6203. feature_set::raise_block_limits_to_100m::id(),
  6204. );
  6205. let bank = Bank::new_for_tests(&genesis_config);
  6206. assert!(bank
  6207. .feature_set
  6208. .is_active(&feature_set::raise_block_limits_to_100m::id()));
  6209. assert_eq!(
  6210. bank.read_cost_tracker().unwrap().get_block_limit(),
  6211. MAX_BLOCK_UNITS_SIMD_0286,
  6212. "bank created from genesis config should have new limit"
  6213. );
  6214. activate_feature(
  6215. &mut genesis_config,
  6216. feature_set::raise_account_cu_limit::id(),
  6217. );
  6218. let bank = Bank::new_for_tests(&genesis_config);
  6219. assert!(bank
  6220. .feature_set
  6221. .is_active(&feature_set::raise_account_cu_limit::id()));
  6222. assert_eq!(
  6223. bank.read_cost_tracker().unwrap().get_account_limit(),
  6224. MAX_WRITABLE_ACCOUNT_UNITS_SIMD_0306_SECOND,
  6225. "bank created from genesis config should have new limit"
  6226. );
  6227. }
  6228. #[test]
  6229. fn test_program_replacement() {
  6230. let mut bank = create_simple_test_bank(0);
  6231. // Setup original program account
  6232. let old_address = Pubkey::new_unique();
  6233. let new_address = Pubkey::new_unique();
  6234. bank.store_account_and_update_capitalization(
  6235. &old_address,
  6236. &AccountSharedData::from(Account {
  6237. lamports: 100,
  6238. ..Account::default()
  6239. }),
  6240. );
  6241. assert_eq!(bank.get_balance(&old_address), 100);
  6242. // Setup new program account
  6243. let new_program_account = AccountSharedData::from(Account {
  6244. lamports: 123,
  6245. ..Account::default()
  6246. });
  6247. bank.store_account_and_update_capitalization(&new_address, &new_program_account);
  6248. assert_eq!(bank.get_balance(&new_address), 123);
  6249. let original_capitalization = bank.capitalization();
  6250. bank.replace_program_account(&old_address, &new_address, "bank-apply_program_replacement");
  6251. // New program account is now empty
  6252. assert_eq!(bank.get_balance(&new_address), 0);
  6253. // Old program account holds the new program account
  6254. assert_eq!(bank.get_account(&old_address), Some(new_program_account));
  6255. // Lamports in the old token account were burnt
  6256. assert_eq!(bank.capitalization(), original_capitalization - 100);
  6257. }
  6258. fn min_rent_exempt_balance_for_sysvars(bank: &Bank, sysvar_ids: &[Pubkey]) -> u64 {
  6259. sysvar_ids
  6260. .iter()
  6261. .map(|sysvar_id| {
  6262. trace!("min_rent_excempt_balance_for_sysvars: {sysvar_id}");
  6263. bank.get_minimum_balance_for_rent_exemption(
  6264. bank.get_account(sysvar_id).unwrap().data().len(),
  6265. )
  6266. })
  6267. .sum()
  6268. }
  6269. #[test]
  6270. fn test_adjust_sysvar_balance_for_rent() {
  6271. let bank = create_simple_test_bank(0);
  6272. let mut smaller_sample_sysvar = AccountSharedData::new(1, 0, &Pubkey::default());
  6273. assert_eq!(smaller_sample_sysvar.lamports(), 1);
  6274. bank.adjust_sysvar_balance_for_rent(&mut smaller_sample_sysvar);
  6275. assert_eq!(
  6276. smaller_sample_sysvar.lamports(),
  6277. bank.get_minimum_balance_for_rent_exemption(smaller_sample_sysvar.data().len()),
  6278. );
  6279. let mut bigger_sample_sysvar = AccountSharedData::new(
  6280. 1,
  6281. smaller_sample_sysvar.data().len() + 1,
  6282. &Pubkey::default(),
  6283. );
  6284. bank.adjust_sysvar_balance_for_rent(&mut bigger_sample_sysvar);
  6285. assert!(smaller_sample_sysvar.lamports() < bigger_sample_sysvar.lamports());
  6286. // excess lamports shouldn't be reduced by adjust_sysvar_balance_for_rent()
  6287. let excess_lamports = smaller_sample_sysvar.lamports() + 999;
  6288. smaller_sample_sysvar.set_lamports(excess_lamports);
  6289. bank.adjust_sysvar_balance_for_rent(&mut smaller_sample_sysvar);
  6290. assert_eq!(smaller_sample_sysvar.lamports(), excess_lamports);
  6291. }
  6292. #[test]
  6293. fn test_update_clock_timestamp() {
  6294. let leader_pubkey = solana_pubkey::new_rand();
  6295. let GenesisConfigInfo {
  6296. genesis_config,
  6297. voting_keypair,
  6298. ..
  6299. } = create_genesis_config_with_leader(5, &leader_pubkey, 3);
  6300. let mut bank = Bank::new_for_tests(&genesis_config);
  6301. // Advance past slot 0, which has special handling.
  6302. bank = new_from_parent(Arc::new(bank));
  6303. bank = new_from_parent(Arc::new(bank));
  6304. assert_eq!(
  6305. bank.clock().unix_timestamp,
  6306. bank.unix_timestamp_from_genesis()
  6307. );
  6308. bank.update_clock(None);
  6309. assert_eq!(
  6310. bank.clock().unix_timestamp,
  6311. bank.unix_timestamp_from_genesis()
  6312. );
  6313. update_vote_account_timestamp(
  6314. BlockTimestamp {
  6315. slot: bank.slot(),
  6316. timestamp: bank.unix_timestamp_from_genesis() - 1,
  6317. },
  6318. &bank,
  6319. &voting_keypair.pubkey(),
  6320. );
  6321. bank.update_clock(None);
  6322. assert_eq!(
  6323. bank.clock().unix_timestamp,
  6324. bank.unix_timestamp_from_genesis()
  6325. );
  6326. update_vote_account_timestamp(
  6327. BlockTimestamp {
  6328. slot: bank.slot(),
  6329. timestamp: bank.unix_timestamp_from_genesis(),
  6330. },
  6331. &bank,
  6332. &voting_keypair.pubkey(),
  6333. );
  6334. bank.update_clock(None);
  6335. assert_eq!(
  6336. bank.clock().unix_timestamp,
  6337. bank.unix_timestamp_from_genesis()
  6338. );
  6339. update_vote_account_timestamp(
  6340. BlockTimestamp {
  6341. slot: bank.slot(),
  6342. timestamp: bank.unix_timestamp_from_genesis() + 1,
  6343. },
  6344. &bank,
  6345. &voting_keypair.pubkey(),
  6346. );
  6347. bank.update_clock(None);
  6348. assert_eq!(
  6349. bank.clock().unix_timestamp,
  6350. bank.unix_timestamp_from_genesis() + 1
  6351. );
  6352. // Timestamp cannot go backward from ancestor Bank to child
  6353. bank = new_from_parent(Arc::new(bank));
  6354. update_vote_account_timestamp(
  6355. BlockTimestamp {
  6356. slot: bank.slot(),
  6357. timestamp: bank.unix_timestamp_from_genesis() - 1,
  6358. },
  6359. &bank,
  6360. &voting_keypair.pubkey(),
  6361. );
  6362. bank.update_clock(None);
  6363. assert_eq!(
  6364. bank.clock().unix_timestamp,
  6365. bank.unix_timestamp_from_genesis()
  6366. );
  6367. }
  6368. fn poh_estimate_offset(bank: &Bank) -> Duration {
  6369. let mut epoch_start_slot = bank.epoch_schedule.get_first_slot_in_epoch(bank.epoch());
  6370. if epoch_start_slot == bank.slot() {
  6371. epoch_start_slot = bank
  6372. .epoch_schedule
  6373. .get_first_slot_in_epoch(bank.epoch() - 1);
  6374. }
  6375. bank.slot().saturating_sub(epoch_start_slot) as u32
  6376. * Duration::from_nanos(bank.ns_per_slot as u64)
  6377. }
  6378. #[test]
  6379. fn test_timestamp_slow() {
  6380. fn max_allowable_delta_since_epoch(bank: &Bank, max_allowable_drift: u32) -> i64 {
  6381. let poh_estimate_offset = poh_estimate_offset(bank);
  6382. (poh_estimate_offset.as_secs()
  6383. + (poh_estimate_offset * max_allowable_drift / 100).as_secs()) as i64
  6384. }
  6385. let leader_pubkey = solana_pubkey::new_rand();
  6386. let GenesisConfigInfo {
  6387. mut genesis_config,
  6388. voting_keypair,
  6389. ..
  6390. } = create_genesis_config_with_leader(5, &leader_pubkey, 3);
  6391. let slots_in_epoch = 32;
  6392. genesis_config.epoch_schedule = EpochSchedule::new(slots_in_epoch);
  6393. let mut bank = Bank::new_for_tests(&genesis_config);
  6394. let slot_duration = Duration::from_nanos(bank.ns_per_slot as u64);
  6395. let recent_timestamp: UnixTimestamp = bank.unix_timestamp_from_genesis();
  6396. let additional_secs =
  6397. ((slot_duration * MAX_ALLOWABLE_DRIFT_PERCENTAGE_SLOW_V2 * 32) / 100).as_secs() as i64 + 1; // Greater than max_allowable_drift_slow_v2 for full epoch
  6398. update_vote_account_timestamp(
  6399. BlockTimestamp {
  6400. slot: bank.slot(),
  6401. timestamp: recent_timestamp + additional_secs,
  6402. },
  6403. &bank,
  6404. &voting_keypair.pubkey(),
  6405. );
  6406. // additional_secs greater than MAX_ALLOWABLE_DRIFT_PERCENTAGE_SLOW_V2 for an epoch
  6407. // timestamp bounded to 150% deviation
  6408. for _ in 0..31 {
  6409. bank = new_from_parent(Arc::new(bank));
  6410. assert_eq!(
  6411. bank.clock().unix_timestamp,
  6412. bank.clock().epoch_start_timestamp
  6413. + max_allowable_delta_since_epoch(&bank, MAX_ALLOWABLE_DRIFT_PERCENTAGE_SLOW_V2),
  6414. );
  6415. assert_eq!(bank.clock().epoch_start_timestamp, recent_timestamp);
  6416. }
  6417. }
  6418. #[test]
  6419. fn test_timestamp_fast() {
  6420. fn max_allowable_delta_since_epoch(bank: &Bank, max_allowable_drift: u32) -> i64 {
  6421. let poh_estimate_offset = poh_estimate_offset(bank);
  6422. (poh_estimate_offset.as_secs()
  6423. - (poh_estimate_offset * max_allowable_drift / 100).as_secs()) as i64
  6424. }
  6425. let leader_pubkey = solana_pubkey::new_rand();
  6426. let GenesisConfigInfo {
  6427. mut genesis_config,
  6428. voting_keypair,
  6429. ..
  6430. } = create_genesis_config_with_leader(5, &leader_pubkey, 3);
  6431. let slots_in_epoch = 32;
  6432. genesis_config.epoch_schedule = EpochSchedule::new(slots_in_epoch);
  6433. let mut bank = Bank::new_for_tests(&genesis_config);
  6434. let recent_timestamp: UnixTimestamp = bank.unix_timestamp_from_genesis();
  6435. let additional_secs = 5; // Greater than MAX_ALLOWABLE_DRIFT_PERCENTAGE_FAST for full epoch
  6436. update_vote_account_timestamp(
  6437. BlockTimestamp {
  6438. slot: bank.slot(),
  6439. timestamp: recent_timestamp - additional_secs,
  6440. },
  6441. &bank,
  6442. &voting_keypair.pubkey(),
  6443. );
  6444. // additional_secs greater than MAX_ALLOWABLE_DRIFT_PERCENTAGE_FAST for an epoch
  6445. // timestamp bounded to 25% deviation
  6446. for _ in 0..31 {
  6447. bank = new_from_parent(Arc::new(bank));
  6448. assert_eq!(
  6449. bank.clock().unix_timestamp,
  6450. bank.clock().epoch_start_timestamp
  6451. + max_allowable_delta_since_epoch(&bank, MAX_ALLOWABLE_DRIFT_PERCENTAGE_FAST),
  6452. );
  6453. assert_eq!(bank.clock().epoch_start_timestamp, recent_timestamp);
  6454. }
  6455. }
  6456. #[test_case(false; "informal_loaded_size")]
  6457. #[test_case(true; "simd186_loaded_size")]
  6458. fn test_program_is_native_loader(formalize_loaded_transaction_data_size: bool) {
  6459. let (genesis_config, mint_keypair) = create_genesis_config(50000);
  6460. let mut bank = Bank::new_for_tests(&genesis_config);
  6461. if formalize_loaded_transaction_data_size {
  6462. bank.activate_feature(&feature_set::formalize_loaded_transaction_data_size::id());
  6463. }
  6464. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  6465. let tx = Transaction::new_signed_with_payer(
  6466. &[Instruction::new_with_bincode(
  6467. native_loader::id(),
  6468. &(),
  6469. vec![],
  6470. )],
  6471. Some(&mint_keypair.pubkey()),
  6472. &[&mint_keypair],
  6473. bank.last_blockhash(),
  6474. );
  6475. let err = bank.process_transaction(&tx).unwrap_err();
  6476. if formalize_loaded_transaction_data_size {
  6477. assert_eq!(err, TransactionError::ProgramAccountNotFound);
  6478. } else {
  6479. assert_eq!(
  6480. err,
  6481. TransactionError::InstructionError(0, InstructionError::UnsupportedProgramId)
  6482. );
  6483. }
  6484. }
  6485. #[test_case(false; "informal_loaded_size")]
  6486. #[test_case(true; "simd186_loaded_size")]
  6487. fn test_invoke_non_program_account_owned_by_a_builtin(
  6488. formalize_loaded_transaction_data_size: bool,
  6489. ) {
  6490. let (genesis_config, mint_keypair) = create_genesis_config(10000000);
  6491. let mut bank = Bank::new_for_tests(&genesis_config);
  6492. if formalize_loaded_transaction_data_size {
  6493. bank.activate_feature(&feature_set::formalize_loaded_transaction_data_size::id());
  6494. }
  6495. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  6496. let bogus_program = Pubkey::new_unique();
  6497. bank.transfer(
  6498. genesis_config.rent.minimum_balance(0),
  6499. &mint_keypair,
  6500. &bogus_program,
  6501. )
  6502. .unwrap();
  6503. let created_account_keypair = Keypair::new();
  6504. let mut ix = system_instruction::create_account(
  6505. &mint_keypair.pubkey(),
  6506. &created_account_keypair.pubkey(),
  6507. genesis_config.rent.minimum_balance(0),
  6508. 0,
  6509. &system_program::id(),
  6510. );
  6511. // Calling an account owned by the system program, instead of calling the system program itself
  6512. ix.program_id = bogus_program;
  6513. let tx = Transaction::new_signed_with_payer(
  6514. &[ix],
  6515. Some(&mint_keypair.pubkey()),
  6516. &[&mint_keypair, &created_account_keypair],
  6517. bank.last_blockhash(),
  6518. );
  6519. let expected_error = if formalize_loaded_transaction_data_size {
  6520. TransactionError::InvalidProgramForExecution
  6521. } else {
  6522. TransactionError::InstructionError(0, InstructionError::UnsupportedProgramId)
  6523. };
  6524. assert_eq!(bank.process_transaction(&tx), Err(expected_error),);
  6525. }
  6526. #[test]
  6527. fn test_debug_bank() {
  6528. let (genesis_config, _mint_keypair) = create_genesis_config(50000);
  6529. let mut bank = Bank::new_for_tests(&genesis_config);
  6530. bank.finish_init(&genesis_config, None, false);
  6531. let debug = format!("{bank:#?}");
  6532. assert!(!debug.is_empty());
  6533. }
  6534. #[derive(Debug)]
  6535. enum AcceptableScanResults {
  6536. DroppedSlotError,
  6537. NoFailure,
  6538. Both,
  6539. }
  6540. fn test_store_scan_consistency<F>(
  6541. update_f: F,
  6542. drop_callback: Option<Box<dyn DropCallback + Send + Sync>>,
  6543. acceptable_scan_results: AcceptableScanResults,
  6544. ) where
  6545. F: Fn(
  6546. Arc<Bank>,
  6547. crossbeam_channel::Sender<Arc<Bank>>,
  6548. crossbeam_channel::Receiver<BankId>,
  6549. Arc<HashSet<Pubkey>>,
  6550. Pubkey,
  6551. u64,
  6552. ) + std::marker::Send
  6553. + 'static,
  6554. {
  6555. solana_logger::setup();
  6556. // Set up initial bank
  6557. let mut genesis_config =
  6558. create_genesis_config_with_leader(10, &solana_pubkey::new_rand(), 374_999_998_287_840)
  6559. .genesis_config;
  6560. genesis_config.rent = Rent::free();
  6561. let bank0 = Arc::new(Bank::new_with_config_for_tests(
  6562. &genesis_config,
  6563. BankTestConfig::default(),
  6564. ));
  6565. bank0.set_callback(drop_callback);
  6566. // Set up pubkeys to write to
  6567. let total_pubkeys = ITER_BATCH_SIZE * 10;
  6568. let total_pubkeys_to_modify = 10;
  6569. let all_pubkeys: Vec<Pubkey> = std::iter::repeat_with(solana_pubkey::new_rand)
  6570. .take(total_pubkeys)
  6571. .collect();
  6572. let program_id = system_program::id();
  6573. let starting_lamports = 1;
  6574. let starting_account = AccountSharedData::new(starting_lamports, 0, &program_id);
  6575. // Write accounts to the store
  6576. for key in &all_pubkeys {
  6577. bank0.store_account(key, &starting_account);
  6578. }
  6579. // Set aside a subset of accounts to modify
  6580. let pubkeys_to_modify: Arc<HashSet<Pubkey>> = Arc::new(
  6581. all_pubkeys
  6582. .into_iter()
  6583. .take(total_pubkeys_to_modify)
  6584. .collect(),
  6585. );
  6586. let exit = Arc::new(AtomicBool::new(false));
  6587. // Thread that runs scan and constantly checks for
  6588. // consistency
  6589. let pubkeys_to_modify_ = pubkeys_to_modify.clone();
  6590. // Channel over which the bank to scan is sent
  6591. let (bank_to_scan_sender, bank_to_scan_receiver): (
  6592. crossbeam_channel::Sender<Arc<Bank>>,
  6593. crossbeam_channel::Receiver<Arc<Bank>>,
  6594. ) = bounded(1);
  6595. let (scan_finished_sender, scan_finished_receiver): (
  6596. crossbeam_channel::Sender<BankId>,
  6597. crossbeam_channel::Receiver<BankId>,
  6598. ) = unbounded();
  6599. let num_banks_scanned = Arc::new(AtomicU64::new(0));
  6600. let scan_thread = {
  6601. let exit = exit.clone();
  6602. let num_banks_scanned = num_banks_scanned.clone();
  6603. Builder::new()
  6604. .name("scan".to_string())
  6605. .spawn(move || {
  6606. loop {
  6607. info!("starting scan iteration");
  6608. if exit.load(Relaxed) {
  6609. info!("scan exiting");
  6610. return;
  6611. }
  6612. if let Ok(bank_to_scan) =
  6613. bank_to_scan_receiver.recv_timeout(Duration::from_millis(10))
  6614. {
  6615. info!("scanning program accounts for slot {}", bank_to_scan.slot());
  6616. let accounts_result =
  6617. bank_to_scan.get_program_accounts(&program_id, &ScanConfig::default());
  6618. let _ = scan_finished_sender.send(bank_to_scan.bank_id());
  6619. num_banks_scanned.fetch_add(1, Relaxed);
  6620. match (&acceptable_scan_results, accounts_result.is_err()) {
  6621. (AcceptableScanResults::DroppedSlotError, _)
  6622. | (AcceptableScanResults::Both, true) => {
  6623. assert_eq!(
  6624. accounts_result,
  6625. Err(ScanError::SlotRemoved {
  6626. slot: bank_to_scan.slot(),
  6627. bank_id: bank_to_scan.bank_id()
  6628. })
  6629. );
  6630. }
  6631. (AcceptableScanResults::NoFailure, _)
  6632. | (AcceptableScanResults::Both, false) => {
  6633. assert!(accounts_result.is_ok())
  6634. }
  6635. }
  6636. // Should never see empty accounts because no slot ever deleted
  6637. // any of the original accounts, and the scan should reflect the
  6638. // account state at some frozen slot `X` (no partial updates).
  6639. if let Ok(accounts) = accounts_result {
  6640. assert!(!accounts.is_empty());
  6641. let mut expected_lamports = None;
  6642. let mut target_accounts_found = HashSet::new();
  6643. for (pubkey, account) in accounts {
  6644. let account_balance = account.lamports();
  6645. if pubkeys_to_modify_.contains(&pubkey) {
  6646. target_accounts_found.insert(pubkey);
  6647. if let Some(expected_lamports) = expected_lamports {
  6648. assert_eq!(account_balance, expected_lamports);
  6649. } else {
  6650. // All pubkeys in the specified set should have the same balance
  6651. expected_lamports = Some(account_balance);
  6652. }
  6653. }
  6654. }
  6655. // Should've found all the accounts, i.e. no partial cleans should
  6656. // be detected
  6657. assert_eq!(target_accounts_found.len(), total_pubkeys_to_modify);
  6658. }
  6659. }
  6660. }
  6661. })
  6662. .unwrap()
  6663. };
  6664. // Thread that constantly updates the accounts, sets
  6665. // roots, and cleans
  6666. let update_thread = Builder::new()
  6667. .name("update".to_string())
  6668. .spawn(move || {
  6669. update_f(
  6670. bank0,
  6671. bank_to_scan_sender,
  6672. scan_finished_receiver,
  6673. pubkeys_to_modify,
  6674. program_id,
  6675. starting_lamports,
  6676. );
  6677. })
  6678. .unwrap();
  6679. // Let threads run for a while, check the scans didn't see any mixed slots
  6680. let min_expected_number_of_scans = 5;
  6681. std::thread::sleep(Duration::new(5, 0));
  6682. // This can be reduced when you are running this test locally to deal with hangs
  6683. // But, if it is too low, the ci fails intermittently.
  6684. let mut remaining_loops = 2000;
  6685. loop {
  6686. if num_banks_scanned.load(Relaxed) > min_expected_number_of_scans {
  6687. break;
  6688. } else {
  6689. std::thread::sleep(Duration::from_millis(100));
  6690. }
  6691. remaining_loops -= 1;
  6692. if remaining_loops == 0 {
  6693. break; // just quit and try to get the thread result (panic, etc.)
  6694. }
  6695. }
  6696. exit.store(true, Relaxed);
  6697. scan_thread.join().unwrap();
  6698. update_thread.join().unwrap();
  6699. assert!(remaining_loops > 0, "test timed out");
  6700. }
  6701. #[test]
  6702. fn test_store_scan_consistency_unrooted() {
  6703. let (pruned_banks_sender, pruned_banks_receiver) = unbounded();
  6704. let pruned_banks_request_handler = PrunedBanksRequestHandler {
  6705. pruned_banks_receiver,
  6706. };
  6707. test_store_scan_consistency(
  6708. move |bank0,
  6709. bank_to_scan_sender,
  6710. _scan_finished_receiver,
  6711. pubkeys_to_modify,
  6712. program_id,
  6713. starting_lamports| {
  6714. let mut current_major_fork_bank = bank0;
  6715. loop {
  6716. let mut current_minor_fork_bank = current_major_fork_bank.clone();
  6717. let num_new_banks = 2;
  6718. let lamports = current_minor_fork_bank.slot() + starting_lamports + 1;
  6719. // Modify banks on the two banks on the minor fork
  6720. for pubkeys_to_modify in &pubkeys_to_modify
  6721. .iter()
  6722. .chunks(pubkeys_to_modify.len() / num_new_banks)
  6723. {
  6724. let slot = current_minor_fork_bank.slot() + 2;
  6725. current_minor_fork_bank = Arc::new(Bank::new_from_parent(
  6726. current_minor_fork_bank,
  6727. &solana_pubkey::new_rand(),
  6728. slot,
  6729. ));
  6730. let account = AccountSharedData::new(lamports, 0, &program_id);
  6731. // Write partial updates to each of the banks in the minor fork so if any of them
  6732. // get cleaned up, there will be keys with the wrong account value/missing.
  6733. for key in pubkeys_to_modify {
  6734. current_minor_fork_bank.store_account(key, &account);
  6735. }
  6736. current_minor_fork_bank.freeze();
  6737. }
  6738. // All the parent banks made in this iteration of the loop
  6739. // are currently discoverable, previous parents should have
  6740. // been squashed
  6741. assert_eq!(
  6742. current_minor_fork_bank.clone().parents_inclusive().len(),
  6743. num_new_banks + 1,
  6744. );
  6745. // `next_major_bank` needs to be sandwiched between the minor fork banks
  6746. // That way, after the squash(), the minor fork has the potential to see a
  6747. // *partial* clean of the banks < `next_major_bank`.
  6748. current_major_fork_bank = Arc::new(Bank::new_from_parent(
  6749. current_major_fork_bank,
  6750. &solana_pubkey::new_rand(),
  6751. current_minor_fork_bank.slot() - 1,
  6752. ));
  6753. let lamports = current_major_fork_bank.slot() + starting_lamports + 1;
  6754. let account = AccountSharedData::new(lamports, 0, &program_id);
  6755. for key in pubkeys_to_modify.iter() {
  6756. // Store rooted updates to these pubkeys such that the minor
  6757. // fork updates to the same keys will be deleted by clean
  6758. current_major_fork_bank.store_account(key, &account);
  6759. }
  6760. // Send the last new bank to the scan thread to perform the scan.
  6761. // Meanwhile this thread will continually set roots on a separate fork
  6762. // and squash/clean, purging the account entries from the minor forks
  6763. /*
  6764. bank 0
  6765. / \
  6766. minor bank 1 \
  6767. / current_major_fork_bank
  6768. minor bank 2
  6769. */
  6770. // The capacity of the channel is 1 so that this thread will wait for the scan to finish before starting
  6771. // the next iteration, allowing the scan to stay in sync with these updates
  6772. // such that every scan will see this interruption.
  6773. if bank_to_scan_sender.send(current_minor_fork_bank).is_err() {
  6774. // Channel was disconnected, exit
  6775. return;
  6776. }
  6777. current_major_fork_bank.freeze();
  6778. current_major_fork_bank.squash();
  6779. // Try to get cache flush/clean to overlap with the scan
  6780. current_major_fork_bank.force_flush_accounts_cache();
  6781. current_major_fork_bank.clean_accounts_for_tests();
  6782. // Move purge here so that Bank::drop()->purge_slots() doesn't race
  6783. // with clean. Simulates the call from AccountsBackgroundService
  6784. pruned_banks_request_handler.handle_request(&current_major_fork_bank);
  6785. }
  6786. },
  6787. Some(Box::new(SendDroppedBankCallback::new(pruned_banks_sender))),
  6788. AcceptableScanResults::NoFailure,
  6789. )
  6790. }
  6791. #[test]
  6792. fn test_store_scan_consistency_root() {
  6793. test_store_scan_consistency(
  6794. |bank0,
  6795. bank_to_scan_sender,
  6796. _scan_finished_receiver,
  6797. pubkeys_to_modify,
  6798. program_id,
  6799. starting_lamports| {
  6800. let mut current_bank = bank0.clone();
  6801. let mut prev_bank = bank0;
  6802. loop {
  6803. let lamports_this_round = current_bank.slot() + starting_lamports + 1;
  6804. let account = AccountSharedData::new(lamports_this_round, 0, &program_id);
  6805. for key in pubkeys_to_modify.iter() {
  6806. current_bank.store_account(key, &account);
  6807. }
  6808. current_bank.freeze();
  6809. // Send the previous bank to the scan thread to perform the scan.
  6810. // Meanwhile this thread will squash and update roots immediately after
  6811. // so the roots will update while scanning.
  6812. //
  6813. // The capacity of the channel is 1 so that this thread will wait for the scan to finish before starting
  6814. // the next iteration, allowing the scan to stay in sync with these updates
  6815. // such that every scan will see this interruption.
  6816. if bank_to_scan_sender.send(prev_bank).is_err() {
  6817. // Channel was disconnected, exit
  6818. return;
  6819. }
  6820. current_bank.squash();
  6821. if current_bank.slot() % 2 == 0 {
  6822. current_bank.force_flush_accounts_cache();
  6823. current_bank.clean_accounts();
  6824. }
  6825. prev_bank = current_bank.clone();
  6826. let slot = current_bank.slot() + 1;
  6827. current_bank = Arc::new(Bank::new_from_parent(
  6828. current_bank,
  6829. &solana_pubkey::new_rand(),
  6830. slot,
  6831. ));
  6832. }
  6833. },
  6834. None,
  6835. AcceptableScanResults::NoFailure,
  6836. );
  6837. }
  6838. fn setup_banks_on_fork_to_remove(
  6839. bank0: Arc<Bank>,
  6840. pubkeys_to_modify: Arc<HashSet<Pubkey>>,
  6841. program_id: &Pubkey,
  6842. starting_lamports: u64,
  6843. num_banks_on_fork: usize,
  6844. step_size: usize,
  6845. ) -> (Arc<Bank>, Vec<(Slot, BankId)>, Ancestors) {
  6846. // Need at least 2 keys to create inconsistency in account balances when deleting
  6847. // slots
  6848. assert!(pubkeys_to_modify.len() > 1);
  6849. // Tracks the bank at the tip of the to be created fork
  6850. let mut bank_at_fork_tip = bank0;
  6851. // All the slots on the fork except slot 0
  6852. let mut slots_on_fork = Vec::with_capacity(num_banks_on_fork);
  6853. // All accounts in each set of `step_size` slots will have the same account balances.
  6854. // The account balances of the accounts changes every `step_size` banks. Thus if you
  6855. // delete any one of the latest `step_size` slots, then you will see varying account
  6856. // balances when loading the accounts.
  6857. assert!(num_banks_on_fork >= 2);
  6858. assert!(step_size >= 2);
  6859. let pubkeys_to_modify: Vec<Pubkey> = pubkeys_to_modify.iter().cloned().collect();
  6860. let pubkeys_to_modify_per_slot = (pubkeys_to_modify.len() / step_size).max(1);
  6861. for _ in (0..num_banks_on_fork).step_by(step_size) {
  6862. let mut lamports_this_round = 0;
  6863. for i in 0..step_size {
  6864. let slot = bank_at_fork_tip.slot() + 1;
  6865. bank_at_fork_tip = Arc::new(Bank::new_from_parent(
  6866. bank_at_fork_tip,
  6867. &solana_pubkey::new_rand(),
  6868. slot,
  6869. ));
  6870. if lamports_this_round == 0 {
  6871. lamports_this_round = bank_at_fork_tip.bank_id() + starting_lamports + 1;
  6872. }
  6873. let pubkey_to_modify_starting_index = i * pubkeys_to_modify_per_slot;
  6874. let account = AccountSharedData::new(lamports_this_round, 0, program_id);
  6875. for pubkey_index_to_modify in pubkey_to_modify_starting_index
  6876. ..pubkey_to_modify_starting_index + pubkeys_to_modify_per_slot
  6877. {
  6878. let key = pubkeys_to_modify[pubkey_index_to_modify % pubkeys_to_modify.len()];
  6879. bank_at_fork_tip.store_account(&key, &account);
  6880. }
  6881. bank_at_fork_tip.freeze();
  6882. slots_on_fork.push((bank_at_fork_tip.slot(), bank_at_fork_tip.bank_id()));
  6883. }
  6884. }
  6885. let ancestors: Vec<(Slot, usize)> = slots_on_fork.iter().map(|(s, _)| (*s, 0)).collect();
  6886. let ancestors = Ancestors::from(ancestors);
  6887. (bank_at_fork_tip, slots_on_fork, ancestors)
  6888. }
  6889. #[test]
  6890. fn test_remove_unrooted_before_scan() {
  6891. test_store_scan_consistency(
  6892. |bank0,
  6893. bank_to_scan_sender,
  6894. scan_finished_receiver,
  6895. pubkeys_to_modify,
  6896. program_id,
  6897. starting_lamports| {
  6898. loop {
  6899. let (bank_at_fork_tip, slots_on_fork, ancestors) = setup_banks_on_fork_to_remove(
  6900. bank0.clone(),
  6901. pubkeys_to_modify.clone(),
  6902. &program_id,
  6903. starting_lamports,
  6904. 10,
  6905. 2,
  6906. );
  6907. // Test removing the slot before the scan starts, should cause
  6908. // SlotRemoved error every time
  6909. for k in pubkeys_to_modify.iter() {
  6910. assert!(bank_at_fork_tip.load_slow(&ancestors, k).is_some());
  6911. }
  6912. bank_at_fork_tip.remove_unrooted_slots(&slots_on_fork);
  6913. // Accounts on this fork should not be found after removal
  6914. for k in pubkeys_to_modify.iter() {
  6915. assert!(bank_at_fork_tip.load_slow(&ancestors, k).is_none());
  6916. }
  6917. if bank_to_scan_sender.send(bank_at_fork_tip.clone()).is_err() {
  6918. return;
  6919. }
  6920. // Wait for scan to finish before starting next iteration
  6921. let finished_scan_bank_id = scan_finished_receiver.recv();
  6922. if finished_scan_bank_id.is_err() {
  6923. return;
  6924. }
  6925. assert_eq!(finished_scan_bank_id.unwrap(), bank_at_fork_tip.bank_id());
  6926. }
  6927. },
  6928. None,
  6929. // Test removing the slot before the scan starts, should error every time
  6930. AcceptableScanResults::DroppedSlotError,
  6931. );
  6932. }
  6933. #[test]
  6934. fn test_remove_unrooted_scan_then_recreate_same_slot_before_scan() {
  6935. test_store_scan_consistency(
  6936. |bank0,
  6937. bank_to_scan_sender,
  6938. scan_finished_receiver,
  6939. pubkeys_to_modify,
  6940. program_id,
  6941. starting_lamports| {
  6942. let mut prev_bank = bank0.clone();
  6943. loop {
  6944. let start = Instant::now();
  6945. let (bank_at_fork_tip, slots_on_fork, ancestors) = setup_banks_on_fork_to_remove(
  6946. bank0.clone(),
  6947. pubkeys_to_modify.clone(),
  6948. &program_id,
  6949. starting_lamports,
  6950. 10,
  6951. 2,
  6952. );
  6953. info!("setting up banks elapsed: {}", start.elapsed().as_millis());
  6954. // Remove the fork. Then we'll recreate the slots and only after we've
  6955. // recreated the slots, do we send this old bank for scanning.
  6956. // Skip scanning bank 0 on first iteration of loop, since those accounts
  6957. // aren't being removed
  6958. if prev_bank.slot() != 0 {
  6959. info!(
  6960. "sending bank with slot: {:?}, elapsed: {}",
  6961. prev_bank.slot(),
  6962. start.elapsed().as_millis()
  6963. );
  6964. // Although we dumped the slots last iteration via `remove_unrooted_slots()`,
  6965. // we've recreated those slots this iteration, so they should be findable
  6966. // again
  6967. for k in pubkeys_to_modify.iter() {
  6968. assert!(bank_at_fork_tip.load_slow(&ancestors, k).is_some());
  6969. }
  6970. // Now after we've recreated the slots removed in the previous loop
  6971. // iteration, send the previous bank, should fail even though the
  6972. // same slots were recreated
  6973. if bank_to_scan_sender.send(prev_bank.clone()).is_err() {
  6974. return;
  6975. }
  6976. let finished_scan_bank_id = scan_finished_receiver.recv();
  6977. if finished_scan_bank_id.is_err() {
  6978. return;
  6979. }
  6980. // Wait for scan to finish before starting next iteration
  6981. assert_eq!(finished_scan_bank_id.unwrap(), prev_bank.bank_id());
  6982. }
  6983. bank_at_fork_tip.remove_unrooted_slots(&slots_on_fork);
  6984. prev_bank = bank_at_fork_tip;
  6985. }
  6986. },
  6987. None,
  6988. // Test removing the slot before the scan starts, should error every time
  6989. AcceptableScanResults::DroppedSlotError,
  6990. );
  6991. }
  6992. #[test]
  6993. fn test_remove_unrooted_scan_interleaved_with_remove_unrooted_slots() {
  6994. test_store_scan_consistency(
  6995. |bank0,
  6996. bank_to_scan_sender,
  6997. scan_finished_receiver,
  6998. pubkeys_to_modify,
  6999. program_id,
  7000. starting_lamports| {
  7001. loop {
  7002. let step_size = 2;
  7003. let (bank_at_fork_tip, slots_on_fork, ancestors) = setup_banks_on_fork_to_remove(
  7004. bank0.clone(),
  7005. pubkeys_to_modify.clone(),
  7006. &program_id,
  7007. starting_lamports,
  7008. 10,
  7009. step_size,
  7010. );
  7011. // Although we dumped the slots last iteration via `remove_unrooted_slots()`,
  7012. // we've recreated those slots this iteration, so they should be findable
  7013. // again
  7014. for k in pubkeys_to_modify.iter() {
  7015. assert!(bank_at_fork_tip.load_slow(&ancestors, k).is_some());
  7016. }
  7017. // Now after we've recreated the slots removed in the previous loop
  7018. // iteration, send the previous bank, should fail even though the
  7019. // same slots were recreated
  7020. if bank_to_scan_sender.send(bank_at_fork_tip.clone()).is_err() {
  7021. return;
  7022. }
  7023. // Remove 1 < `step_size` of the *latest* slots while the scan is happening.
  7024. // This should create inconsistency between the account balances of accounts
  7025. // stored in that slot, and the accounts stored in earlier slots
  7026. let slot_to_remove = *slots_on_fork.last().unwrap();
  7027. bank_at_fork_tip.remove_unrooted_slots(&[slot_to_remove]);
  7028. // Wait for scan to finish before starting next iteration
  7029. let finished_scan_bank_id = scan_finished_receiver.recv();
  7030. if finished_scan_bank_id.is_err() {
  7031. return;
  7032. }
  7033. assert_eq!(finished_scan_bank_id.unwrap(), bank_at_fork_tip.bank_id());
  7034. // Remove the rest of the slots before the next iteration
  7035. for (slot, bank_id) in slots_on_fork {
  7036. bank_at_fork_tip.remove_unrooted_slots(&[(slot, bank_id)]);
  7037. }
  7038. }
  7039. },
  7040. None,
  7041. // Test removing the slot before the scan starts, should error every time
  7042. AcceptableScanResults::Both,
  7043. );
  7044. }
  7045. #[test]
  7046. fn test_get_inflation_start_slot_devnet_testnet() {
  7047. let GenesisConfigInfo {
  7048. mut genesis_config, ..
  7049. } = create_genesis_config_with_leader(42, &solana_pubkey::new_rand(), 42);
  7050. genesis_config
  7051. .accounts
  7052. .remove(&feature_set::pico_inflation::id())
  7053. .unwrap();
  7054. genesis_config
  7055. .accounts
  7056. .remove(&feature_set::full_inflation::devnet_and_testnet::id())
  7057. .unwrap();
  7058. for pair in feature_set::FULL_INFLATION_FEATURE_PAIRS.iter() {
  7059. genesis_config.accounts.remove(&pair.vote_id).unwrap();
  7060. genesis_config.accounts.remove(&pair.enable_id).unwrap();
  7061. }
  7062. let bank = Bank::new_for_tests(&genesis_config);
  7063. // Advance slot
  7064. let mut bank = new_from_parent(Arc::new(bank));
  7065. bank = new_from_parent(Arc::new(bank));
  7066. assert_eq!(bank.get_inflation_start_slot(), 0);
  7067. assert_eq!(bank.slot(), 2);
  7068. // Request `pico_inflation` activation
  7069. bank.store_account(
  7070. &feature_set::pico_inflation::id(),
  7071. &feature::create_account(
  7072. &Feature {
  7073. activated_at: Some(1),
  7074. },
  7075. 42,
  7076. ),
  7077. );
  7078. bank.feature_set = Arc::new(bank.compute_active_feature_set(true).0);
  7079. assert_eq!(bank.get_inflation_start_slot(), 1);
  7080. // Advance slot
  7081. bank = new_from_parent(Arc::new(bank));
  7082. assert_eq!(bank.slot(), 3);
  7083. // Request `full_inflation::devnet_and_testnet` activation,
  7084. // which takes priority over pico_inflation
  7085. bank.store_account(
  7086. &feature_set::full_inflation::devnet_and_testnet::id(),
  7087. &feature::create_account(
  7088. &Feature {
  7089. activated_at: Some(2),
  7090. },
  7091. 42,
  7092. ),
  7093. );
  7094. bank.feature_set = Arc::new(bank.compute_active_feature_set(true).0);
  7095. assert_eq!(bank.get_inflation_start_slot(), 2);
  7096. // Request `full_inflation::mainnet::certusone` activation,
  7097. // which should have no effect on `get_inflation_start_slot`
  7098. bank.store_account(
  7099. &feature_set::full_inflation::mainnet::certusone::vote::id(),
  7100. &feature::create_account(
  7101. &Feature {
  7102. activated_at: Some(3),
  7103. },
  7104. 42,
  7105. ),
  7106. );
  7107. bank.store_account(
  7108. &feature_set::full_inflation::mainnet::certusone::enable::id(),
  7109. &feature::create_account(
  7110. &Feature {
  7111. activated_at: Some(3),
  7112. },
  7113. 42,
  7114. ),
  7115. );
  7116. bank.feature_set = Arc::new(bank.compute_active_feature_set(true).0);
  7117. assert_eq!(bank.get_inflation_start_slot(), 2);
  7118. }
  7119. #[test]
  7120. fn test_get_inflation_start_slot_mainnet() {
  7121. let GenesisConfigInfo {
  7122. mut genesis_config, ..
  7123. } = create_genesis_config_with_leader(42, &solana_pubkey::new_rand(), 42);
  7124. genesis_config
  7125. .accounts
  7126. .remove(&feature_set::pico_inflation::id())
  7127. .unwrap();
  7128. genesis_config
  7129. .accounts
  7130. .remove(&feature_set::full_inflation::devnet_and_testnet::id())
  7131. .unwrap();
  7132. for pair in feature_set::FULL_INFLATION_FEATURE_PAIRS.iter() {
  7133. genesis_config.accounts.remove(&pair.vote_id).unwrap();
  7134. genesis_config.accounts.remove(&pair.enable_id).unwrap();
  7135. }
  7136. let bank = Bank::new_for_tests(&genesis_config);
  7137. // Advance slot
  7138. let mut bank = new_from_parent(Arc::new(bank));
  7139. bank = new_from_parent(Arc::new(bank));
  7140. assert_eq!(bank.get_inflation_start_slot(), 0);
  7141. assert_eq!(bank.slot(), 2);
  7142. // Request `pico_inflation` activation
  7143. bank.store_account(
  7144. &feature_set::pico_inflation::id(),
  7145. &feature::create_account(
  7146. &Feature {
  7147. activated_at: Some(1),
  7148. },
  7149. 42,
  7150. ),
  7151. );
  7152. bank.feature_set = Arc::new(bank.compute_active_feature_set(true).0);
  7153. assert_eq!(bank.get_inflation_start_slot(), 1);
  7154. // Advance slot
  7155. bank = new_from_parent(Arc::new(bank));
  7156. assert_eq!(bank.slot(), 3);
  7157. // Request `full_inflation::mainnet::certusone` activation,
  7158. // which takes priority over pico_inflation
  7159. bank.store_account(
  7160. &feature_set::full_inflation::mainnet::certusone::vote::id(),
  7161. &feature::create_account(
  7162. &Feature {
  7163. activated_at: Some(2),
  7164. },
  7165. 42,
  7166. ),
  7167. );
  7168. bank.store_account(
  7169. &feature_set::full_inflation::mainnet::certusone::enable::id(),
  7170. &feature::create_account(
  7171. &Feature {
  7172. activated_at: Some(2),
  7173. },
  7174. 42,
  7175. ),
  7176. );
  7177. bank.feature_set = Arc::new(bank.compute_active_feature_set(true).0);
  7178. assert_eq!(bank.get_inflation_start_slot(), 2);
  7179. // Advance slot
  7180. bank = new_from_parent(Arc::new(bank));
  7181. assert_eq!(bank.slot(), 4);
  7182. // Request `full_inflation::devnet_and_testnet` activation,
  7183. // which should have no effect on `get_inflation_start_slot`
  7184. bank.store_account(
  7185. &feature_set::full_inflation::devnet_and_testnet::id(),
  7186. &feature::create_account(
  7187. &Feature {
  7188. activated_at: Some(bank.slot()),
  7189. },
  7190. 42,
  7191. ),
  7192. );
  7193. bank.feature_set = Arc::new(bank.compute_active_feature_set(true).0);
  7194. assert_eq!(bank.get_inflation_start_slot(), 2);
  7195. }
  7196. #[test]
  7197. fn test_get_inflation_num_slots_with_activations() {
  7198. let GenesisConfigInfo {
  7199. mut genesis_config, ..
  7200. } = create_genesis_config_with_leader(42, &solana_pubkey::new_rand(), 42);
  7201. let slots_per_epoch = 32;
  7202. genesis_config.epoch_schedule = EpochSchedule::new(slots_per_epoch);
  7203. genesis_config
  7204. .accounts
  7205. .remove(&feature_set::pico_inflation::id())
  7206. .unwrap();
  7207. genesis_config
  7208. .accounts
  7209. .remove(&feature_set::full_inflation::devnet_and_testnet::id())
  7210. .unwrap();
  7211. for pair in feature_set::FULL_INFLATION_FEATURE_PAIRS.iter() {
  7212. genesis_config.accounts.remove(&pair.vote_id).unwrap();
  7213. genesis_config.accounts.remove(&pair.enable_id).unwrap();
  7214. }
  7215. let mut bank = Bank::new_for_tests(&genesis_config);
  7216. assert_eq!(bank.get_inflation_num_slots(), 0);
  7217. for _ in 0..2 * slots_per_epoch {
  7218. bank = new_from_parent(Arc::new(bank));
  7219. }
  7220. assert_eq!(bank.get_inflation_num_slots(), 2 * slots_per_epoch);
  7221. // Activate pico_inflation
  7222. let pico_inflation_activation_slot = bank.slot();
  7223. bank.store_account(
  7224. &feature_set::pico_inflation::id(),
  7225. &feature::create_account(
  7226. &Feature {
  7227. activated_at: Some(pico_inflation_activation_slot),
  7228. },
  7229. 42,
  7230. ),
  7231. );
  7232. bank.feature_set = Arc::new(bank.compute_active_feature_set(true).0);
  7233. assert_eq!(bank.get_inflation_num_slots(), slots_per_epoch);
  7234. for _ in 0..slots_per_epoch {
  7235. bank = new_from_parent(Arc::new(bank));
  7236. }
  7237. assert_eq!(bank.get_inflation_num_slots(), 2 * slots_per_epoch);
  7238. // Activate full_inflation::devnet_and_testnet
  7239. let full_inflation_activation_slot = bank.slot();
  7240. bank.store_account(
  7241. &feature_set::full_inflation::devnet_and_testnet::id(),
  7242. &feature::create_account(
  7243. &Feature {
  7244. activated_at: Some(full_inflation_activation_slot),
  7245. },
  7246. 42,
  7247. ),
  7248. );
  7249. bank.feature_set = Arc::new(bank.compute_active_feature_set(true).0);
  7250. assert_eq!(bank.get_inflation_num_slots(), slots_per_epoch);
  7251. for _ in 0..slots_per_epoch {
  7252. bank = new_from_parent(Arc::new(bank));
  7253. }
  7254. assert_eq!(bank.get_inflation_num_slots(), 2 * slots_per_epoch);
  7255. }
  7256. #[test]
  7257. fn test_get_inflation_num_slots_already_activated() {
  7258. let GenesisConfigInfo {
  7259. mut genesis_config, ..
  7260. } = create_genesis_config_with_leader(42, &solana_pubkey::new_rand(), 42);
  7261. let slots_per_epoch = 32;
  7262. genesis_config.epoch_schedule = EpochSchedule::new(slots_per_epoch);
  7263. let mut bank = Bank::new_for_tests(&genesis_config);
  7264. assert_eq!(bank.get_inflation_num_slots(), 0);
  7265. for _ in 0..slots_per_epoch {
  7266. bank = new_from_parent(Arc::new(bank));
  7267. }
  7268. assert_eq!(bank.get_inflation_num_slots(), slots_per_epoch);
  7269. for _ in 0..slots_per_epoch {
  7270. bank = new_from_parent(Arc::new(bank));
  7271. }
  7272. assert_eq!(bank.get_inflation_num_slots(), 2 * slots_per_epoch);
  7273. }
  7274. #[test]
  7275. fn test_stake_vote_account_validity() {
  7276. let thread_pool = ThreadPoolBuilder::new().num_threads(1).build().unwrap();
  7277. // TODO: stakes cache should be hardened for the case when the account
  7278. // owner is changed from vote/stake program to something else. see:
  7279. // https://github.com/solana-labs/solana/pull/24200#discussion_r849935444
  7280. check_stake_vote_account_validity(
  7281. false, // check owner change
  7282. |bank: &Bank| bank._load_vote_and_stake_accounts(&thread_pool, null_tracer()),
  7283. );
  7284. }
  7285. #[test]
  7286. fn test_epoch_schedule_from_genesis_config() {
  7287. let validator_vote_keypairs0 = ValidatorVoteKeypairs::new_rand();
  7288. let validator_vote_keypairs1 = ValidatorVoteKeypairs::new_rand();
  7289. let validator_keypairs = vec![&validator_vote_keypairs0, &validator_vote_keypairs1];
  7290. let GenesisConfigInfo {
  7291. mut genesis_config, ..
  7292. } = create_genesis_config_with_vote_accounts(
  7293. 1_000_000_000,
  7294. &validator_keypairs,
  7295. vec![LAMPORTS_PER_SOL; 2],
  7296. );
  7297. genesis_config.epoch_schedule = EpochSchedule::custom(8192, 100, true);
  7298. let bank = Arc::new(Bank::new_with_paths(
  7299. &genesis_config,
  7300. Arc::<RuntimeConfig>::default(),
  7301. Vec::new(),
  7302. None,
  7303. None,
  7304. false,
  7305. Some(ACCOUNTS_DB_CONFIG_FOR_TESTING),
  7306. None,
  7307. None,
  7308. Arc::default(),
  7309. None,
  7310. None,
  7311. ));
  7312. assert_eq!(bank.epoch_schedule(), &genesis_config.epoch_schedule);
  7313. }
  7314. fn check_stake_vote_account_validity<F>(check_owner_change: bool, load_vote_and_stake_accounts: F)
  7315. where
  7316. F: Fn(&Bank) -> StakeDelegationsMap,
  7317. {
  7318. let validator_vote_keypairs0 = ValidatorVoteKeypairs::new_rand();
  7319. let validator_vote_keypairs1 = ValidatorVoteKeypairs::new_rand();
  7320. let validator_keypairs = vec![&validator_vote_keypairs0, &validator_vote_keypairs1];
  7321. let GenesisConfigInfo { genesis_config, .. } = create_genesis_config_with_vote_accounts(
  7322. 1_000_000_000,
  7323. &validator_keypairs,
  7324. vec![LAMPORTS_PER_SOL; 2],
  7325. );
  7326. let bank = Arc::new(Bank::new_with_paths(
  7327. &genesis_config,
  7328. Arc::<RuntimeConfig>::default(),
  7329. Vec::new(),
  7330. None,
  7331. None,
  7332. false,
  7333. Some(ACCOUNTS_DB_CONFIG_FOR_TESTING),
  7334. None,
  7335. None,
  7336. Arc::default(),
  7337. None,
  7338. None,
  7339. ));
  7340. let vote_and_stake_accounts = load_vote_and_stake_accounts(&bank);
  7341. assert_eq!(vote_and_stake_accounts.len(), 2);
  7342. let mut vote_account = bank
  7343. .get_account(&validator_vote_keypairs0.vote_keypair.pubkey())
  7344. .unwrap_or_default();
  7345. let original_lamports = vote_account.lamports();
  7346. vote_account.set_lamports(0);
  7347. // Simulate vote account removal via full withdrawal
  7348. bank.store_account(
  7349. &validator_vote_keypairs0.vote_keypair.pubkey(),
  7350. &vote_account,
  7351. );
  7352. // Modify staked vote account owner; a vote account owned by another program could be
  7353. // freely modified with malicious data
  7354. let bogus_vote_program = Pubkey::new_unique();
  7355. vote_account.set_lamports(original_lamports);
  7356. vote_account.set_owner(bogus_vote_program);
  7357. bank.store_account(
  7358. &validator_vote_keypairs0.vote_keypair.pubkey(),
  7359. &vote_account,
  7360. );
  7361. assert_eq!(bank.vote_accounts().len(), 1);
  7362. // Modify stake account owner; a stake account owned by another program could be freely
  7363. // modified with malicious data
  7364. let bogus_stake_program = Pubkey::new_unique();
  7365. let mut stake_account = bank
  7366. .get_account(&validator_vote_keypairs1.stake_keypair.pubkey())
  7367. .unwrap_or_default();
  7368. stake_account.set_owner(bogus_stake_program);
  7369. bank.store_account(
  7370. &validator_vote_keypairs1.stake_keypair.pubkey(),
  7371. &stake_account,
  7372. );
  7373. // Accounts must be valid stake and vote accounts
  7374. let vote_and_stake_accounts = load_vote_and_stake_accounts(&bank);
  7375. assert_eq!(
  7376. vote_and_stake_accounts.len(),
  7377. usize::from(!check_owner_change)
  7378. );
  7379. }
  7380. #[test]
  7381. fn test_vote_epoch_panic() {
  7382. let GenesisConfigInfo {
  7383. genesis_config,
  7384. mint_keypair,
  7385. ..
  7386. } = create_genesis_config_with_leader(
  7387. 1_000_000_000_000_000,
  7388. &Pubkey::new_unique(),
  7389. bootstrap_validator_stake_lamports(),
  7390. );
  7391. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  7392. let vote_keypair = keypair_from_seed(&[1u8; 32]).unwrap();
  7393. let mut setup_ixs = Vec::new();
  7394. setup_ixs.extend(vote_instruction::create_account_with_config(
  7395. &mint_keypair.pubkey(),
  7396. &vote_keypair.pubkey(),
  7397. &VoteInit {
  7398. node_pubkey: mint_keypair.pubkey(),
  7399. authorized_voter: vote_keypair.pubkey(),
  7400. authorized_withdrawer: mint_keypair.pubkey(),
  7401. commission: 0,
  7402. },
  7403. 1_000_000_000,
  7404. vote_instruction::CreateVoteAccountConfig {
  7405. space: VoteStateVersions::vote_state_size_of(true) as u64,
  7406. ..vote_instruction::CreateVoteAccountConfig::default()
  7407. },
  7408. ));
  7409. setup_ixs.push(vote_instruction::withdraw(
  7410. &vote_keypair.pubkey(),
  7411. &mint_keypair.pubkey(),
  7412. 1_000_000_000,
  7413. &mint_keypair.pubkey(),
  7414. ));
  7415. setup_ixs.push(system_instruction::transfer(
  7416. &mint_keypair.pubkey(),
  7417. &vote_keypair.pubkey(),
  7418. 1_000_000_000,
  7419. ));
  7420. let result = bank.process_transaction(&Transaction::new(
  7421. &[&mint_keypair, &vote_keypair],
  7422. Message::new(&setup_ixs, Some(&mint_keypair.pubkey())),
  7423. bank.last_blockhash(),
  7424. ));
  7425. assert!(result.is_ok());
  7426. let _bank = new_bank_from_parent_with_bank_forks(
  7427. bank_forks.as_ref(),
  7428. bank,
  7429. &mint_keypair.pubkey(),
  7430. genesis_config.epoch_schedule.get_first_slot_in_epoch(1),
  7431. );
  7432. }
  7433. #[test_case(false; "old")]
  7434. #[test_case(true; "simd83")]
  7435. fn test_tx_log_order(relax_intrabatch_account_locks: bool) {
  7436. let GenesisConfigInfo {
  7437. genesis_config,
  7438. mint_keypair,
  7439. ..
  7440. } = create_genesis_config_with_leader(
  7441. 1_000_000_000_000_000,
  7442. &Pubkey::new_unique(),
  7443. bootstrap_validator_stake_lamports(),
  7444. );
  7445. let mut bank = Bank::new_for_tests(&genesis_config);
  7446. if !relax_intrabatch_account_locks {
  7447. bank.deactivate_feature(&feature_set::relax_intrabatch_account_locks::id());
  7448. }
  7449. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  7450. *bank.transaction_log_collector_config.write().unwrap() = TransactionLogCollectorConfig {
  7451. mentioned_addresses: HashSet::new(),
  7452. filter: TransactionLogCollectorFilter::All,
  7453. };
  7454. let blockhash = bank.last_blockhash();
  7455. let sender0 = Keypair::new();
  7456. let sender1 = Keypair::new();
  7457. bank.transfer(100, &mint_keypair, &sender0.pubkey())
  7458. .unwrap();
  7459. bank.transfer(100, &mint_keypair, &sender1.pubkey())
  7460. .unwrap();
  7461. let recipient0 = Pubkey::new_unique();
  7462. let recipient1 = Pubkey::new_unique();
  7463. let tx0 = system_transaction::transfer(&sender0, &recipient0, 10, blockhash);
  7464. let success_sig = tx0.signatures[0];
  7465. let tx1 = system_transaction::transfer(&sender1, &recipient1, 110, blockhash); // Should produce insufficient funds log
  7466. let failure_sig = tx1.signatures[0];
  7467. let tx2 = system_transaction::transfer(&sender0, &recipient0, 1, blockhash);
  7468. let txs = vec![tx0, tx1, tx2];
  7469. let batch = bank.prepare_batch_for_tests(txs);
  7470. let commit_results = bank
  7471. .load_execute_and_commit_transactions(
  7472. &batch,
  7473. MAX_PROCESSING_AGE,
  7474. ExecutionRecordingConfig {
  7475. enable_cpi_recording: false,
  7476. enable_log_recording: true,
  7477. enable_return_data_recording: false,
  7478. enable_transaction_balance_recording: false,
  7479. },
  7480. &mut ExecuteTimings::default(),
  7481. None,
  7482. )
  7483. .0;
  7484. assert_eq!(commit_results.len(), 3);
  7485. assert!(commit_results[0].is_ok());
  7486. assert!(commit_results[0]
  7487. .as_ref()
  7488. .unwrap()
  7489. .log_messages
  7490. .as_ref()
  7491. .unwrap()[1]
  7492. .contains(&"success".to_string()));
  7493. assert!(commit_results[1].is_ok());
  7494. assert!(commit_results[1]
  7495. .as_ref()
  7496. .unwrap()
  7497. .log_messages
  7498. .as_ref()
  7499. .unwrap()[2]
  7500. .contains(&"failed".to_string()));
  7501. if relax_intrabatch_account_locks {
  7502. assert!(commit_results[2].is_ok());
  7503. } else {
  7504. assert!(commit_results[2].is_err());
  7505. }
  7506. let stored_logs = &bank.transaction_log_collector.read().unwrap().logs;
  7507. let success_log_info = stored_logs
  7508. .iter()
  7509. .find(|transaction_log_info| transaction_log_info.signature == success_sig)
  7510. .unwrap();
  7511. assert!(success_log_info.result.is_ok());
  7512. let success_log = success_log_info.log_messages.clone().pop().unwrap();
  7513. assert!(success_log.contains(&"success".to_string()));
  7514. let failure_log_info = stored_logs
  7515. .iter()
  7516. .find(|transaction_log_info| transaction_log_info.signature == failure_sig)
  7517. .unwrap();
  7518. assert!(failure_log_info.result.is_err());
  7519. let failure_log = failure_log_info.log_messages.clone().pop().unwrap();
  7520. assert!(failure_log.contains(&"failed".to_string()));
  7521. }
  7522. #[test]
  7523. fn test_tx_return_data() {
  7524. solana_logger::setup();
  7525. let GenesisConfigInfo {
  7526. genesis_config,
  7527. mint_keypair,
  7528. ..
  7529. } = create_genesis_config_with_leader(
  7530. 1_000_000_000_000_000,
  7531. &Pubkey::new_unique(),
  7532. bootstrap_validator_stake_lamports(),
  7533. );
  7534. let mock_program_id = Pubkey::from([2u8; 32]);
  7535. let (bank, _bank_forks) =
  7536. Bank::new_with_mockup_builtin_for_tests(&genesis_config, mock_program_id, MockBuiltin::vm);
  7537. declare_process_instruction!(MockBuiltin, 1, |invoke_context| {
  7538. let mock_program_id = Pubkey::from([2u8; 32]);
  7539. let transaction_context = &mut invoke_context.transaction_context;
  7540. let instruction_context = transaction_context.get_current_instruction_context()?;
  7541. let instruction_data = instruction_context.get_instruction_data();
  7542. let mut return_data = [0u8; MAX_RETURN_DATA];
  7543. if !instruction_data.is_empty() {
  7544. let index = usize::from_le_bytes(instruction_data.try_into().unwrap());
  7545. return_data[index / 2] = 1;
  7546. transaction_context
  7547. .set_return_data(mock_program_id, return_data[..index + 1].to_vec())
  7548. .unwrap();
  7549. }
  7550. Ok(())
  7551. });
  7552. let blockhash = bank.last_blockhash();
  7553. for index in [
  7554. None,
  7555. Some(0),
  7556. Some(MAX_RETURN_DATA / 2),
  7557. Some(MAX_RETURN_DATA - 1),
  7558. ] {
  7559. let data = if let Some(index) = index {
  7560. usize::to_le_bytes(index).to_vec()
  7561. } else {
  7562. Vec::new()
  7563. };
  7564. let txs = vec![Transaction::new_signed_with_payer(
  7565. &[Instruction {
  7566. program_id: mock_program_id,
  7567. data,
  7568. accounts: vec![AccountMeta::new(Pubkey::new_unique(), false)],
  7569. }],
  7570. Some(&mint_keypair.pubkey()),
  7571. &[&mint_keypair],
  7572. blockhash,
  7573. )];
  7574. let batch = bank.prepare_batch_for_tests(txs);
  7575. let commit_results = bank
  7576. .load_execute_and_commit_transactions(
  7577. &batch,
  7578. MAX_PROCESSING_AGE,
  7579. ExecutionRecordingConfig {
  7580. enable_cpi_recording: false,
  7581. enable_log_recording: false,
  7582. enable_return_data_recording: true,
  7583. enable_transaction_balance_recording: false,
  7584. },
  7585. &mut ExecuteTimings::default(),
  7586. None,
  7587. )
  7588. .0;
  7589. let return_data = commit_results[0].as_ref().unwrap().return_data.clone();
  7590. if let Some(index) = index {
  7591. let return_data = return_data.unwrap();
  7592. assert_eq!(return_data.program_id, mock_program_id);
  7593. let mut expected_data = vec![0u8; index + 1];
  7594. // include some trailing zeros
  7595. expected_data[index / 2] = 1;
  7596. assert_eq!(return_data.data, expected_data);
  7597. } else {
  7598. assert!(return_data.is_none());
  7599. }
  7600. }
  7601. }
  7602. #[test]
  7603. fn test_get_largest_accounts() {
  7604. let GenesisConfigInfo { genesis_config, .. } =
  7605. create_genesis_config_with_leader(42, &solana_pubkey::new_rand(), 42);
  7606. let bank = Bank::new_for_tests(&genesis_config);
  7607. let pubkeys: Vec<_> = (0..5).map(|_| Pubkey::new_unique()).collect();
  7608. let pubkeys_hashset: HashSet<_> = pubkeys.iter().cloned().collect();
  7609. let pubkeys_balances: Vec<_> = pubkeys
  7610. .iter()
  7611. .cloned()
  7612. .zip(vec![
  7613. 2 * LAMPORTS_PER_SOL,
  7614. 3 * LAMPORTS_PER_SOL,
  7615. 3 * LAMPORTS_PER_SOL,
  7616. 4 * LAMPORTS_PER_SOL,
  7617. 5 * LAMPORTS_PER_SOL,
  7618. ])
  7619. .collect();
  7620. // Initialize accounts; all have larger SOL balances than current Bank built-ins
  7621. let account0 = AccountSharedData::new(pubkeys_balances[0].1, 0, &Pubkey::default());
  7622. bank.store_account(&pubkeys_balances[0].0, &account0);
  7623. let account1 = AccountSharedData::new(pubkeys_balances[1].1, 0, &Pubkey::default());
  7624. bank.store_account(&pubkeys_balances[1].0, &account1);
  7625. let account2 = AccountSharedData::new(pubkeys_balances[2].1, 0, &Pubkey::default());
  7626. bank.store_account(&pubkeys_balances[2].0, &account2);
  7627. let account3 = AccountSharedData::new(pubkeys_balances[3].1, 0, &Pubkey::default());
  7628. bank.store_account(&pubkeys_balances[3].0, &account3);
  7629. let account4 = AccountSharedData::new(pubkeys_balances[4].1, 0, &Pubkey::default());
  7630. bank.store_account(&pubkeys_balances[4].0, &account4);
  7631. // Create HashSet to exclude an account
  7632. let exclude4: HashSet<_> = pubkeys[4..].iter().cloned().collect();
  7633. let mut sorted_accounts = pubkeys_balances.clone();
  7634. sorted_accounts.sort_by(|a, b| a.1.cmp(&b.1).reverse());
  7635. // Return only one largest account
  7636. assert_eq!(
  7637. bank.get_largest_accounts(1, &pubkeys_hashset, AccountAddressFilter::Include, false)
  7638. .unwrap(),
  7639. vec![(pubkeys[4], 5 * LAMPORTS_PER_SOL)]
  7640. );
  7641. assert_eq!(
  7642. bank.get_largest_accounts(1, &HashSet::new(), AccountAddressFilter::Exclude, false)
  7643. .unwrap(),
  7644. vec![(pubkeys[4], 5 * LAMPORTS_PER_SOL)]
  7645. );
  7646. assert_eq!(
  7647. bank.get_largest_accounts(1, &exclude4, AccountAddressFilter::Exclude, false)
  7648. .unwrap(),
  7649. vec![(pubkeys[3], 4 * LAMPORTS_PER_SOL)]
  7650. );
  7651. // Return all added accounts
  7652. let results = bank
  7653. .get_largest_accounts(10, &pubkeys_hashset, AccountAddressFilter::Include, false)
  7654. .unwrap();
  7655. assert_eq!(results.len(), sorted_accounts.len());
  7656. for pubkey_balance in sorted_accounts.iter() {
  7657. assert!(results.contains(pubkey_balance));
  7658. }
  7659. let mut sorted_results = results.clone();
  7660. sorted_results.sort_by(|a, b| a.1.cmp(&b.1).reverse());
  7661. assert_eq!(sorted_results, results);
  7662. let expected_accounts = sorted_accounts[1..].to_vec();
  7663. let results = bank
  7664. .get_largest_accounts(10, &exclude4, AccountAddressFilter::Exclude, false)
  7665. .unwrap();
  7666. // results include 5 Bank builtins
  7667. assert_eq!(results.len(), 10);
  7668. for pubkey_balance in expected_accounts.iter() {
  7669. assert!(results.contains(pubkey_balance));
  7670. }
  7671. let mut sorted_results = results.clone();
  7672. sorted_results.sort_by(|a, b| a.1.cmp(&b.1).reverse());
  7673. assert_eq!(sorted_results, results);
  7674. // Return 3 added accounts
  7675. let expected_accounts = sorted_accounts[0..4].to_vec();
  7676. let results = bank
  7677. .get_largest_accounts(4, &pubkeys_hashset, AccountAddressFilter::Include, false)
  7678. .unwrap();
  7679. assert_eq!(results.len(), expected_accounts.len());
  7680. for pubkey_balance in expected_accounts.iter() {
  7681. assert!(results.contains(pubkey_balance));
  7682. }
  7683. let expected_accounts = expected_accounts[1..4].to_vec();
  7684. let results = bank
  7685. .get_largest_accounts(3, &exclude4, AccountAddressFilter::Exclude, false)
  7686. .unwrap();
  7687. assert_eq!(results.len(), expected_accounts.len());
  7688. for pubkey_balance in expected_accounts.iter() {
  7689. assert!(results.contains(pubkey_balance));
  7690. }
  7691. // Exclude more, and non-sequential, accounts
  7692. let exclude: HashSet<_> = [pubkeys[0], pubkeys[2], pubkeys[4]]
  7693. .iter()
  7694. .cloned()
  7695. .collect();
  7696. assert_eq!(
  7697. bank.get_largest_accounts(2, &exclude, AccountAddressFilter::Exclude, false)
  7698. .unwrap(),
  7699. vec![pubkeys_balances[3], pubkeys_balances[1]]
  7700. );
  7701. }
  7702. #[test]
  7703. fn test_transfer_sysvar() {
  7704. solana_logger::setup();
  7705. let GenesisConfigInfo {
  7706. genesis_config,
  7707. mint_keypair,
  7708. ..
  7709. } = create_genesis_config_with_leader(
  7710. 1_000_000_000_000_000,
  7711. &Pubkey::new_unique(),
  7712. bootstrap_validator_stake_lamports(),
  7713. );
  7714. let program_id = solana_pubkey::new_rand();
  7715. let (bank, _bank_forks) =
  7716. Bank::new_with_mockup_builtin_for_tests(&genesis_config, program_id, MockBuiltin::vm);
  7717. declare_process_instruction!(MockBuiltin, 1, |invoke_context| {
  7718. let transaction_context = &invoke_context.transaction_context;
  7719. let instruction_context = transaction_context.get_current_instruction_context()?;
  7720. instruction_context
  7721. .try_borrow_instruction_account(1)?
  7722. .set_data_from_slice(&[0; 40])?;
  7723. Ok(())
  7724. });
  7725. let blockhash = bank.last_blockhash();
  7726. #[allow(deprecated)]
  7727. let blockhash_sysvar = sysvar::clock::id();
  7728. #[allow(deprecated)]
  7729. let orig_lamports = bank.get_account(&sysvar::clock::id()).unwrap().lamports();
  7730. let tx = system_transaction::transfer(&mint_keypair, &blockhash_sysvar, 10, blockhash);
  7731. assert_eq!(
  7732. bank.process_transaction(&tx),
  7733. Err(TransactionError::InstructionError(
  7734. 0,
  7735. InstructionError::ReadonlyLamportChange
  7736. ))
  7737. );
  7738. assert_eq!(
  7739. bank.get_account(&sysvar::clock::id()).unwrap().lamports(),
  7740. orig_lamports
  7741. );
  7742. let accounts = vec![
  7743. AccountMeta::new(mint_keypair.pubkey(), true),
  7744. AccountMeta::new(blockhash_sysvar, false),
  7745. ];
  7746. let ix = Instruction::new_with_bincode(program_id, &0, accounts);
  7747. let message = Message::new(&[ix], Some(&mint_keypair.pubkey()));
  7748. let tx = Transaction::new(&[&mint_keypair], message, blockhash);
  7749. assert_eq!(
  7750. bank.process_transaction(&tx),
  7751. Err(TransactionError::InstructionError(
  7752. 0,
  7753. InstructionError::ReadonlyDataModified
  7754. ))
  7755. );
  7756. }
  7757. #[test]
  7758. fn test_clean_dropped_unrooted_frozen_banks() {
  7759. solana_logger::setup();
  7760. do_test_clean_dropped_unrooted_banks(FreezeBank1::Yes);
  7761. }
  7762. #[test]
  7763. fn test_clean_dropped_unrooted_unfrozen_banks() {
  7764. solana_logger::setup();
  7765. do_test_clean_dropped_unrooted_banks(FreezeBank1::No);
  7766. }
  7767. /// A simple enum to toggle freezing Bank1 or not. Used in the clean_dropped_unrooted tests.
  7768. enum FreezeBank1 {
  7769. No,
  7770. Yes,
  7771. }
  7772. fn do_test_clean_dropped_unrooted_banks(freeze_bank1: FreezeBank1) {
  7773. //! Test that dropped unrooted banks are cleaned up properly
  7774. //!
  7775. //! slot 0: bank0 (rooted)
  7776. //! / \
  7777. //! slot 1: / bank1 (unrooted and dropped)
  7778. //! /
  7779. //! slot 2: bank2 (rooted)
  7780. //!
  7781. //! In the scenario above, when `clean_accounts()` is called on bank2, the keys that exist
  7782. //! _only_ in bank1 should be cleaned up, since those keys are unreachable.
  7783. //!
  7784. //! The following scenarios are tested:
  7785. //!
  7786. //! 1. A key is written _only_ in an unrooted bank (key1)
  7787. //! - In this case, key1 should be cleaned up
  7788. //! 2. A key is written in both an unrooted _and_ rooted bank (key3)
  7789. //! - In this case, key3's ref-count should be decremented correctly
  7790. //! 3. A key with zero lamports is _only_ in an unrooted bank (key4)
  7791. //! - In this case, key4 should be cleaned up
  7792. //! 4. A key with zero lamports is in both an unrooted _and_ rooted bank (key5)
  7793. //! - In this case, key5's ref-count should be decremented correctly
  7794. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  7795. let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  7796. let amount = genesis_config.rent.minimum_balance(0);
  7797. let collector = Pubkey::new_unique();
  7798. let owner = Pubkey::new_unique();
  7799. let key1 = Keypair::new(); // only touched in bank1
  7800. let key2 = Keypair::new(); // only touched in bank2
  7801. let key3 = Keypair::new(); // touched in both bank1 and bank2
  7802. let key4 = Keypair::new(); // in only bank1, and has zero lamports
  7803. let key5 = Keypair::new(); // in both bank1 and bank2, and has zero lamports
  7804. bank0
  7805. .transfer(amount, &mint_keypair, &key2.pubkey())
  7806. .unwrap();
  7807. bank0.freeze();
  7808. let slot = 1;
  7809. let bank1 =
  7810. new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank0.clone(), &collector, slot);
  7811. add_root_and_flush_write_cache(&bank0);
  7812. bank1
  7813. .transfer(amount, &mint_keypair, &key1.pubkey())
  7814. .unwrap();
  7815. bank1.store_account(&key4.pubkey(), &AccountSharedData::new(0, 0, &owner));
  7816. bank1.store_account(&key5.pubkey(), &AccountSharedData::new(0, 0, &owner));
  7817. if let FreezeBank1::Yes = freeze_bank1 {
  7818. bank1.freeze();
  7819. }
  7820. let slot = slot + 1;
  7821. let bank2 = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank0, &collector, slot);
  7822. bank2
  7823. .transfer(amount * 2, &mint_keypair, &key2.pubkey())
  7824. .unwrap();
  7825. bank2
  7826. .transfer(amount, &mint_keypair, &key3.pubkey())
  7827. .unwrap();
  7828. bank2.store_account(&key5.pubkey(), &AccountSharedData::new(0, 0, &owner));
  7829. bank2.freeze(); // the freeze here is not strictly necessary, but more for illustration
  7830. bank2.squash();
  7831. add_root_and_flush_write_cache(&bank2);
  7832. bank_forks.write().unwrap().remove(1);
  7833. drop(bank1);
  7834. bank2.clean_accounts_for_tests();
  7835. let expected_ref_count_for_cleaned_up_keys = 0;
  7836. let expected_ref_count_for_keys_in_both_slot1_and_slot2 = 1;
  7837. assert_eq!(
  7838. bank2
  7839. .rc
  7840. .accounts
  7841. .accounts_db
  7842. .accounts_index
  7843. .ref_count_from_storage(&key1.pubkey()),
  7844. expected_ref_count_for_cleaned_up_keys
  7845. );
  7846. assert_ne!(
  7847. bank2
  7848. .rc
  7849. .accounts
  7850. .accounts_db
  7851. .accounts_index
  7852. .ref_count_from_storage(&key3.pubkey()),
  7853. expected_ref_count_for_cleaned_up_keys
  7854. );
  7855. assert_eq!(
  7856. bank2
  7857. .rc
  7858. .accounts
  7859. .accounts_db
  7860. .accounts_index
  7861. .ref_count_from_storage(&key4.pubkey()),
  7862. expected_ref_count_for_cleaned_up_keys
  7863. );
  7864. assert_eq!(
  7865. bank2
  7866. .rc
  7867. .accounts
  7868. .accounts_db
  7869. .accounts_index
  7870. .ref_count_from_storage(&key5.pubkey()),
  7871. expected_ref_count_for_keys_in_both_slot1_and_slot2,
  7872. );
  7873. assert_eq!(
  7874. bank2.rc.accounts.accounts_db.alive_account_count_in_slot(1),
  7875. 0
  7876. );
  7877. }
  7878. #[test]
  7879. fn test_compute_budget_program_noop() {
  7880. solana_logger::setup();
  7881. let GenesisConfigInfo {
  7882. genesis_config,
  7883. mint_keypair,
  7884. ..
  7885. } = create_genesis_config_with_leader(
  7886. 1_000_000_000_000_000,
  7887. &Pubkey::new_unique(),
  7888. bootstrap_validator_stake_lamports(),
  7889. );
  7890. let program_id = solana_pubkey::new_rand();
  7891. let (bank, _bank_forks) =
  7892. Bank::new_with_mockup_builtin_for_tests(&genesis_config, program_id, MockBuiltin::vm);
  7893. declare_process_instruction!(MockBuiltin, 1, |invoke_context| {
  7894. let compute_budget = ComputeBudget::from_budget_and_cost(
  7895. invoke_context.get_compute_budget(),
  7896. invoke_context.get_execution_cost(),
  7897. );
  7898. assert_eq!(
  7899. compute_budget,
  7900. ComputeBudget {
  7901. compute_unit_limit: u64::from(
  7902. execution_budget::DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT
  7903. ),
  7904. heap_size: 48 * 1024,
  7905. ..ComputeBudget::new_with_defaults(
  7906. invoke_context
  7907. .get_feature_set()
  7908. .raise_cpi_nesting_limit_to_8
  7909. )
  7910. }
  7911. );
  7912. Ok(())
  7913. });
  7914. let message = Message::new(
  7915. &[
  7916. ComputeBudgetInstruction::set_compute_unit_limit(
  7917. execution_budget::DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT,
  7918. ),
  7919. ComputeBudgetInstruction::request_heap_frame(48 * 1024),
  7920. Instruction::new_with_bincode(program_id, &0, vec![]),
  7921. ],
  7922. Some(&mint_keypair.pubkey()),
  7923. );
  7924. let tx = Transaction::new(&[&mint_keypair], message, bank.last_blockhash());
  7925. bank.process_transaction(&tx).unwrap();
  7926. }
  7927. #[test]
  7928. fn test_compute_request_instruction() {
  7929. solana_logger::setup();
  7930. let GenesisConfigInfo {
  7931. genesis_config,
  7932. mint_keypair,
  7933. ..
  7934. } = create_genesis_config_with_leader(
  7935. 1_000_000_000_000_000,
  7936. &Pubkey::new_unique(),
  7937. bootstrap_validator_stake_lamports(),
  7938. );
  7939. let program_id = solana_pubkey::new_rand();
  7940. let (bank, _bank_forks) =
  7941. Bank::new_with_mockup_builtin_for_tests(&genesis_config, program_id, MockBuiltin::vm);
  7942. declare_process_instruction!(MockBuiltin, 1, |invoke_context| {
  7943. let compute_budget = ComputeBudget::from_budget_and_cost(
  7944. invoke_context.get_compute_budget(),
  7945. invoke_context.get_execution_cost(),
  7946. );
  7947. assert_eq!(
  7948. compute_budget,
  7949. ComputeBudget {
  7950. compute_unit_limit: u64::from(
  7951. execution_budget::DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT
  7952. ),
  7953. heap_size: 48 * 1024,
  7954. ..ComputeBudget::new_with_defaults(
  7955. invoke_context
  7956. .get_feature_set()
  7957. .raise_cpi_nesting_limit_to_8
  7958. )
  7959. }
  7960. );
  7961. Ok(())
  7962. });
  7963. let message = Message::new(
  7964. &[
  7965. ComputeBudgetInstruction::set_compute_unit_limit(
  7966. execution_budget::DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT,
  7967. ),
  7968. ComputeBudgetInstruction::request_heap_frame(48 * 1024),
  7969. Instruction::new_with_bincode(program_id, &0, vec![]),
  7970. ],
  7971. Some(&mint_keypair.pubkey()),
  7972. );
  7973. let tx = Transaction::new(&[&mint_keypair], message, bank.last_blockhash());
  7974. bank.process_transaction(&tx).unwrap();
  7975. }
  7976. #[test]
  7977. fn test_failed_compute_request_instruction() {
  7978. solana_logger::setup();
  7979. let GenesisConfigInfo {
  7980. genesis_config,
  7981. mint_keypair,
  7982. ..
  7983. } = create_genesis_config_with_leader(
  7984. 1_000_000_000_000_000,
  7985. &Pubkey::new_unique(),
  7986. bootstrap_validator_stake_lamports(),
  7987. );
  7988. let program_id = solana_pubkey::new_rand();
  7989. let (bank, _bank_forks) =
  7990. Bank::new_with_mockup_builtin_for_tests(&genesis_config, program_id, MockBuiltin::vm);
  7991. let payer0_keypair = Keypair::new();
  7992. let payer1_keypair = Keypair::new();
  7993. bank.transfer(10, &mint_keypair, &payer0_keypair.pubkey())
  7994. .unwrap();
  7995. bank.transfer(10, &mint_keypair, &payer1_keypair.pubkey())
  7996. .unwrap();
  7997. const TEST_COMPUTE_UNIT_LIMIT: u32 = 500u32;
  7998. declare_process_instruction!(MockBuiltin, 1, |invoke_context| {
  7999. let compute_budget = ComputeBudget::from_budget_and_cost(
  8000. invoke_context.get_compute_budget(),
  8001. invoke_context.get_execution_cost(),
  8002. );
  8003. assert_eq!(
  8004. compute_budget,
  8005. ComputeBudget {
  8006. compute_unit_limit: u64::from(TEST_COMPUTE_UNIT_LIMIT),
  8007. heap_size: 48 * 1024,
  8008. ..ComputeBudget::new_with_defaults(
  8009. invoke_context
  8010. .get_feature_set()
  8011. .raise_cpi_nesting_limit_to_8
  8012. )
  8013. }
  8014. );
  8015. Ok(())
  8016. });
  8017. // This message will not be executed because the compute budget request is invalid
  8018. let message0 = Message::new(
  8019. &[
  8020. ComputeBudgetInstruction::request_heap_frame(1),
  8021. Instruction::new_with_bincode(program_id, &0, vec![]),
  8022. ],
  8023. Some(&payer0_keypair.pubkey()),
  8024. );
  8025. // This message will be processed successfully
  8026. let message1 = Message::new(
  8027. &[
  8028. ComputeBudgetInstruction::set_compute_unit_limit(TEST_COMPUTE_UNIT_LIMIT),
  8029. ComputeBudgetInstruction::request_heap_frame(48 * 1024),
  8030. Instruction::new_with_bincode(program_id, &0, vec![]),
  8031. ],
  8032. Some(&payer1_keypair.pubkey()),
  8033. );
  8034. let txs = vec![
  8035. Transaction::new(&[&payer0_keypair], message0, bank.last_blockhash()),
  8036. Transaction::new(&[&payer1_keypair], message1, bank.last_blockhash()),
  8037. ];
  8038. let results = bank.process_transactions(txs.iter());
  8039. assert_eq!(
  8040. results[0],
  8041. Err(TransactionError::InstructionError(
  8042. 0,
  8043. InstructionError::InvalidInstructionData
  8044. ))
  8045. );
  8046. assert_eq!(results[1], Ok(()));
  8047. // two transfers and the mock program
  8048. assert_eq!(bank.signature_count(), 3);
  8049. }
  8050. #[test]
  8051. fn test_verify_and_hash_transaction_sig_len() {
  8052. let GenesisConfigInfo {
  8053. mut genesis_config, ..
  8054. } = create_genesis_config_with_leader(42, &solana_pubkey::new_rand(), 42);
  8055. // activate all features
  8056. activate_all_features(&mut genesis_config);
  8057. let bank = Bank::new_for_tests(&genesis_config);
  8058. let recent_blockhash = Hash::new_unique();
  8059. let from_keypair = Keypair::new();
  8060. let to_keypair = Keypair::new();
  8061. let from_pubkey = from_keypair.pubkey();
  8062. let to_pubkey = to_keypair.pubkey();
  8063. enum TestCase {
  8064. AddSignature,
  8065. RemoveSignature,
  8066. }
  8067. let make_transaction = |case: TestCase| {
  8068. let message = Message::new(
  8069. &[system_instruction::transfer(&from_pubkey, &to_pubkey, 1)],
  8070. Some(&from_pubkey),
  8071. );
  8072. let mut tx = Transaction::new(&[&from_keypair], message, recent_blockhash);
  8073. assert_eq!(tx.message.header.num_required_signatures, 1);
  8074. match case {
  8075. TestCase::AddSignature => {
  8076. let signature = to_keypair.sign_message(&tx.message.serialize());
  8077. tx.signatures.push(signature);
  8078. }
  8079. TestCase::RemoveSignature => {
  8080. tx.signatures.remove(0);
  8081. }
  8082. }
  8083. tx
  8084. };
  8085. // Too few signatures: Sanitization failure
  8086. {
  8087. let tx = make_transaction(TestCase::RemoveSignature);
  8088. assert_matches!(
  8089. bank.verify_transaction(tx.into(), TransactionVerificationMode::FullVerification),
  8090. Err(TransactionError::SanitizeFailure)
  8091. );
  8092. }
  8093. // Too many signatures: Sanitization failure
  8094. {
  8095. let tx = make_transaction(TestCase::AddSignature);
  8096. assert_matches!(
  8097. bank.verify_transaction(tx.into(), TransactionVerificationMode::FullVerification),
  8098. Err(TransactionError::SanitizeFailure)
  8099. );
  8100. }
  8101. }
  8102. #[test]
  8103. fn test_verify_transactions_packet_data_size() {
  8104. let GenesisConfigInfo { genesis_config, .. } =
  8105. create_genesis_config_with_leader(42, &solana_pubkey::new_rand(), 42);
  8106. let bank = Bank::new_for_tests(&genesis_config);
  8107. let recent_blockhash = Hash::new_unique();
  8108. let keypair = Keypair::new();
  8109. let pubkey = keypair.pubkey();
  8110. let make_transaction = |size| {
  8111. let ixs: Vec<_> = std::iter::repeat_with(|| {
  8112. system_instruction::transfer(&pubkey, &Pubkey::new_unique(), 1)
  8113. })
  8114. .take(size)
  8115. .collect();
  8116. let message = Message::new(&ixs[..], Some(&pubkey));
  8117. Transaction::new(&[&keypair], message, recent_blockhash)
  8118. };
  8119. // Small transaction.
  8120. {
  8121. let tx = make_transaction(5);
  8122. assert!(bincode::serialized_size(&tx).unwrap() <= PACKET_DATA_SIZE as u64);
  8123. assert!(bank
  8124. .verify_transaction(tx.into(), TransactionVerificationMode::FullVerification)
  8125. .is_ok(),);
  8126. }
  8127. // Big transaction.
  8128. {
  8129. let tx = make_transaction(25);
  8130. assert!(bincode::serialized_size(&tx).unwrap() > PACKET_DATA_SIZE as u64);
  8131. assert_matches!(
  8132. bank.verify_transaction(tx.into(), TransactionVerificationMode::FullVerification),
  8133. Err(TransactionError::SanitizeFailure)
  8134. );
  8135. }
  8136. // Assert that verify fails as soon as serialized
  8137. // size exceeds packet data size.
  8138. for size in 1..30 {
  8139. let tx = make_transaction(size);
  8140. assert_eq!(
  8141. bincode::serialized_size(&tx).unwrap() <= PACKET_DATA_SIZE as u64,
  8142. bank.verify_transaction(tx.into(), TransactionVerificationMode::FullVerification)
  8143. .is_ok(),
  8144. );
  8145. }
  8146. }
  8147. #[test]
  8148. fn test_check_reserved_keys() {
  8149. let (genesis_config, _mint_keypair) = create_genesis_config(1);
  8150. let bank = Bank::new_for_tests(&genesis_config);
  8151. let mut bank = Bank::new_from_parent(Arc::new(bank), &Pubkey::new_unique(), 1);
  8152. let transaction =
  8153. SanitizedTransaction::from_transaction_for_tests(system_transaction::transfer(
  8154. &Keypair::new(),
  8155. &Pubkey::new_unique(),
  8156. 1,
  8157. genesis_config.hash(),
  8158. ));
  8159. assert_eq!(bank.check_reserved_keys(&transaction), Ok(()));
  8160. Arc::make_mut(&mut bank.reserved_account_keys)
  8161. .active
  8162. .insert(transaction.account_keys()[1]);
  8163. assert_eq!(
  8164. bank.check_reserved_keys(&transaction),
  8165. Err(TransactionError::ResanitizationNeeded)
  8166. );
  8167. }
  8168. #[test]
  8169. fn test_call_precomiled_program() {
  8170. let GenesisConfigInfo {
  8171. mut genesis_config,
  8172. mint_keypair,
  8173. ..
  8174. } = create_genesis_config_with_leader(42, &Pubkey::new_unique(), 42);
  8175. activate_all_features(&mut genesis_config);
  8176. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  8177. // libsecp256k1
  8178. // Since libsecp256k1 is still using the old version of rand, this test
  8179. // copies the `random` implementation at:
  8180. // https://docs.rs/libsecp256k1/latest/src/libsecp256k1/lib.rs.html#430
  8181. let secp_privkey = {
  8182. use rand::RngCore;
  8183. let mut rng = rand::thread_rng();
  8184. loop {
  8185. let mut ret = [0u8; libsecp256k1::util::SECRET_KEY_SIZE];
  8186. rng.fill_bytes(&mut ret);
  8187. if let Ok(key) = libsecp256k1::SecretKey::parse(&ret) {
  8188. break key;
  8189. }
  8190. }
  8191. };
  8192. let message_arr = b"hello";
  8193. let pubkey = libsecp256k1::PublicKey::from_secret_key(&secp_privkey);
  8194. let eth_address = solana_secp256k1_program::eth_address_from_pubkey(
  8195. &pubkey.serialize()[1..].try_into().unwrap(),
  8196. );
  8197. let (signature, recovery_id) =
  8198. solana_secp256k1_program::sign_message(&secp_privkey.serialize(), &message_arr[..])
  8199. .unwrap();
  8200. let instruction = solana_secp256k1_program::new_secp256k1_instruction_with_signature(
  8201. &message_arr[..],
  8202. &signature,
  8203. recovery_id,
  8204. &eth_address,
  8205. );
  8206. let tx = Transaction::new_signed_with_payer(
  8207. &[instruction],
  8208. Some(&mint_keypair.pubkey()),
  8209. &[&mint_keypair],
  8210. bank.last_blockhash(),
  8211. );
  8212. // calling the program should be successful when called from the bank
  8213. // even if the program itself is not called
  8214. bank.process_transaction(&tx).unwrap();
  8215. // ed25519
  8216. // Since ed25519_dalek is still using the old version of rand, this test
  8217. // copies the `generate` implementation at:
  8218. // https://docs.rs/ed25519-dalek/1.0.1/src/ed25519_dalek/secret.rs.html#167
  8219. let privkey = {
  8220. use rand::RngCore;
  8221. let mut rng = rand::thread_rng();
  8222. let mut seed = [0u8; ed25519_dalek::SECRET_KEY_LENGTH];
  8223. rng.fill_bytes(&mut seed);
  8224. let secret =
  8225. ed25519_dalek::SecretKey::from_bytes(&seed[..ed25519_dalek::SECRET_KEY_LENGTH])
  8226. .unwrap();
  8227. let public = ed25519_dalek::PublicKey::from(&secret);
  8228. ed25519_dalek::Keypair { secret, public }
  8229. };
  8230. let message_arr = b"hello";
  8231. let signature = privkey.sign(message_arr).to_bytes();
  8232. let pubkey = privkey.public.to_bytes();
  8233. let instruction = solana_ed25519_program::new_ed25519_instruction_with_signature(
  8234. message_arr,
  8235. &signature,
  8236. &pubkey,
  8237. );
  8238. let tx = Transaction::new_signed_with_payer(
  8239. &[instruction],
  8240. Some(&mint_keypair.pubkey()),
  8241. &[&mint_keypair],
  8242. bank.last_blockhash(),
  8243. );
  8244. // calling the program should be successful when called from the bank
  8245. // even if the program itself is not called
  8246. bank.process_transaction(&tx).unwrap();
  8247. }
  8248. fn calculate_test_fee(
  8249. message: &impl SVMMessage,
  8250. lamports_per_signature: u64,
  8251. fee_structure: &FeeStructure,
  8252. ) -> u64 {
  8253. let fee_budget_limits = FeeBudgetLimits::from(
  8254. process_compute_budget_instructions(
  8255. message.program_instructions_iter(),
  8256. &FeatureSet::default(),
  8257. )
  8258. .unwrap_or_default(),
  8259. );
  8260. solana_fee::calculate_fee(
  8261. message,
  8262. lamports_per_signature == 0,
  8263. fee_structure.lamports_per_signature,
  8264. fee_budget_limits.prioritization_fee,
  8265. FeeFeatures {
  8266. enable_secp256r1_precompile: true,
  8267. },
  8268. )
  8269. }
  8270. #[test]
  8271. fn test_calculate_fee() {
  8272. // Default: no fee.
  8273. let message = new_sanitized_message(Message::new(&[], Some(&Pubkey::new_unique())));
  8274. assert_eq!(
  8275. calculate_test_fee(
  8276. &message,
  8277. 0,
  8278. &FeeStructure {
  8279. lamports_per_signature: 0,
  8280. ..FeeStructure::default()
  8281. },
  8282. ),
  8283. 0
  8284. );
  8285. // One signature, a fee.
  8286. assert_eq!(
  8287. calculate_test_fee(
  8288. &message,
  8289. 1,
  8290. &FeeStructure {
  8291. lamports_per_signature: 1,
  8292. ..FeeStructure::default()
  8293. },
  8294. ),
  8295. 1
  8296. );
  8297. // Two signatures, double the fee.
  8298. let key0 = Pubkey::new_unique();
  8299. let key1 = Pubkey::new_unique();
  8300. let ix0 = system_instruction::transfer(&key0, &key1, 1);
  8301. let ix1 = system_instruction::transfer(&key1, &key0, 1);
  8302. let message = new_sanitized_message(Message::new(&[ix0, ix1], Some(&key0)));
  8303. assert_eq!(
  8304. calculate_test_fee(
  8305. &message,
  8306. 2,
  8307. &FeeStructure {
  8308. lamports_per_signature: 2,
  8309. ..FeeStructure::default()
  8310. },
  8311. ),
  8312. 4
  8313. );
  8314. }
  8315. #[test]
  8316. fn test_calculate_fee_compute_units() {
  8317. let fee_structure = FeeStructure {
  8318. lamports_per_signature: 1,
  8319. ..FeeStructure::default()
  8320. };
  8321. let max_fee = fee_structure.compute_fee_bins.last().unwrap().fee;
  8322. let lamports_per_signature = fee_structure.lamports_per_signature;
  8323. // One signature, no unit request
  8324. let message = new_sanitized_message(Message::new(&[], Some(&Pubkey::new_unique())));
  8325. assert_eq!(
  8326. calculate_test_fee(&message, 1, &fee_structure,),
  8327. max_fee + lamports_per_signature
  8328. );
  8329. // Three signatures, two instructions, no unit request
  8330. let ix0 = system_instruction::transfer(&Pubkey::new_unique(), &Pubkey::new_unique(), 1);
  8331. let ix1 = system_instruction::transfer(&Pubkey::new_unique(), &Pubkey::new_unique(), 1);
  8332. let message = new_sanitized_message(Message::new(&[ix0, ix1], Some(&Pubkey::new_unique())));
  8333. assert_eq!(
  8334. calculate_test_fee(&message, 1, &fee_structure,),
  8335. max_fee + 3 * lamports_per_signature
  8336. );
  8337. // Explicit fee schedule
  8338. for requested_compute_units in [
  8339. 0,
  8340. 5_000,
  8341. 10_000,
  8342. 100_000,
  8343. 300_000,
  8344. 500_000,
  8345. 700_000,
  8346. 900_000,
  8347. 1_100_000,
  8348. 1_300_000,
  8349. MAX_COMPUTE_UNIT_LIMIT,
  8350. ] {
  8351. const PRIORITIZATION_FEE_RATE: u64 = 42;
  8352. let message = new_sanitized_message(Message::new(
  8353. &[
  8354. ComputeBudgetInstruction::set_compute_unit_limit(requested_compute_units),
  8355. ComputeBudgetInstruction::set_compute_unit_price(PRIORITIZATION_FEE_RATE),
  8356. Instruction::new_with_bincode(Pubkey::new_unique(), &0_u8, vec![]),
  8357. ],
  8358. Some(&Pubkey::new_unique()),
  8359. ));
  8360. let fee = calculate_test_fee(&message, 1, &fee_structure);
  8361. let fee_budget_limits = FeeBudgetLimits::from(ComputeBudgetLimits {
  8362. compute_unit_price: PRIORITIZATION_FEE_RATE,
  8363. compute_unit_limit: requested_compute_units,
  8364. ..ComputeBudgetLimits::default()
  8365. });
  8366. assert_eq!(
  8367. fee,
  8368. lamports_per_signature + fee_budget_limits.prioritization_fee
  8369. );
  8370. }
  8371. }
  8372. #[test]
  8373. fn test_calculate_prioritization_fee() {
  8374. let fee_structure = FeeStructure {
  8375. lamports_per_signature: 1,
  8376. ..FeeStructure::default()
  8377. };
  8378. let request_units = 1_000_000_u32;
  8379. let request_unit_price = 2_000_000_000_u64;
  8380. let fee_budget_limits = FeeBudgetLimits::from(ComputeBudgetLimits {
  8381. compute_unit_price: request_unit_price,
  8382. compute_unit_limit: request_units,
  8383. ..ComputeBudgetLimits::default()
  8384. });
  8385. let message = new_sanitized_message(Message::new(
  8386. &[
  8387. ComputeBudgetInstruction::set_compute_unit_limit(request_units),
  8388. ComputeBudgetInstruction::set_compute_unit_price(request_unit_price),
  8389. ],
  8390. Some(&Pubkey::new_unique()),
  8391. ));
  8392. let fee = calculate_test_fee(
  8393. &message,
  8394. fee_structure.lamports_per_signature,
  8395. &fee_structure,
  8396. );
  8397. assert_eq!(
  8398. fee,
  8399. fee_structure.lamports_per_signature + fee_budget_limits.prioritization_fee
  8400. );
  8401. }
  8402. #[test]
  8403. fn test_calculate_fee_secp256k1() {
  8404. let fee_structure = FeeStructure {
  8405. lamports_per_signature: 1,
  8406. ..FeeStructure::default()
  8407. };
  8408. let key0 = Pubkey::new_unique();
  8409. let key1 = Pubkey::new_unique();
  8410. let ix0 = system_instruction::transfer(&key0, &key1, 1);
  8411. let mut secp_instruction1 = Instruction {
  8412. program_id: secp256k1_program::id(),
  8413. accounts: vec![],
  8414. data: vec![],
  8415. };
  8416. let mut secp_instruction2 = Instruction {
  8417. program_id: secp256k1_program::id(),
  8418. accounts: vec![],
  8419. data: vec![1],
  8420. };
  8421. let message = new_sanitized_message(Message::new(
  8422. &[
  8423. ix0.clone(),
  8424. secp_instruction1.clone(),
  8425. secp_instruction2.clone(),
  8426. ],
  8427. Some(&key0),
  8428. ));
  8429. assert_eq!(calculate_test_fee(&message, 1, &fee_structure,), 2);
  8430. secp_instruction1.data = vec![0];
  8431. secp_instruction2.data = vec![10];
  8432. let message = new_sanitized_message(Message::new(
  8433. &[ix0, secp_instruction1, secp_instruction2],
  8434. Some(&key0),
  8435. ));
  8436. assert_eq!(calculate_test_fee(&message, 1, &fee_structure,), 11);
  8437. }
  8438. #[test_case(false; "informal_loaded_size")]
  8439. #[test_case(true; "simd186_loaded_size")]
  8440. fn test_an_empty_instruction_without_program(formalize_loaded_transaction_data_size: bool) {
  8441. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(1);
  8442. let destination = solana_pubkey::new_rand();
  8443. let mut ix = system_instruction::transfer(&mint_keypair.pubkey(), &destination, 0);
  8444. ix.program_id = native_loader::id(); // Empty executable account chain
  8445. let message = Message::new(&[ix], Some(&mint_keypair.pubkey()));
  8446. let tx = Transaction::new(&[&mint_keypair], message, genesis_config.hash());
  8447. let mut bank = Bank::new_for_tests(&genesis_config);
  8448. if !formalize_loaded_transaction_data_size {
  8449. bank.deactivate_feature(&feature_set::formalize_loaded_transaction_data_size::id());
  8450. }
  8451. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  8452. let err = bank.process_transaction(&tx).unwrap_err();
  8453. if formalize_loaded_transaction_data_size {
  8454. assert_eq!(err, TransactionError::ProgramAccountNotFound);
  8455. } else {
  8456. assert_eq!(
  8457. err,
  8458. TransactionError::InstructionError(0, InstructionError::UnsupportedProgramId)
  8459. );
  8460. }
  8461. }
  8462. #[test]
  8463. fn test_transaction_log_collector_get_logs_for_address() {
  8464. let address = Pubkey::new_unique();
  8465. let mut mentioned_address_map = HashMap::new();
  8466. mentioned_address_map.insert(address, vec![0]);
  8467. let transaction_log_collector = TransactionLogCollector {
  8468. mentioned_address_map,
  8469. ..TransactionLogCollector::default()
  8470. };
  8471. assert_eq!(
  8472. transaction_log_collector.get_logs_for_address(Some(&address)),
  8473. Some(Vec::<TransactionLogInfo>::new()),
  8474. );
  8475. }
  8476. /// Test processing a good transaction correctly modifies the accounts data size
  8477. #[test]
  8478. fn test_accounts_data_size_with_good_transaction() {
  8479. const ACCOUNT_SIZE: u64 = MAX_PERMITTED_DATA_LENGTH;
  8480. let (genesis_config, mint_keypair) = create_genesis_config(1_000 * LAMPORTS_PER_SOL);
  8481. let bank = Bank::new_for_tests(&genesis_config);
  8482. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  8483. let transaction = system_transaction::create_account(
  8484. &mint_keypair,
  8485. &Keypair::new(),
  8486. bank.last_blockhash(),
  8487. genesis_config
  8488. .rent
  8489. .minimum_balance(ACCOUNT_SIZE.try_into().unwrap()),
  8490. ACCOUNT_SIZE,
  8491. &solana_system_interface::program::id(),
  8492. );
  8493. let accounts_data_size_before = bank.load_accounts_data_size();
  8494. let accounts_data_size_delta_before = bank.load_accounts_data_size_delta();
  8495. let accounts_data_size_delta_on_chain_before = bank.load_accounts_data_size_delta_on_chain();
  8496. let result = bank.process_transaction(&transaction);
  8497. let accounts_data_size_after = bank.load_accounts_data_size();
  8498. let accounts_data_size_delta_after = bank.load_accounts_data_size_delta();
  8499. let accounts_data_size_delta_on_chain_after = bank.load_accounts_data_size_delta_on_chain();
  8500. assert!(result.is_ok());
  8501. assert_eq!(
  8502. accounts_data_size_after - accounts_data_size_before,
  8503. ACCOUNT_SIZE,
  8504. );
  8505. assert_eq!(
  8506. accounts_data_size_delta_after - accounts_data_size_delta_before,
  8507. ACCOUNT_SIZE as i64,
  8508. );
  8509. assert_eq!(
  8510. accounts_data_size_delta_on_chain_after - accounts_data_size_delta_on_chain_before,
  8511. ACCOUNT_SIZE as i64,
  8512. );
  8513. }
  8514. /// Test processing a bad transaction correctly modifies the accounts data size
  8515. #[test]
  8516. fn test_accounts_data_size_with_bad_transaction() {
  8517. const ACCOUNT_SIZE: u64 = MAX_PERMITTED_DATA_LENGTH;
  8518. let (genesis_config, _mint_keypair) = create_genesis_config(1_000 * LAMPORTS_PER_SOL);
  8519. let bank = Bank::new_for_tests(&genesis_config);
  8520. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  8521. let transaction = system_transaction::create_account(
  8522. &Keypair::new(),
  8523. &Keypair::new(),
  8524. bank.last_blockhash(),
  8525. LAMPORTS_PER_SOL,
  8526. ACCOUNT_SIZE,
  8527. &solana_system_interface::program::id(),
  8528. );
  8529. let accounts_data_size_before = bank.load_accounts_data_size();
  8530. let accounts_data_size_delta_before = bank.load_accounts_data_size_delta();
  8531. let accounts_data_size_delta_on_chain_before = bank.load_accounts_data_size_delta_on_chain();
  8532. let result = bank.process_transaction(&transaction);
  8533. let accounts_data_size_after = bank.load_accounts_data_size();
  8534. let accounts_data_size_delta_after = bank.load_accounts_data_size_delta();
  8535. let accounts_data_size_delta_on_chain_after = bank.load_accounts_data_size_delta_on_chain();
  8536. assert!(result.is_err());
  8537. assert_eq!(accounts_data_size_after, accounts_data_size_before,);
  8538. assert_eq!(
  8539. accounts_data_size_delta_after,
  8540. accounts_data_size_delta_before,
  8541. );
  8542. assert_eq!(
  8543. accounts_data_size_delta_on_chain_after,
  8544. accounts_data_size_delta_on_chain_before,
  8545. );
  8546. }
  8547. #[derive(Serialize, Deserialize)]
  8548. enum MockTransferInstruction {
  8549. Transfer(u64),
  8550. }
  8551. declare_process_instruction!(MockTransferBuiltin, 1, |invoke_context| {
  8552. let transaction_context = &invoke_context.transaction_context;
  8553. let instruction_context = transaction_context.get_current_instruction_context()?;
  8554. let instruction_data = instruction_context.get_instruction_data();
  8555. if let Ok(instruction) = bincode::deserialize(instruction_data) {
  8556. match instruction {
  8557. MockTransferInstruction::Transfer(amount) => {
  8558. instruction_context
  8559. .try_borrow_instruction_account(1)?
  8560. .checked_sub_lamports(amount)?;
  8561. instruction_context
  8562. .try_borrow_instruction_account(2)?
  8563. .checked_add_lamports(amount)?;
  8564. Ok(())
  8565. }
  8566. }
  8567. } else {
  8568. Err(InstructionError::InvalidInstructionData)
  8569. }
  8570. });
  8571. fn create_mock_transfer(
  8572. payer: &Keypair,
  8573. from: &Keypair,
  8574. to: &Keypair,
  8575. amount: u64,
  8576. mock_program_id: Pubkey,
  8577. recent_blockhash: Hash,
  8578. ) -> Transaction {
  8579. let account_metas = vec![
  8580. AccountMeta::new(payer.pubkey(), true),
  8581. AccountMeta::new(from.pubkey(), true),
  8582. AccountMeta::new(to.pubkey(), true),
  8583. ];
  8584. let transfer_instruction = Instruction::new_with_bincode(
  8585. mock_program_id,
  8586. &MockTransferInstruction::Transfer(amount),
  8587. account_metas,
  8588. );
  8589. Transaction::new_signed_with_payer(
  8590. &[transfer_instruction],
  8591. Some(&payer.pubkey()),
  8592. &[payer, from, to],
  8593. recent_blockhash,
  8594. )
  8595. }
  8596. #[test]
  8597. fn test_invalid_rent_state_changes_existing_accounts() {
  8598. let GenesisConfigInfo {
  8599. mut genesis_config,
  8600. mint_keypair,
  8601. ..
  8602. } = create_genesis_config_with_leader(100 * LAMPORTS_PER_SOL, &Pubkey::new_unique(), 42);
  8603. genesis_config.rent = Rent::default();
  8604. let mock_program_id = Pubkey::new_unique();
  8605. let account_data_size = 100;
  8606. let rent_exempt_minimum = genesis_config.rent.minimum_balance(account_data_size);
  8607. // Create legacy accounts of various kinds
  8608. let rent_paying_account = Keypair::new();
  8609. genesis_config.accounts.insert(
  8610. rent_paying_account.pubkey(),
  8611. Account::new_rent_epoch(
  8612. rent_exempt_minimum - 1,
  8613. account_data_size,
  8614. &mock_program_id,
  8615. INITIAL_RENT_EPOCH + 1,
  8616. ),
  8617. );
  8618. let rent_exempt_account = Keypair::new();
  8619. genesis_config.accounts.insert(
  8620. rent_exempt_account.pubkey(),
  8621. Account::new_rent_epoch(
  8622. rent_exempt_minimum,
  8623. account_data_size,
  8624. &mock_program_id,
  8625. INITIAL_RENT_EPOCH + 1,
  8626. ),
  8627. );
  8628. let (bank, _bank_forks) = Bank::new_with_mockup_builtin_for_tests(
  8629. &genesis_config,
  8630. mock_program_id,
  8631. MockTransferBuiltin::vm,
  8632. );
  8633. let recent_blockhash = bank.last_blockhash();
  8634. let check_account_is_rent_exempt = |pubkey: &Pubkey| -> bool {
  8635. let account = bank.get_account(pubkey).unwrap();
  8636. Rent::default().is_exempt(account.lamports(), account.data().len())
  8637. };
  8638. // RentPaying account can be left as Uninitialized, in other RentPaying states, or RentExempt
  8639. let tx = create_mock_transfer(
  8640. &mint_keypair, // payer
  8641. &rent_paying_account, // from
  8642. &mint_keypair, // to
  8643. 1,
  8644. mock_program_id,
  8645. recent_blockhash,
  8646. );
  8647. let result = bank.process_transaction(&tx);
  8648. assert!(result.is_ok());
  8649. assert!(!check_account_is_rent_exempt(&rent_paying_account.pubkey()));
  8650. let tx = create_mock_transfer(
  8651. &mint_keypair, // payer
  8652. &rent_paying_account, // from
  8653. &mint_keypair, // to
  8654. rent_exempt_minimum - 2,
  8655. mock_program_id,
  8656. recent_blockhash,
  8657. );
  8658. let result = bank.process_transaction(&tx);
  8659. assert!(result.is_ok());
  8660. assert!(bank.get_account(&rent_paying_account.pubkey()).is_none());
  8661. bank.store_account(
  8662. // restore program-owned account
  8663. &rent_paying_account.pubkey(),
  8664. &AccountSharedData::new(rent_exempt_minimum - 1, account_data_size, &mock_program_id),
  8665. );
  8666. let result = bank.transfer(1, &mint_keypair, &rent_paying_account.pubkey());
  8667. assert!(result.is_ok());
  8668. assert!(check_account_is_rent_exempt(&rent_paying_account.pubkey()));
  8669. // RentExempt account can only remain RentExempt or be Uninitialized
  8670. let tx = create_mock_transfer(
  8671. &mint_keypair, // payer
  8672. &rent_exempt_account, // from
  8673. &mint_keypair, // to
  8674. 1,
  8675. mock_program_id,
  8676. recent_blockhash,
  8677. );
  8678. let result = bank.process_transaction(&tx);
  8679. assert!(result.is_err());
  8680. assert!(check_account_is_rent_exempt(&rent_exempt_account.pubkey()));
  8681. let result = bank.transfer(1, &mint_keypair, &rent_exempt_account.pubkey());
  8682. assert!(result.is_ok());
  8683. assert!(check_account_is_rent_exempt(&rent_exempt_account.pubkey()));
  8684. let tx = create_mock_transfer(
  8685. &mint_keypair, // payer
  8686. &rent_exempt_account, // from
  8687. &mint_keypair, // to
  8688. rent_exempt_minimum + 1,
  8689. mock_program_id,
  8690. recent_blockhash,
  8691. );
  8692. let result = bank.process_transaction(&tx);
  8693. assert!(result.is_ok());
  8694. assert!(bank.get_account(&rent_exempt_account.pubkey()).is_none());
  8695. }
  8696. #[test]
  8697. fn test_invalid_rent_state_changes_new_accounts() {
  8698. let GenesisConfigInfo {
  8699. mut genesis_config,
  8700. mint_keypair,
  8701. ..
  8702. } = create_genesis_config_with_leader(100 * LAMPORTS_PER_SOL, &Pubkey::new_unique(), 42);
  8703. genesis_config.rent = Rent::default();
  8704. let mock_program_id = Pubkey::new_unique();
  8705. let account_data_size = 100;
  8706. let rent_exempt_minimum = genesis_config.rent.minimum_balance(account_data_size);
  8707. let (bank, _bank_forks) = Bank::new_with_mockup_builtin_for_tests(
  8708. &genesis_config,
  8709. mock_program_id,
  8710. MockTransferBuiltin::vm,
  8711. );
  8712. let recent_blockhash = bank.last_blockhash();
  8713. let check_account_is_rent_exempt = |pubkey: &Pubkey| -> bool {
  8714. let account = bank.get_account(pubkey).unwrap();
  8715. Rent::default().is_exempt(account.lamports(), account.data().len())
  8716. };
  8717. // Try to create RentPaying account
  8718. let rent_paying_account = Keypair::new();
  8719. let tx = system_transaction::create_account(
  8720. &mint_keypair,
  8721. &rent_paying_account,
  8722. recent_blockhash,
  8723. rent_exempt_minimum - 1,
  8724. account_data_size as u64,
  8725. &mock_program_id,
  8726. );
  8727. let result = bank.process_transaction(&tx);
  8728. assert!(result.is_err());
  8729. assert!(bank.get_account(&rent_paying_account.pubkey()).is_none());
  8730. // Try to create RentExempt account
  8731. let rent_exempt_account = Keypair::new();
  8732. let tx = system_transaction::create_account(
  8733. &mint_keypair,
  8734. &rent_exempt_account,
  8735. recent_blockhash,
  8736. rent_exempt_minimum,
  8737. account_data_size as u64,
  8738. &mock_program_id,
  8739. );
  8740. let result = bank.process_transaction(&tx);
  8741. assert!(result.is_ok());
  8742. assert!(check_account_is_rent_exempt(&rent_exempt_account.pubkey()));
  8743. }
  8744. #[test]
  8745. fn test_drained_created_account() {
  8746. let GenesisConfigInfo {
  8747. mut genesis_config,
  8748. mint_keypair,
  8749. ..
  8750. } = create_genesis_config_with_leader(100 * LAMPORTS_PER_SOL, &Pubkey::new_unique(), 42);
  8751. genesis_config.rent = Rent::default();
  8752. activate_all_features(&mut genesis_config);
  8753. let mock_program_id = Pubkey::new_unique();
  8754. // small enough to not pay rent, thus bypassing the data clearing rent
  8755. // mechanism
  8756. let data_size_no_rent = 100;
  8757. // large enough to pay rent, will have data cleared
  8758. let data_size_rent = 10000;
  8759. let lamports_to_transfer = 100;
  8760. // Create legacy accounts of various kinds
  8761. let created_keypair = Keypair::new();
  8762. let (bank, _bank_forks) = Bank::new_with_mockup_builtin_for_tests(
  8763. &genesis_config,
  8764. mock_program_id,
  8765. MockTransferBuiltin::vm,
  8766. );
  8767. let recent_blockhash = bank.last_blockhash();
  8768. // Create and drain a small data size account
  8769. let create_instruction = system_instruction::create_account(
  8770. &mint_keypair.pubkey(),
  8771. &created_keypair.pubkey(),
  8772. lamports_to_transfer,
  8773. data_size_no_rent,
  8774. &mock_program_id,
  8775. );
  8776. let account_metas = vec![
  8777. AccountMeta::new(mint_keypair.pubkey(), true),
  8778. AccountMeta::new(created_keypair.pubkey(), true),
  8779. AccountMeta::new(mint_keypair.pubkey(), false),
  8780. ];
  8781. let transfer_from_instruction = Instruction::new_with_bincode(
  8782. mock_program_id,
  8783. &MockTransferInstruction::Transfer(lamports_to_transfer),
  8784. account_metas,
  8785. );
  8786. let tx = Transaction::new_signed_with_payer(
  8787. &[create_instruction, transfer_from_instruction],
  8788. Some(&mint_keypair.pubkey()),
  8789. &[&mint_keypair, &created_keypair],
  8790. recent_blockhash,
  8791. );
  8792. let result = bank.process_transaction(&tx);
  8793. assert!(result.is_ok());
  8794. // account data is not stored because of zero balance even though its
  8795. // data wasn't cleared
  8796. assert!(bank.get_account(&created_keypair.pubkey()).is_none());
  8797. // Create and drain a large data size account
  8798. let create_instruction = system_instruction::create_account(
  8799. &mint_keypair.pubkey(),
  8800. &created_keypair.pubkey(),
  8801. lamports_to_transfer,
  8802. data_size_rent,
  8803. &mock_program_id,
  8804. );
  8805. let account_metas = vec![
  8806. AccountMeta::new(mint_keypair.pubkey(), true),
  8807. AccountMeta::new(created_keypair.pubkey(), true),
  8808. AccountMeta::new(mint_keypair.pubkey(), false),
  8809. ];
  8810. let transfer_from_instruction = Instruction::new_with_bincode(
  8811. mock_program_id,
  8812. &MockTransferInstruction::Transfer(lamports_to_transfer),
  8813. account_metas,
  8814. );
  8815. let tx = Transaction::new_signed_with_payer(
  8816. &[create_instruction, transfer_from_instruction],
  8817. Some(&mint_keypair.pubkey()),
  8818. &[&mint_keypair, &created_keypair],
  8819. recent_blockhash,
  8820. );
  8821. let result = bank.process_transaction(&tx);
  8822. assert!(result.is_ok());
  8823. // account data is not stored because of zero balance
  8824. assert!(bank.get_account(&created_keypair.pubkey()).is_none());
  8825. }
  8826. #[test]
  8827. fn test_rent_state_changes_sysvars() {
  8828. let GenesisConfigInfo {
  8829. mut genesis_config,
  8830. mint_keypair,
  8831. ..
  8832. } = create_genesis_config_with_leader(100 * LAMPORTS_PER_SOL, &Pubkey::new_unique(), 42);
  8833. genesis_config.rent = Rent::default();
  8834. let validator_pubkey = Pubkey::new_unique();
  8835. let validator_stake_lamports = LAMPORTS_PER_SOL;
  8836. let validator_vote_account_pubkey = Pubkey::new_unique();
  8837. let validator_voting_keypair = Keypair::new();
  8838. let validator_vote_account = vote_state::create_account(
  8839. &validator_voting_keypair.pubkey(),
  8840. &validator_pubkey,
  8841. 0,
  8842. validator_stake_lamports,
  8843. );
  8844. genesis_config.accounts.insert(
  8845. validator_pubkey,
  8846. Account::new(
  8847. genesis_config.rent.minimum_balance(0),
  8848. 0,
  8849. &system_program::id(),
  8850. ),
  8851. );
  8852. genesis_config.accounts.insert(
  8853. validator_vote_account_pubkey,
  8854. Account::from(validator_vote_account),
  8855. );
  8856. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  8857. // Ensure transactions with sysvars succeed, even though sysvars appear RentPaying by balance
  8858. let tx = Transaction::new_signed_with_payer(
  8859. &[vote_instruction::authorize(
  8860. &validator_vote_account_pubkey,
  8861. &validator_voting_keypair.pubkey(),
  8862. &Pubkey::new_unique(),
  8863. VoteAuthorize::Voter,
  8864. )],
  8865. Some(&mint_keypair.pubkey()),
  8866. &[&mint_keypair, &validator_voting_keypair],
  8867. bank.last_blockhash(),
  8868. );
  8869. let result = bank.process_transaction(&tx);
  8870. assert!(result.is_ok());
  8871. }
  8872. #[test]
  8873. fn test_invalid_rent_state_changes_fee_payer() {
  8874. let GenesisConfigInfo {
  8875. mut genesis_config,
  8876. mint_keypair,
  8877. ..
  8878. } = create_genesis_config_with_leader(100 * LAMPORTS_PER_SOL, &Pubkey::new_unique(), 42);
  8879. genesis_config.rent = Rent::default();
  8880. genesis_config.fee_rate_governor = FeeRateGovernor::new(
  8881. solana_fee_calculator::DEFAULT_TARGET_LAMPORTS_PER_SIGNATURE,
  8882. solana_fee_calculator::DEFAULT_TARGET_SIGNATURES_PER_SLOT,
  8883. );
  8884. let rent_exempt_minimum = genesis_config.rent.minimum_balance(0);
  8885. // Create legacy rent-paying System account
  8886. let rent_paying_fee_payer = Keypair::new();
  8887. genesis_config.accounts.insert(
  8888. rent_paying_fee_payer.pubkey(),
  8889. Account::new(rent_exempt_minimum - 1, 0, &system_program::id()),
  8890. );
  8891. // Create RentExempt recipient account
  8892. let recipient = Pubkey::new_unique();
  8893. genesis_config.accounts.insert(
  8894. recipient,
  8895. Account::new(rent_exempt_minimum, 0, &system_program::id()),
  8896. );
  8897. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  8898. let recent_blockhash = bank.last_blockhash();
  8899. let check_account_is_rent_exempt = |pubkey: &Pubkey| -> bool {
  8900. let account = bank.get_account(pubkey).unwrap();
  8901. Rent::default().is_exempt(account.lamports(), account.data().len())
  8902. };
  8903. // Create just-rent-exempt fee-payer
  8904. let rent_exempt_fee_payer = Keypair::new();
  8905. bank.transfer(
  8906. rent_exempt_minimum,
  8907. &mint_keypair,
  8908. &rent_exempt_fee_payer.pubkey(),
  8909. )
  8910. .unwrap();
  8911. // Dummy message to determine fee amount
  8912. let dummy_message = new_sanitized_message(Message::new_with_blockhash(
  8913. &[system_instruction::transfer(
  8914. &rent_exempt_fee_payer.pubkey(),
  8915. &recipient,
  8916. LAMPORTS_PER_SOL,
  8917. )],
  8918. Some(&rent_exempt_fee_payer.pubkey()),
  8919. &recent_blockhash,
  8920. ));
  8921. let fee = bank.get_fee_for_message(&dummy_message).unwrap();
  8922. // RentPaying fee-payer can remain RentPaying
  8923. let tx = Transaction::new(
  8924. &[&rent_paying_fee_payer, &mint_keypair],
  8925. Message::new(
  8926. &[system_instruction::transfer(
  8927. &mint_keypair.pubkey(),
  8928. &recipient,
  8929. rent_exempt_minimum,
  8930. )],
  8931. Some(&rent_paying_fee_payer.pubkey()),
  8932. ),
  8933. recent_blockhash,
  8934. );
  8935. let result = bank.process_transaction(&tx);
  8936. assert!(result.is_ok());
  8937. assert!(!check_account_is_rent_exempt(
  8938. &rent_paying_fee_payer.pubkey()
  8939. ));
  8940. // RentPaying fee-payer can remain RentPaying on failed executed tx
  8941. let sender = Keypair::new();
  8942. let fee_payer_balance = bank.get_balance(&rent_paying_fee_payer.pubkey());
  8943. let tx = Transaction::new(
  8944. &[&rent_paying_fee_payer, &sender],
  8945. Message::new(
  8946. &[system_instruction::transfer(
  8947. &sender.pubkey(),
  8948. &recipient,
  8949. rent_exempt_minimum,
  8950. )],
  8951. Some(&rent_paying_fee_payer.pubkey()),
  8952. ),
  8953. recent_blockhash,
  8954. );
  8955. let result = bank.process_transaction(&tx);
  8956. assert_eq!(
  8957. result.unwrap_err(),
  8958. TransactionError::InstructionError(0, InstructionError::Custom(1))
  8959. );
  8960. assert_ne!(
  8961. fee_payer_balance,
  8962. bank.get_balance(&rent_paying_fee_payer.pubkey())
  8963. );
  8964. assert!(!check_account_is_rent_exempt(
  8965. &rent_paying_fee_payer.pubkey()
  8966. ));
  8967. // RentPaying fee-payer can be emptied with fee and transaction
  8968. let tx = Transaction::new(
  8969. &[&rent_paying_fee_payer],
  8970. Message::new(
  8971. &[system_instruction::transfer(
  8972. &rent_paying_fee_payer.pubkey(),
  8973. &recipient,
  8974. bank.get_balance(&rent_paying_fee_payer.pubkey()) - fee,
  8975. )],
  8976. Some(&rent_paying_fee_payer.pubkey()),
  8977. ),
  8978. recent_blockhash,
  8979. );
  8980. let result = bank.process_transaction(&tx);
  8981. assert!(result.is_ok());
  8982. assert_eq!(0, bank.get_balance(&rent_paying_fee_payer.pubkey()));
  8983. // RentExempt fee-payer cannot become RentPaying from transaction fee
  8984. let tx = Transaction::new(
  8985. &[&rent_exempt_fee_payer, &mint_keypair],
  8986. Message::new(
  8987. &[system_instruction::transfer(
  8988. &mint_keypair.pubkey(),
  8989. &recipient,
  8990. rent_exempt_minimum,
  8991. )],
  8992. Some(&rent_exempt_fee_payer.pubkey()),
  8993. ),
  8994. recent_blockhash,
  8995. );
  8996. let result = bank.process_transaction(&tx);
  8997. assert_eq!(
  8998. result.unwrap_err(),
  8999. TransactionError::InsufficientFundsForRent { account_index: 0 }
  9000. );
  9001. assert!(check_account_is_rent_exempt(
  9002. &rent_exempt_fee_payer.pubkey()
  9003. ));
  9004. // RentExempt fee-payer cannot become RentPaying via failed executed tx
  9005. let tx = Transaction::new(
  9006. &[&rent_exempt_fee_payer, &sender],
  9007. Message::new(
  9008. &[system_instruction::transfer(
  9009. &sender.pubkey(),
  9010. &recipient,
  9011. rent_exempt_minimum,
  9012. )],
  9013. Some(&rent_exempt_fee_payer.pubkey()),
  9014. ),
  9015. recent_blockhash,
  9016. );
  9017. let result = bank.process_transaction(&tx);
  9018. assert_eq!(
  9019. result.unwrap_err(),
  9020. TransactionError::InsufficientFundsForRent { account_index: 0 }
  9021. );
  9022. assert!(check_account_is_rent_exempt(
  9023. &rent_exempt_fee_payer.pubkey()
  9024. ));
  9025. // For good measure, show that a RentExempt fee-payer that is also debited by a transaction
  9026. // cannot become RentPaying by that debit, but can still be charged for the fee
  9027. bank.transfer(fee, &mint_keypair, &rent_exempt_fee_payer.pubkey())
  9028. .unwrap();
  9029. let fee_payer_balance = bank.get_balance(&rent_exempt_fee_payer.pubkey());
  9030. assert_eq!(fee_payer_balance, rent_exempt_minimum + fee);
  9031. let tx = Transaction::new(
  9032. &[&rent_exempt_fee_payer],
  9033. Message::new(
  9034. &[system_instruction::transfer(
  9035. &rent_exempt_fee_payer.pubkey(),
  9036. &recipient,
  9037. fee,
  9038. )],
  9039. Some(&rent_exempt_fee_payer.pubkey()),
  9040. ),
  9041. recent_blockhash,
  9042. );
  9043. let result = bank.process_transaction(&tx);
  9044. assert_eq!(
  9045. result.unwrap_err(),
  9046. TransactionError::InsufficientFundsForRent { account_index: 0 }
  9047. );
  9048. assert_eq!(
  9049. fee_payer_balance - fee,
  9050. bank.get_balance(&rent_exempt_fee_payer.pubkey())
  9051. );
  9052. assert!(check_account_is_rent_exempt(
  9053. &rent_exempt_fee_payer.pubkey()
  9054. ));
  9055. // Also show that a RentExempt fee-payer can be completely emptied via fee and transaction
  9056. bank.transfer(fee + 1, &mint_keypair, &rent_exempt_fee_payer.pubkey())
  9057. .unwrap();
  9058. assert!(bank.get_balance(&rent_exempt_fee_payer.pubkey()) > rent_exempt_minimum + fee);
  9059. let tx = Transaction::new(
  9060. &[&rent_exempt_fee_payer],
  9061. Message::new(
  9062. &[system_instruction::transfer(
  9063. &rent_exempt_fee_payer.pubkey(),
  9064. &recipient,
  9065. bank.get_balance(&rent_exempt_fee_payer.pubkey()) - fee,
  9066. )],
  9067. Some(&rent_exempt_fee_payer.pubkey()),
  9068. ),
  9069. recent_blockhash,
  9070. );
  9071. let result = bank.process_transaction(&tx);
  9072. assert!(result.is_ok());
  9073. assert_eq!(0, bank.get_balance(&rent_exempt_fee_payer.pubkey()));
  9074. // ... but not if the fee alone would make it RentPaying
  9075. bank.transfer(
  9076. rent_exempt_minimum + 1,
  9077. &mint_keypair,
  9078. &rent_exempt_fee_payer.pubkey(),
  9079. )
  9080. .unwrap();
  9081. assert!(bank.get_balance(&rent_exempt_fee_payer.pubkey()) < rent_exempt_minimum + fee);
  9082. let tx = Transaction::new(
  9083. &[&rent_exempt_fee_payer],
  9084. Message::new(
  9085. &[system_instruction::transfer(
  9086. &rent_exempt_fee_payer.pubkey(),
  9087. &recipient,
  9088. bank.get_balance(&rent_exempt_fee_payer.pubkey()) - fee,
  9089. )],
  9090. Some(&rent_exempt_fee_payer.pubkey()),
  9091. ),
  9092. recent_blockhash,
  9093. );
  9094. let result = bank.process_transaction(&tx);
  9095. assert_eq!(
  9096. result.unwrap_err(),
  9097. TransactionError::InsufficientFundsForRent { account_index: 0 }
  9098. );
  9099. assert!(check_account_is_rent_exempt(
  9100. &rent_exempt_fee_payer.pubkey()
  9101. ));
  9102. }
  9103. // Ensure System transfers of any size can be made to the incinerator
  9104. #[test]
  9105. fn test_rent_state_incinerator() {
  9106. let GenesisConfigInfo {
  9107. mut genesis_config,
  9108. mint_keypair,
  9109. ..
  9110. } = create_genesis_config_with_leader(100 * LAMPORTS_PER_SOL, &Pubkey::new_unique(), 42);
  9111. genesis_config.rent = Rent::default();
  9112. let rent_exempt_minimum = genesis_config.rent.minimum_balance(0);
  9113. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  9114. for amount in [rent_exempt_minimum - 1, rent_exempt_minimum] {
  9115. bank.transfer(amount, &mint_keypair, &solana_sdk_ids::incinerator::id())
  9116. .unwrap();
  9117. }
  9118. }
  9119. #[test]
  9120. fn test_update_accounts_data_size() {
  9121. // Test: Subtraction saturates at 0
  9122. {
  9123. let bank = create_simple_test_bank(100);
  9124. let initial_data_size = bank.load_accounts_data_size() as i64;
  9125. let data_size = 567;
  9126. bank.accounts_data_size_delta_on_chain
  9127. .store(data_size, Release);
  9128. bank.update_accounts_data_size_delta_on_chain(
  9129. (initial_data_size + data_size + 1).saturating_neg(),
  9130. );
  9131. assert_eq!(bank.load_accounts_data_size(), 0);
  9132. }
  9133. // Test: Addition saturates at u64::MAX
  9134. {
  9135. let mut bank = create_simple_test_bank(100);
  9136. let data_size_remaining = 567;
  9137. bank.accounts_data_size_initial = u64::MAX - data_size_remaining;
  9138. bank.accounts_data_size_delta_off_chain
  9139. .store((data_size_remaining + 1) as i64, Release);
  9140. assert_eq!(bank.load_accounts_data_size(), u64::MAX);
  9141. }
  9142. // Test: Updates work as expected
  9143. {
  9144. // Set the accounts data size to be in the middle, then perform a bunch of small
  9145. // updates, checking the results after each one.
  9146. let mut bank = create_simple_test_bank(100);
  9147. bank.accounts_data_size_initial = u32::MAX as u64;
  9148. let mut rng = rand::thread_rng();
  9149. for _ in 0..100 {
  9150. let initial = bank.load_accounts_data_size() as i64;
  9151. let delta1 = rng.gen_range(-500..500);
  9152. bank.update_accounts_data_size_delta_on_chain(delta1);
  9153. let delta2 = rng.gen_range(-500..500);
  9154. bank.update_accounts_data_size_delta_off_chain(delta2);
  9155. assert_eq!(
  9156. bank.load_accounts_data_size() as i64,
  9157. initial.saturating_add(delta1).saturating_add(delta2),
  9158. );
  9159. }
  9160. }
  9161. }
  9162. #[derive(Serialize, Deserialize)]
  9163. enum MockReallocInstruction {
  9164. Realloc(usize, u64, Pubkey),
  9165. }
  9166. declare_process_instruction!(MockReallocBuiltin, 1, |invoke_context| {
  9167. let transaction_context = &invoke_context.transaction_context;
  9168. let instruction_context = transaction_context.get_current_instruction_context()?;
  9169. let instruction_data = instruction_context.get_instruction_data();
  9170. if let Ok(instruction) = bincode::deserialize(instruction_data) {
  9171. match instruction {
  9172. MockReallocInstruction::Realloc(new_size, new_balance, _) => {
  9173. // Set data length
  9174. instruction_context
  9175. .try_borrow_instruction_account(1)?
  9176. .set_data_length(new_size)?;
  9177. // set balance
  9178. let current_balance = instruction_context
  9179. .try_borrow_instruction_account(1)?
  9180. .get_lamports();
  9181. let diff_balance = (new_balance as i64).saturating_sub(current_balance as i64);
  9182. let amount = diff_balance.unsigned_abs();
  9183. if diff_balance.is_positive() {
  9184. instruction_context
  9185. .try_borrow_instruction_account(0)?
  9186. .checked_sub_lamports(amount)?;
  9187. instruction_context
  9188. .try_borrow_instruction_account(1)?
  9189. .set_lamports(new_balance)?;
  9190. } else {
  9191. instruction_context
  9192. .try_borrow_instruction_account(0)?
  9193. .checked_add_lamports(amount)?;
  9194. instruction_context
  9195. .try_borrow_instruction_account(1)?
  9196. .set_lamports(new_balance)?;
  9197. }
  9198. Ok(())
  9199. }
  9200. }
  9201. } else {
  9202. Err(InstructionError::InvalidInstructionData)
  9203. }
  9204. });
  9205. fn create_mock_realloc_tx(
  9206. payer: &Keypair,
  9207. funder: &Keypair,
  9208. reallocd: &Pubkey,
  9209. new_size: usize,
  9210. new_balance: u64,
  9211. mock_program_id: Pubkey,
  9212. recent_blockhash: Hash,
  9213. ) -> Transaction {
  9214. let account_metas = vec![
  9215. AccountMeta::new(funder.pubkey(), false),
  9216. AccountMeta::new(*reallocd, false),
  9217. ];
  9218. let instruction = Instruction::new_with_bincode(
  9219. mock_program_id,
  9220. &MockReallocInstruction::Realloc(new_size, new_balance, Pubkey::new_unique()),
  9221. account_metas,
  9222. );
  9223. Transaction::new_signed_with_payer(
  9224. &[instruction],
  9225. Some(&payer.pubkey()),
  9226. &[payer],
  9227. recent_blockhash,
  9228. )
  9229. }
  9230. #[test]
  9231. fn test_resize_and_rent() {
  9232. let GenesisConfigInfo {
  9233. mut genesis_config,
  9234. mint_keypair,
  9235. ..
  9236. } = create_genesis_config_with_leader(1_000_000_000, &Pubkey::new_unique(), 42);
  9237. genesis_config.rent = Rent::default();
  9238. activate_all_features(&mut genesis_config);
  9239. let mock_program_id = Pubkey::new_unique();
  9240. let (bank, _bank_forks) = Bank::new_with_mockup_builtin_for_tests(
  9241. &genesis_config,
  9242. mock_program_id,
  9243. MockReallocBuiltin::vm,
  9244. );
  9245. let recent_blockhash = bank.last_blockhash();
  9246. let account_data_size_small = 1024;
  9247. let rent_exempt_minimum_small = genesis_config.rent.minimum_balance(account_data_size_small);
  9248. let account_data_size_large = 2048;
  9249. let rent_exempt_minimum_large = genesis_config.rent.minimum_balance(account_data_size_large);
  9250. let funding_keypair = Keypair::new();
  9251. bank.store_account(
  9252. &funding_keypair.pubkey(),
  9253. &AccountSharedData::new(1_000_000_000, 0, &mock_program_id),
  9254. );
  9255. let rent_paying_pubkey = solana_pubkey::new_rand();
  9256. let mut rent_paying_account = AccountSharedData::new(
  9257. rent_exempt_minimum_small - 1,
  9258. account_data_size_small,
  9259. &mock_program_id,
  9260. );
  9261. rent_paying_account.set_rent_epoch(1);
  9262. // restore program-owned account
  9263. bank.store_account(&rent_paying_pubkey, &rent_paying_account);
  9264. // rent paying, realloc larger, fail because not rent exempt
  9265. let tx = create_mock_realloc_tx(
  9266. &mint_keypair,
  9267. &funding_keypair,
  9268. &rent_paying_pubkey,
  9269. account_data_size_large,
  9270. rent_exempt_minimum_small - 1,
  9271. mock_program_id,
  9272. recent_blockhash,
  9273. );
  9274. let expected_err = {
  9275. let account_index = tx
  9276. .message
  9277. .account_keys
  9278. .iter()
  9279. .position(|key| key == &rent_paying_pubkey)
  9280. .unwrap() as u8;
  9281. TransactionError::InsufficientFundsForRent { account_index }
  9282. };
  9283. assert_eq!(bank.process_transaction(&tx).unwrap_err(), expected_err);
  9284. assert_eq!(
  9285. rent_exempt_minimum_small - 1,
  9286. bank.get_account(&rent_paying_pubkey).unwrap().lamports()
  9287. );
  9288. // rent paying, realloc larger and rent exempt
  9289. let tx = create_mock_realloc_tx(
  9290. &mint_keypair,
  9291. &funding_keypair,
  9292. &rent_paying_pubkey,
  9293. account_data_size_large,
  9294. rent_exempt_minimum_large,
  9295. mock_program_id,
  9296. recent_blockhash,
  9297. );
  9298. let result = bank.process_transaction(&tx);
  9299. assert!(result.is_ok());
  9300. assert_eq!(
  9301. rent_exempt_minimum_large,
  9302. bank.get_account(&rent_paying_pubkey).unwrap().lamports()
  9303. );
  9304. // rent exempt, realloc small, fail because not rent exempt
  9305. let tx = create_mock_realloc_tx(
  9306. &mint_keypair,
  9307. &funding_keypair,
  9308. &rent_paying_pubkey,
  9309. account_data_size_small,
  9310. rent_exempt_minimum_small - 1,
  9311. mock_program_id,
  9312. recent_blockhash,
  9313. );
  9314. let expected_err = {
  9315. let account_index = tx
  9316. .message
  9317. .account_keys
  9318. .iter()
  9319. .position(|key| key == &rent_paying_pubkey)
  9320. .unwrap() as u8;
  9321. TransactionError::InsufficientFundsForRent { account_index }
  9322. };
  9323. assert_eq!(bank.process_transaction(&tx).unwrap_err(), expected_err);
  9324. assert_eq!(
  9325. rent_exempt_minimum_large,
  9326. bank.get_account(&rent_paying_pubkey).unwrap().lamports()
  9327. );
  9328. // rent exempt, realloc smaller and rent exempt
  9329. let tx = create_mock_realloc_tx(
  9330. &mint_keypair,
  9331. &funding_keypair,
  9332. &rent_paying_pubkey,
  9333. account_data_size_small,
  9334. rent_exempt_minimum_small,
  9335. mock_program_id,
  9336. recent_blockhash,
  9337. );
  9338. let result = bank.process_transaction(&tx);
  9339. assert!(result.is_ok());
  9340. assert_eq!(
  9341. rent_exempt_minimum_small,
  9342. bank.get_account(&rent_paying_pubkey).unwrap().lamports()
  9343. );
  9344. // rent exempt, realloc large, fail because not rent exempt
  9345. let tx = create_mock_realloc_tx(
  9346. &mint_keypair,
  9347. &funding_keypair,
  9348. &rent_paying_pubkey,
  9349. account_data_size_large,
  9350. rent_exempt_minimum_large - 1,
  9351. mock_program_id,
  9352. recent_blockhash,
  9353. );
  9354. let expected_err = {
  9355. let account_index = tx
  9356. .message
  9357. .account_keys
  9358. .iter()
  9359. .position(|key| key == &rent_paying_pubkey)
  9360. .unwrap() as u8;
  9361. TransactionError::InsufficientFundsForRent { account_index }
  9362. };
  9363. assert_eq!(bank.process_transaction(&tx).unwrap_err(), expected_err);
  9364. assert_eq!(
  9365. rent_exempt_minimum_small,
  9366. bank.get_account(&rent_paying_pubkey).unwrap().lamports()
  9367. );
  9368. // rent exempt, realloc large and rent exempt
  9369. let tx = create_mock_realloc_tx(
  9370. &mint_keypair,
  9371. &funding_keypair,
  9372. &rent_paying_pubkey,
  9373. account_data_size_large,
  9374. rent_exempt_minimum_large,
  9375. mock_program_id,
  9376. recent_blockhash,
  9377. );
  9378. let result = bank.process_transaction(&tx);
  9379. assert!(result.is_ok());
  9380. assert_eq!(
  9381. rent_exempt_minimum_large,
  9382. bank.get_account(&rent_paying_pubkey).unwrap().lamports()
  9383. );
  9384. let created_keypair = Keypair::new();
  9385. // create account, not rent exempt
  9386. let tx = system_transaction::create_account(
  9387. &mint_keypair,
  9388. &created_keypair,
  9389. recent_blockhash,
  9390. rent_exempt_minimum_small - 1,
  9391. account_data_size_small as u64,
  9392. &system_program::id(),
  9393. );
  9394. let expected_err = {
  9395. let account_index = tx
  9396. .message
  9397. .account_keys
  9398. .iter()
  9399. .position(|key| key == &created_keypair.pubkey())
  9400. .unwrap() as u8;
  9401. TransactionError::InsufficientFundsForRent { account_index }
  9402. };
  9403. assert_eq!(bank.process_transaction(&tx).unwrap_err(), expected_err);
  9404. // create account, rent exempt
  9405. let tx = system_transaction::create_account(
  9406. &mint_keypair,
  9407. &created_keypair,
  9408. recent_blockhash,
  9409. rent_exempt_minimum_small,
  9410. account_data_size_small as u64,
  9411. &system_program::id(),
  9412. );
  9413. let result = bank.process_transaction(&tx);
  9414. assert!(result.is_ok());
  9415. assert_eq!(
  9416. rent_exempt_minimum_small,
  9417. bank.get_account(&created_keypair.pubkey())
  9418. .unwrap()
  9419. .lamports()
  9420. );
  9421. let created_keypair = Keypair::new();
  9422. // create account, no data
  9423. let tx = system_transaction::create_account(
  9424. &mint_keypair,
  9425. &created_keypair,
  9426. recent_blockhash,
  9427. rent_exempt_minimum_small - 1,
  9428. 0,
  9429. &system_program::id(),
  9430. );
  9431. let result = bank.process_transaction(&tx);
  9432. assert!(result.is_ok());
  9433. assert_eq!(
  9434. rent_exempt_minimum_small - 1,
  9435. bank.get_account(&created_keypair.pubkey())
  9436. .unwrap()
  9437. .lamports()
  9438. );
  9439. // alloc but not rent exempt
  9440. let tx = system_transaction::allocate(
  9441. &mint_keypair,
  9442. &created_keypair,
  9443. recent_blockhash,
  9444. (account_data_size_small + 1) as u64,
  9445. );
  9446. let expected_err = {
  9447. let account_index = tx
  9448. .message
  9449. .account_keys
  9450. .iter()
  9451. .position(|key| key == &created_keypair.pubkey())
  9452. .unwrap() as u8;
  9453. TransactionError::InsufficientFundsForRent { account_index }
  9454. };
  9455. assert_eq!(bank.process_transaction(&tx).unwrap_err(), expected_err);
  9456. // bring balance of account up to rent exemption
  9457. let tx = system_transaction::transfer(
  9458. &mint_keypair,
  9459. &created_keypair.pubkey(),
  9460. 1,
  9461. recent_blockhash,
  9462. );
  9463. let result = bank.process_transaction(&tx);
  9464. assert!(result.is_ok());
  9465. assert_eq!(
  9466. rent_exempt_minimum_small,
  9467. bank.get_account(&created_keypair.pubkey())
  9468. .unwrap()
  9469. .lamports()
  9470. );
  9471. // allocate as rent exempt
  9472. let tx = system_transaction::allocate(
  9473. &mint_keypair,
  9474. &created_keypair,
  9475. recent_blockhash,
  9476. account_data_size_small as u64,
  9477. );
  9478. let result = bank.process_transaction(&tx);
  9479. assert!(result.is_ok());
  9480. assert_eq!(
  9481. rent_exempt_minimum_small,
  9482. bank.get_account(&created_keypair.pubkey())
  9483. .unwrap()
  9484. .lamports()
  9485. );
  9486. }
  9487. /// Ensure that accounts data size is updated correctly on resize transactions
  9488. #[test]
  9489. fn test_accounts_data_size_and_resize_transactions() {
  9490. let GenesisConfigInfo {
  9491. genesis_config,
  9492. mint_keypair,
  9493. ..
  9494. } = genesis_utils::create_genesis_config(100 * LAMPORTS_PER_SOL);
  9495. let mock_program_id = Pubkey::new_unique();
  9496. let (bank, _bank_forks) = Bank::new_with_mockup_builtin_for_tests(
  9497. &genesis_config,
  9498. mock_program_id,
  9499. MockReallocBuiltin::vm,
  9500. );
  9501. let recent_blockhash = bank.last_blockhash();
  9502. let funding_keypair = Keypair::new();
  9503. bank.store_account(
  9504. &funding_keypair.pubkey(),
  9505. &AccountSharedData::new(10 * LAMPORTS_PER_SOL, 0, &mock_program_id),
  9506. );
  9507. let mut rng = rand::thread_rng();
  9508. // Test case: Grow account
  9509. {
  9510. let account_pubkey = Pubkey::new_unique();
  9511. let account_balance = LAMPORTS_PER_SOL;
  9512. let account_size =
  9513. rng.gen_range(1..MAX_PERMITTED_DATA_LENGTH as usize - MAX_PERMITTED_DATA_INCREASE);
  9514. let account_data = AccountSharedData::new(account_balance, account_size, &mock_program_id);
  9515. bank.store_account(&account_pubkey, &account_data);
  9516. let accounts_data_size_before = bank.load_accounts_data_size();
  9517. let account_grow_size = rng.gen_range(1..MAX_PERMITTED_DATA_INCREASE);
  9518. let transaction = create_mock_realloc_tx(
  9519. &mint_keypair,
  9520. &funding_keypair,
  9521. &account_pubkey,
  9522. account_size + account_grow_size,
  9523. account_balance,
  9524. mock_program_id,
  9525. recent_blockhash,
  9526. );
  9527. let result = bank.process_transaction(&transaction);
  9528. assert!(result.is_ok());
  9529. let accounts_data_size_after = bank.load_accounts_data_size();
  9530. assert_eq!(
  9531. accounts_data_size_after,
  9532. accounts_data_size_before.saturating_add(account_grow_size as u64),
  9533. );
  9534. }
  9535. // Test case: Shrink account
  9536. {
  9537. let account_pubkey = Pubkey::new_unique();
  9538. let account_balance = LAMPORTS_PER_SOL;
  9539. let account_size =
  9540. rng.gen_range(MAX_PERMITTED_DATA_LENGTH / 2..MAX_PERMITTED_DATA_LENGTH) as usize;
  9541. let account_data = AccountSharedData::new(account_balance, account_size, &mock_program_id);
  9542. bank.store_account(&account_pubkey, &account_data);
  9543. let accounts_data_size_before = bank.load_accounts_data_size();
  9544. let account_shrink_size = rng.gen_range(1..account_size);
  9545. let transaction = create_mock_realloc_tx(
  9546. &mint_keypair,
  9547. &funding_keypair,
  9548. &account_pubkey,
  9549. account_size - account_shrink_size,
  9550. account_balance,
  9551. mock_program_id,
  9552. recent_blockhash,
  9553. );
  9554. let result = bank.process_transaction(&transaction);
  9555. assert!(result.is_ok());
  9556. let accounts_data_size_after = bank.load_accounts_data_size();
  9557. assert_eq!(
  9558. accounts_data_size_after,
  9559. accounts_data_size_before.saturating_sub(account_shrink_size as u64),
  9560. );
  9561. }
  9562. }
  9563. #[test]
  9564. fn test_accounts_data_size_with_default_bank() {
  9565. let bank = Bank::default_for_tests();
  9566. assert_eq!(
  9567. bank.load_accounts_data_size(),
  9568. bank.calculate_accounts_data_size().unwrap()
  9569. );
  9570. }
  9571. #[test]
  9572. fn test_accounts_data_size_from_genesis() {
  9573. let GenesisConfigInfo {
  9574. mut genesis_config,
  9575. mint_keypair,
  9576. ..
  9577. } = genesis_utils::create_genesis_config_with_leader(
  9578. 1_000_000 * LAMPORTS_PER_SOL,
  9579. &Pubkey::new_unique(),
  9580. 100 * LAMPORTS_PER_SOL,
  9581. );
  9582. genesis_config.rent = Rent::default();
  9583. genesis_config.ticks_per_slot = 3;
  9584. let (mut bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  9585. assert_eq!(
  9586. bank.load_accounts_data_size(),
  9587. bank.calculate_accounts_data_size().unwrap()
  9588. );
  9589. // Create accounts over a number of banks and ensure the accounts data size remains correct
  9590. for _ in 0..10 {
  9591. let slot = bank.slot() + 1;
  9592. bank = new_bank_from_parent_with_bank_forks(
  9593. bank_forks.as_ref(),
  9594. bank,
  9595. &Pubkey::default(),
  9596. slot,
  9597. );
  9598. // Store an account into the bank that is rent-exempt and has data
  9599. let data_size = rand::thread_rng().gen_range(3333..4444);
  9600. let transaction = system_transaction::create_account(
  9601. &mint_keypair,
  9602. &Keypair::new(),
  9603. bank.last_blockhash(),
  9604. genesis_config.rent.minimum_balance(data_size),
  9605. data_size as u64,
  9606. &solana_system_interface::program::id(),
  9607. );
  9608. bank.process_transaction(&transaction).unwrap();
  9609. bank.fill_bank_with_ticks_for_tests();
  9610. assert_eq!(
  9611. bank.load_accounts_data_size(),
  9612. bank.calculate_accounts_data_size().unwrap(),
  9613. );
  9614. }
  9615. }
  9616. /// Ensures that if a transaction exceeds the maximum allowed accounts data allocation size:
  9617. /// 1. The transaction fails
  9618. /// 2. The bank's accounts_data_size is unmodified
  9619. #[test]
  9620. fn test_cap_accounts_data_allocations_per_transaction() {
  9621. const NUM_MAX_SIZE_ALLOCATIONS_PER_TRANSACTION: usize =
  9622. MAX_PERMITTED_ACCOUNTS_DATA_ALLOCATIONS_PER_TRANSACTION as usize
  9623. / MAX_PERMITTED_DATA_LENGTH as usize;
  9624. let (genesis_config, mint_keypair) = create_genesis_config(1_000_000 * LAMPORTS_PER_SOL);
  9625. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  9626. let mut instructions = Vec::new();
  9627. let mut keypairs = vec![mint_keypair.insecure_clone()];
  9628. for _ in 0..=NUM_MAX_SIZE_ALLOCATIONS_PER_TRANSACTION {
  9629. let keypair = Keypair::new();
  9630. let instruction = system_instruction::create_account(
  9631. &mint_keypair.pubkey(),
  9632. &keypair.pubkey(),
  9633. bank.rent_collector()
  9634. .rent
  9635. .minimum_balance(MAX_PERMITTED_DATA_LENGTH as usize),
  9636. MAX_PERMITTED_DATA_LENGTH,
  9637. &solana_system_interface::program::id(),
  9638. );
  9639. keypairs.push(keypair);
  9640. instructions.push(instruction);
  9641. }
  9642. let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
  9643. let signers: Vec<_> = keypairs.iter().collect();
  9644. let transaction = Transaction::new(&signers, message, bank.last_blockhash());
  9645. let accounts_data_size_before = bank.load_accounts_data_size();
  9646. let result = bank.process_transaction(&transaction);
  9647. let accounts_data_size_after = bank.load_accounts_data_size();
  9648. assert_eq!(accounts_data_size_before, accounts_data_size_after);
  9649. assert_eq!(
  9650. result,
  9651. Err(TransactionError::InstructionError(
  9652. NUM_MAX_SIZE_ALLOCATIONS_PER_TRANSACTION as u8,
  9653. solana_instruction::error::InstructionError::MaxAccountsDataAllocationsExceeded,
  9654. )),
  9655. );
  9656. }
  9657. #[test]
  9658. fn test_calculate_fee_with_congestion_multiplier() {
  9659. let lamports_scale: u64 = 5;
  9660. let base_lamports_per_signature: u64 = 5_000;
  9661. let cheap_lamports_per_signature: u64 = base_lamports_per_signature / lamports_scale;
  9662. let expensive_lamports_per_signature: u64 = base_lamports_per_signature * lamports_scale;
  9663. let signature_count: u64 = 2;
  9664. let signature_fee: u64 = 10;
  9665. let fee_structure = FeeStructure {
  9666. lamports_per_signature: signature_fee,
  9667. ..FeeStructure::default()
  9668. };
  9669. // Two signatures, double the fee.
  9670. let key0 = Pubkey::new_unique();
  9671. let key1 = Pubkey::new_unique();
  9672. let ix0 = system_instruction::transfer(&key0, &key1, 1);
  9673. let ix1 = system_instruction::transfer(&key1, &key0, 1);
  9674. let message = new_sanitized_message(Message::new(&[ix0, ix1], Some(&key0)));
  9675. // assert when lamports_per_signature is less than BASE_LAMPORTS, turnning on/off
  9676. // congestion_multiplier has no effect on fee.
  9677. assert_eq!(
  9678. calculate_test_fee(&message, cheap_lamports_per_signature, &fee_structure),
  9679. signature_fee * signature_count
  9680. );
  9681. // assert when lamports_per_signature is more than BASE_LAMPORTS, turnning on/off
  9682. // congestion_multiplier will change calculated fee.
  9683. assert_eq!(
  9684. calculate_test_fee(&message, expensive_lamports_per_signature, &fee_structure,),
  9685. signature_fee * signature_count
  9686. );
  9687. }
  9688. #[test]
  9689. fn test_calculate_fee_with_request_heap_frame_flag() {
  9690. let key0 = Pubkey::new_unique();
  9691. let key1 = Pubkey::new_unique();
  9692. let lamports_per_signature: u64 = 5_000;
  9693. let signature_fee: u64 = 10;
  9694. let request_cu: u64 = 1;
  9695. let lamports_per_cu: u64 = 5;
  9696. let fee_structure = FeeStructure {
  9697. lamports_per_signature: signature_fee,
  9698. ..FeeStructure::default()
  9699. };
  9700. let message = new_sanitized_message(Message::new(
  9701. &[
  9702. system_instruction::transfer(&key0, &key1, 1),
  9703. ComputeBudgetInstruction::set_compute_unit_limit(request_cu as u32),
  9704. ComputeBudgetInstruction::request_heap_frame(40 * 1024),
  9705. ComputeBudgetInstruction::set_compute_unit_price(lamports_per_cu * 1_000_000),
  9706. ],
  9707. Some(&key0),
  9708. ));
  9709. // assert when request_heap_frame is presented in tx, prioritization fee will be counted
  9710. // into transaction fee
  9711. assert_eq!(
  9712. calculate_test_fee(&message, lamports_per_signature, &fee_structure),
  9713. signature_fee + request_cu * lamports_per_cu
  9714. );
  9715. }
  9716. #[test]
  9717. fn test_is_in_slot_hashes_history() {
  9718. use solana_slot_hashes::MAX_ENTRIES;
  9719. let (bank0, _bank_forks) = create_simple_test_arc_bank(1);
  9720. assert!(!bank0.is_in_slot_hashes_history(&0));
  9721. assert!(!bank0.is_in_slot_hashes_history(&1));
  9722. let mut last_bank = bank0;
  9723. for _ in 0..MAX_ENTRIES {
  9724. let new_bank = Arc::new(new_from_parent(last_bank));
  9725. assert!(new_bank.is_in_slot_hashes_history(&0));
  9726. last_bank = new_bank;
  9727. }
  9728. let new_bank = Arc::new(new_from_parent(last_bank));
  9729. assert!(!new_bank.is_in_slot_hashes_history(&0));
  9730. }
  9731. #[test_case(false; "informal_loaded_size")]
  9732. #[test_case(true; "simd186_loaded_size")]
  9733. fn test_feature_activation_loaded_programs_cache_preparation_phase(
  9734. formalize_loaded_transaction_data_size: bool,
  9735. ) {
  9736. solana_logger::setup();
  9737. // Bank Setup
  9738. let (genesis_config, mint_keypair) = create_genesis_config(1_000_000 * LAMPORTS_PER_SOL);
  9739. let mut bank = Bank::new_for_tests(&genesis_config);
  9740. let mut feature_set = FeatureSet::all_enabled();
  9741. feature_set.deactivate(&feature_set::disable_sbpf_v0_execution::id());
  9742. feature_set.deactivate(&feature_set::reenable_sbpf_v0_execution::id());
  9743. if !formalize_loaded_transaction_data_size {
  9744. feature_set.deactivate(&feature_set::formalize_loaded_transaction_data_size::id());
  9745. }
  9746. bank.feature_set = Arc::new(feature_set);
  9747. let (root_bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
  9748. // Program Setup
  9749. let program_keypair = Keypair::new();
  9750. let program_data = include_bytes!("../../../programs/bpf_loader/test_elfs/out/noop_aligned.so");
  9751. let program_account = AccountSharedData::from(Account {
  9752. lamports: Rent::default().minimum_balance(program_data.len()).min(1),
  9753. data: program_data.to_vec(),
  9754. owner: bpf_loader::id(),
  9755. executable: true,
  9756. rent_epoch: 0,
  9757. });
  9758. root_bank.store_account(&program_keypair.pubkey(), &program_account);
  9759. // Compose message using the desired program.
  9760. let instruction = Instruction::new_with_bytes(program_keypair.pubkey(), &[], Vec::new());
  9761. let message = Message::new(&[instruction], Some(&mint_keypair.pubkey()));
  9762. let binding = mint_keypair.insecure_clone();
  9763. let signers = vec![&binding];
  9764. // Advance the bank so that the program becomes effective.
  9765. goto_end_of_slot(root_bank.clone());
  9766. let bank = new_from_parent_with_fork_next_slot(root_bank, bank_forks.as_ref());
  9767. // Load the program with the old environment.
  9768. let transaction = Transaction::new(&signers, message.clone(), bank.last_blockhash());
  9769. let result_without_feature_enabled = bank.process_transaction(&transaction);
  9770. assert_eq!(result_without_feature_enabled, Ok(()));
  9771. // Schedule feature activation to trigger a change of environment at the epoch boundary.
  9772. let feature_account_balance =
  9773. std::cmp::max(genesis_config.rent.minimum_balance(Feature::size_of()), 1);
  9774. bank.store_account(
  9775. &feature_set::disable_sbpf_v0_execution::id(),
  9776. &feature::create_account(&Feature { activated_at: None }, feature_account_balance),
  9777. );
  9778. // Advance the bank to middle of epoch to start the recompilation phase.
  9779. goto_end_of_slot(bank.clone());
  9780. let bank = new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), 16);
  9781. let current_env = bank
  9782. .transaction_processor
  9783. .global_program_cache
  9784. .read()
  9785. .unwrap()
  9786. .get_environments_for_epoch(0)
  9787. .program_runtime_v1;
  9788. let upcoming_env = bank
  9789. .transaction_processor
  9790. .global_program_cache
  9791. .read()
  9792. .unwrap()
  9793. .get_environments_for_epoch(1)
  9794. .program_runtime_v1;
  9795. // Advance the bank to recompile the program.
  9796. {
  9797. let program_cache = bank
  9798. .transaction_processor
  9799. .global_program_cache
  9800. .read()
  9801. .unwrap();
  9802. let slot_versions = program_cache.get_slot_versions_for_tests(&program_keypair.pubkey());
  9803. assert_eq!(slot_versions.len(), 1);
  9804. assert!(Arc::ptr_eq(
  9805. slot_versions[0].program.get_environment().unwrap(),
  9806. &current_env
  9807. ));
  9808. }
  9809. goto_end_of_slot(bank.clone());
  9810. let bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  9811. {
  9812. let program_cache = bank
  9813. .transaction_processor
  9814. .global_program_cache
  9815. .write()
  9816. .unwrap();
  9817. let slot_versions = program_cache.get_slot_versions_for_tests(&program_keypair.pubkey());
  9818. assert_eq!(slot_versions.len(), 2);
  9819. assert!(Arc::ptr_eq(
  9820. slot_versions[0].program.get_environment().unwrap(),
  9821. &upcoming_env
  9822. ));
  9823. assert!(Arc::ptr_eq(
  9824. slot_versions[1].program.get_environment().unwrap(),
  9825. &current_env
  9826. ));
  9827. }
  9828. // Advance the bank to cross the epoch boundary and activate the feature.
  9829. goto_end_of_slot(bank.clone());
  9830. let bank = new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), 33);
  9831. // Load the program with the new environment.
  9832. let transaction = Transaction::new(&signers, message, bank.last_blockhash());
  9833. let result_with_feature_enabled = bank.process_transaction(&transaction);
  9834. assert_eq!(
  9835. result_with_feature_enabled,
  9836. Err(TransactionError::InstructionError(
  9837. 0,
  9838. InstructionError::UnsupportedProgramId
  9839. ))
  9840. );
  9841. }
  9842. #[test]
  9843. fn test_feature_activation_loaded_programs_epoch_transition() {
  9844. solana_logger::setup();
  9845. // Bank Setup
  9846. let (mut genesis_config, mint_keypair) = create_genesis_config(1_000_000 * LAMPORTS_PER_SOL);
  9847. genesis_config
  9848. .accounts
  9849. .remove(&feature_set::disable_fees_sysvar::id());
  9850. genesis_config
  9851. .accounts
  9852. .remove(&feature_set::reenable_sbpf_v0_execution::id());
  9853. let (root_bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  9854. // Program Setup
  9855. let program_keypair = Keypair::new();
  9856. let program_data = include_bytes!("../../../programs/bpf_loader/test_elfs/out/noop_aligned.so");
  9857. let program_account = AccountSharedData::from(Account {
  9858. lamports: Rent::default().minimum_balance(program_data.len()).min(1),
  9859. data: program_data.to_vec(),
  9860. owner: bpf_loader::id(),
  9861. executable: true,
  9862. rent_epoch: 0,
  9863. });
  9864. root_bank.store_account(&program_keypair.pubkey(), &program_account);
  9865. // Compose message using the desired program.
  9866. let instruction = Instruction::new_with_bytes(program_keypair.pubkey(), &[], Vec::new());
  9867. let message = Message::new(&[instruction], Some(&mint_keypair.pubkey()));
  9868. let binding = mint_keypair.insecure_clone();
  9869. let signers = vec![&binding];
  9870. // Advance the bank so that the program becomes effective.
  9871. goto_end_of_slot(root_bank.clone());
  9872. let bank = new_from_parent_with_fork_next_slot(root_bank, bank_forks.as_ref());
  9873. // Load the program with the old environment.
  9874. let transaction = Transaction::new(&signers, message.clone(), bank.last_blockhash());
  9875. assert!(bank.process_transaction(&transaction).is_ok());
  9876. // Schedule feature activation to trigger a change of environment at the epoch boundary.
  9877. let feature_account_balance =
  9878. std::cmp::max(genesis_config.rent.minimum_balance(Feature::size_of()), 1);
  9879. bank.store_account(
  9880. &feature_set::disable_fees_sysvar::id(),
  9881. &feature::create_account(&Feature { activated_at: None }, feature_account_balance),
  9882. );
  9883. // Advance the bank to cross the epoch boundary and activate the feature.
  9884. goto_end_of_slot(bank.clone());
  9885. let bank = new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), 33);
  9886. // Load the program with the new environment.
  9887. let transaction = Transaction::new(&signers, message.clone(), bank.last_blockhash());
  9888. assert!(bank.process_transaction(&transaction).is_ok());
  9889. {
  9890. // Prune for rerooting and thus finishing the recompilation phase.
  9891. let mut program_cache = bank
  9892. .transaction_processor
  9893. .global_program_cache
  9894. .write()
  9895. .unwrap();
  9896. program_cache.prune(bank.slot(), bank.epoch());
  9897. // Unload all (which is only the entry with the new environment)
  9898. program_cache.sort_and_unload(percentage::Percentage::from(0));
  9899. }
  9900. // Reload the unloaded program with the new environment.
  9901. goto_end_of_slot(bank.clone());
  9902. let bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref());
  9903. let transaction = Transaction::new(&signers, message, bank.last_blockhash());
  9904. assert!(bank.process_transaction(&transaction).is_ok());
  9905. }
  9906. #[test]
  9907. fn test_verify_accounts() {
  9908. let GenesisConfigInfo {
  9909. mut genesis_config,
  9910. mint_keypair: mint,
  9911. ..
  9912. } = genesis_utils::create_genesis_config_with_leader(
  9913. 1_000_000 * LAMPORTS_PER_SOL,
  9914. &Pubkey::new_unique(),
  9915. 100 * LAMPORTS_PER_SOL,
  9916. );
  9917. genesis_config.rent = Rent::default();
  9918. genesis_config.ticks_per_slot = 3;
  9919. let do_transfers = |bank: &Bank| {
  9920. let key1 = Keypair::new(); // lamports from mint
  9921. let key2 = Keypair::new(); // will end with ZERO lamports
  9922. let key3 = Keypair::new(); // lamports from key2
  9923. let amount = 123_456_789;
  9924. let fee = {
  9925. let blockhash = bank.last_blockhash();
  9926. let transaction = SanitizedTransaction::from_transaction_for_tests(
  9927. system_transaction::transfer(&key2, &key3.pubkey(), amount, blockhash),
  9928. );
  9929. bank.get_fee_for_message(transaction.message()).unwrap()
  9930. };
  9931. bank.transfer(amount + fee, &mint, &key1.pubkey()).unwrap();
  9932. bank.transfer(amount + fee, &mint, &key2.pubkey()).unwrap();
  9933. bank.transfer(amount + fee, &key2, &key3.pubkey()).unwrap();
  9934. assert_eq!(bank.get_balance(&key2.pubkey()), 0);
  9935. bank.fill_bank_with_ticks_for_tests();
  9936. };
  9937. let (mut bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  9938. // make some banks, do some transactions, ensure there's some zero-lamport accounts
  9939. for _ in 0..4 {
  9940. let slot = bank.slot() + 1;
  9941. bank = new_bank_from_parent_with_bank_forks(
  9942. bank_forks.as_ref(),
  9943. bank,
  9944. &Pubkey::new_unique(),
  9945. slot,
  9946. );
  9947. do_transfers(&bank);
  9948. }
  9949. bank.squash();
  9950. bank.force_flush_accounts_cache();
  9951. // ensure the accounts verify successfully
  9952. assert!(bank.verify_accounts(VerifyAccountsHashConfig::default_for_test(), None));
  9953. }
  9954. #[test]
  9955. fn test_squash_timing_add_assign() {
  9956. let mut t0 = SquashTiming::default();
  9957. let t1 = SquashTiming {
  9958. squash_accounts_ms: 1,
  9959. squash_accounts_cache_ms: 2,
  9960. squash_accounts_index_ms: 3,
  9961. squash_accounts_store_ms: 4,
  9962. squash_cache_ms: 5,
  9963. };
  9964. let expected = SquashTiming {
  9965. squash_accounts_ms: 2,
  9966. squash_accounts_cache_ms: 2 * 2,
  9967. squash_accounts_index_ms: 3 * 2,
  9968. squash_accounts_store_ms: 4 * 2,
  9969. squash_cache_ms: 5 * 2,
  9970. };
  9971. t0 += t1;
  9972. t0 += t1;
  9973. assert!(t0 == expected);
  9974. }
  9975. #[test]
  9976. fn test_system_instruction_allocate() {
  9977. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(LAMPORTS_PER_SOL);
  9978. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  9979. let bank_client = BankClient::new_shared(bank);
  9980. let data_len = 2;
  9981. let amount = genesis_config.rent.minimum_balance(data_len);
  9982. let alice_keypair = Keypair::new();
  9983. let alice_pubkey = alice_keypair.pubkey();
  9984. let seed = "seed";
  9985. let owner = Pubkey::new_unique();
  9986. let alice_with_seed = Pubkey::create_with_seed(&alice_pubkey, seed, &owner).unwrap();
  9987. bank_client
  9988. .transfer_and_confirm(amount, &mint_keypair, &alice_pubkey)
  9989. .unwrap();
  9990. let allocate_with_seed = Message::new(
  9991. &[system_instruction::allocate_with_seed(
  9992. &alice_with_seed,
  9993. &alice_pubkey,
  9994. seed,
  9995. data_len as u64,
  9996. &owner,
  9997. )],
  9998. Some(&alice_pubkey),
  9999. );
  10000. assert!(bank_client
  10001. .send_and_confirm_message(&[&alice_keypair], allocate_with_seed)
  10002. .is_ok());
  10003. let allocate = system_instruction::allocate(&alice_pubkey, data_len as u64);
  10004. assert!(bank_client
  10005. .send_and_confirm_instruction(&alice_keypair, allocate)
  10006. .is_ok());
  10007. }
  10008. fn with_create_zero_lamport<F>(callback: F)
  10009. where
  10010. F: Fn(&Bank),
  10011. {
  10012. solana_logger::setup();
  10013. let alice_keypair = Keypair::new();
  10014. let bob_keypair = Keypair::new();
  10015. let alice_pubkey = alice_keypair.pubkey();
  10016. let bob_pubkey = bob_keypair.pubkey();
  10017. let program = Pubkey::new_unique();
  10018. let collector = Pubkey::new_unique();
  10019. let mint_lamports = LAMPORTS_PER_SOL;
  10020. let len1 = 123;
  10021. let len2 = 456;
  10022. // create initial bank and fund the alice account
  10023. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(mint_lamports);
  10024. let (bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  10025. let bank_client = BankClient::new_shared(bank.clone());
  10026. bank_client
  10027. .transfer_and_confirm(mint_lamports, &mint_keypair, &alice_pubkey)
  10028. .unwrap();
  10029. // create a bank a few epochs in the future..
  10030. let bank = new_from_parent_next_epoch(bank, &bank_forks, 2);
  10031. // create the next bank in the current epoch
  10032. let slot = bank.slot() + 1;
  10033. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &collector, slot);
  10034. // create the next bank where we will store a zero-lamport account to be cleaned
  10035. let slot = bank.slot() + 1;
  10036. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &collector, slot);
  10037. let account = AccountSharedData::new(0, len1, &program);
  10038. bank.store_account(&bob_pubkey, &account);
  10039. // transfer some to bogus pubkey just to make previous bank (=slot) really cleanable
  10040. let slot = bank.slot() + 1;
  10041. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &collector, slot);
  10042. let bank_client = BankClient::new_shared(bank.clone());
  10043. bank_client
  10044. .transfer_and_confirm(
  10045. genesis_config.rent.minimum_balance(0),
  10046. &alice_keypair,
  10047. &Pubkey::new_unique(),
  10048. )
  10049. .unwrap();
  10050. // super fun time; callback chooses to .clean_accounts() or not
  10051. let slot = bank.slot() + 1;
  10052. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &collector, slot);
  10053. callback(&bank);
  10054. // create a normal account at the same pubkey as the zero-lamports account
  10055. let lamports = genesis_config.rent.minimum_balance(len2);
  10056. let slot = bank.slot() + 1;
  10057. let bank = new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank, &collector, slot);
  10058. let bank_client = BankClient::new_shared(bank);
  10059. let ix = system_instruction::create_account(
  10060. &alice_pubkey,
  10061. &bob_pubkey,
  10062. lamports,
  10063. len2 as u64,
  10064. &program,
  10065. );
  10066. let message = Message::new(&[ix], Some(&alice_pubkey));
  10067. let r = bank_client.send_and_confirm_message(&[&alice_keypair, &bob_keypair], message);
  10068. assert!(r.is_ok());
  10069. }
  10070. #[test]
  10071. fn test_create_zero_lamport_with_clean() {
  10072. // DEVELOPER TIP: To debug this test, you may want to add some logging to
  10073. // `AccountsDb::write_accounts_to_storage` to see what accounts are actually
  10074. // in the storage entries
  10075. /*
  10076. for index in 0..accounts_and_meta_to_store.len() {
  10077. accounts_and_meta_to_store.account(index, |account| {
  10078. println!("slot {slot} wrote account {}", account.pubkey());
  10079. })
  10080. }
  10081. */
  10082. with_create_zero_lamport(|bank| {
  10083. bank.freeze();
  10084. bank.squash();
  10085. bank.force_flush_accounts_cache();
  10086. // do clean and assert that it actually did its job
  10087. assert_eq!(6, bank.get_snapshot_storages(None).len());
  10088. bank.clean_accounts();
  10089. assert_eq!(5, bank.get_snapshot_storages(None).len());
  10090. });
  10091. }
  10092. #[test]
  10093. fn test_create_zero_lamport_without_clean() {
  10094. with_create_zero_lamport(|_| {
  10095. // just do nothing; this should behave identically with test_create_zero_lamport_with_clean
  10096. });
  10097. }
  10098. #[test]
  10099. fn test_system_instruction_assign_with_seed() {
  10100. let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee(LAMPORTS_PER_SOL);
  10101. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  10102. let bank_client = BankClient::new_shared(bank);
  10103. let alice_keypair = Keypair::new();
  10104. let alice_pubkey = alice_keypair.pubkey();
  10105. let seed = "seed";
  10106. let owner = Pubkey::new_unique();
  10107. let alice_with_seed = Pubkey::create_with_seed(&alice_pubkey, seed, &owner).unwrap();
  10108. bank_client
  10109. .transfer_and_confirm(
  10110. genesis_config.rent.minimum_balance(0),
  10111. &mint_keypair,
  10112. &alice_pubkey,
  10113. )
  10114. .unwrap();
  10115. let assign_with_seed = Message::new(
  10116. &[system_instruction::assign_with_seed(
  10117. &alice_with_seed,
  10118. &alice_pubkey,
  10119. seed,
  10120. &owner,
  10121. )],
  10122. Some(&alice_pubkey),
  10123. );
  10124. assert!(bank_client
  10125. .send_and_confirm_message(&[&alice_keypair], assign_with_seed)
  10126. .is_ok());
  10127. }
  10128. #[test]
  10129. fn test_system_instruction_unsigned_transaction() {
  10130. let (genesis_config, alice_keypair) = create_genesis_config_no_tx_fee(LAMPORTS_PER_SOL);
  10131. let alice_pubkey = alice_keypair.pubkey();
  10132. let mallory_keypair = Keypair::new();
  10133. let mallory_pubkey = mallory_keypair.pubkey();
  10134. let amount = genesis_config.rent.minimum_balance(0);
  10135. // Fund to account to bypass AccountNotFound error
  10136. let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
  10137. let bank_client = BankClient::new_shared(bank);
  10138. bank_client
  10139. .transfer_and_confirm(amount, &alice_keypair, &mallory_pubkey)
  10140. .unwrap();
  10141. // Erroneously sign transaction with recipient account key
  10142. // No signature case is tested by bank `test_zero_signatures()`
  10143. let account_metas = vec![
  10144. AccountMeta::new(alice_pubkey, false),
  10145. AccountMeta::new(mallory_pubkey, true),
  10146. ];
  10147. let malicious_instruction = Instruction::new_with_bincode(
  10148. system_program::id(),
  10149. &system_instruction::SystemInstruction::Transfer { lamports: amount },
  10150. account_metas,
  10151. );
  10152. assert_eq!(
  10153. bank_client
  10154. .send_and_confirm_instruction(&mallory_keypair, malicious_instruction)
  10155. .unwrap_err()
  10156. .unwrap(),
  10157. TransactionError::InstructionError(0, InstructionError::MissingRequiredSignature)
  10158. );
  10159. assert_eq!(
  10160. bank_client.get_balance(&alice_pubkey).unwrap(),
  10161. LAMPORTS_PER_SOL - amount
  10162. );
  10163. assert_eq!(bank_client.get_balance(&mallory_pubkey).unwrap(), amount);
  10164. }
  10165. #[test]
  10166. fn test_calc_vote_accounts_to_store_empty() {
  10167. let vote_account_rewards = DashMap::default();
  10168. let result = Bank::calc_vote_accounts_to_store(vote_account_rewards);
  10169. assert_eq!(
  10170. result.accounts_with_rewards.len(),
  10171. result.accounts_with_rewards.len()
  10172. );
  10173. assert!(result.accounts_with_rewards.is_empty());
  10174. }
  10175. #[test]
  10176. fn test_calc_vote_accounts_to_store_overflow() {
  10177. let vote_account_rewards = DashMap::default();
  10178. let pubkey = solana_pubkey::new_rand();
  10179. let mut vote_account = AccountSharedData::default();
  10180. vote_account.set_lamports(u64::MAX);
  10181. vote_account_rewards.insert(
  10182. pubkey,
  10183. VoteReward {
  10184. vote_account,
  10185. commission: 0,
  10186. vote_rewards: 1, // enough to overflow
  10187. },
  10188. );
  10189. let result = Bank::calc_vote_accounts_to_store(vote_account_rewards);
  10190. assert_eq!(
  10191. result.accounts_with_rewards.len(),
  10192. result.accounts_with_rewards.len()
  10193. );
  10194. assert!(result.accounts_with_rewards.is_empty());
  10195. }
  10196. #[test]
  10197. fn test_calc_vote_accounts_to_store_normal() {
  10198. let pubkey = solana_pubkey::new_rand();
  10199. for commission in 0..2 {
  10200. for vote_rewards in 0..2 {
  10201. let vote_account_rewards = DashMap::default();
  10202. let mut vote_account = AccountSharedData::default();
  10203. vote_account.set_lamports(1);
  10204. vote_account_rewards.insert(
  10205. pubkey,
  10206. VoteReward {
  10207. vote_account: vote_account.clone(),
  10208. commission,
  10209. vote_rewards,
  10210. },
  10211. );
  10212. let result = Bank::calc_vote_accounts_to_store(vote_account_rewards);
  10213. assert_eq!(
  10214. result.accounts_with_rewards.len(),
  10215. result.accounts_with_rewards.len()
  10216. );
  10217. assert_eq!(result.accounts_with_rewards.len(), 1);
  10218. let (pubkey_result, rewards, account) = &result.accounts_with_rewards[0];
  10219. _ = vote_account.checked_add_lamports(vote_rewards);
  10220. assert!(accounts_equal(account, &vote_account));
  10221. assert_eq!(
  10222. *rewards,
  10223. RewardInfo {
  10224. reward_type: RewardType::Voting,
  10225. lamports: vote_rewards as i64,
  10226. post_balance: vote_account.lamports(),
  10227. commission: Some(commission),
  10228. }
  10229. );
  10230. assert_eq!(*pubkey_result, pubkey);
  10231. }
  10232. }
  10233. }
  10234. #[test]
  10235. fn test_register_hard_fork() {
  10236. fn get_hard_forks(bank: &Bank) -> Vec<Slot> {
  10237. bank.hard_forks().iter().map(|(slot, _)| *slot).collect()
  10238. }
  10239. let (genesis_config, _mint_keypair) = create_genesis_config(10);
  10240. let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
  10241. let bank7 = Bank::new_from_parent(bank0.clone(), &Pubkey::default(), 7);
  10242. bank7.register_hard_fork(6);
  10243. bank7.register_hard_fork(7);
  10244. bank7.register_hard_fork(8);
  10245. // Bank7 will reject slot 6 since it is older, but allow the other two hard forks
  10246. assert_eq!(get_hard_forks(&bank7), vec![7, 8]);
  10247. let bank9 = Bank::new_from_parent(bank0, &Pubkey::default(), 9);
  10248. bank9.freeze();
  10249. bank9.register_hard_fork(9);
  10250. bank9.register_hard_fork(10);
  10251. // Bank9 will reject slot 9 since it has already been frozen
  10252. assert_eq!(get_hard_forks(&bank9), vec![7, 8, 10]);
  10253. }
  10254. #[test]
  10255. fn test_last_restart_slot() {
  10256. fn last_restart_slot_dirty(bank: &Bank) -> bool {
  10257. let dirty_accounts = bank
  10258. .rc
  10259. .accounts
  10260. .accounts_db
  10261. .get_pubkeys_for_slot(bank.slot());
  10262. let dirty_accounts: HashSet<_> = dirty_accounts.into_iter().collect();
  10263. dirty_accounts.contains(&sysvar::last_restart_slot::id())
  10264. }
  10265. fn get_last_restart_slot(bank: &Bank) -> Option<Slot> {
  10266. bank.get_account(&sysvar::last_restart_slot::id())
  10267. .and_then(|account| {
  10268. let lrs: Option<LastRestartSlot> = from_account(&account);
  10269. lrs
  10270. })
  10271. .map(|account| account.last_restart_slot)
  10272. }
  10273. let mint_lamports = 100;
  10274. let validator_stake_lamports = 10;
  10275. let leader_pubkey = Pubkey::default();
  10276. let GenesisConfigInfo {
  10277. mut genesis_config, ..
  10278. } = create_genesis_config_with_leader(mint_lamports, &leader_pubkey, validator_stake_lamports);
  10279. // Remove last restart slot account so we can simluate its' activation
  10280. genesis_config
  10281. .accounts
  10282. .remove(&feature_set::last_restart_slot_sysvar::id())
  10283. .unwrap();
  10284. let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
  10285. // Register a hard fork in the future so last restart slot will update
  10286. bank0.register_hard_fork(6);
  10287. assert!(!last_restart_slot_dirty(&bank0));
  10288. assert_eq!(get_last_restart_slot(&bank0), None);
  10289. let mut bank1 = Arc::new(Bank::new_from_parent(bank0, &Pubkey::default(), 1));
  10290. assert!(!last_restart_slot_dirty(&bank1));
  10291. assert_eq!(get_last_restart_slot(&bank1), None);
  10292. // Activate the feature in slot 1, it will get initialized in slot 1's children
  10293. Arc::get_mut(&mut bank1)
  10294. .unwrap()
  10295. .activate_feature(&feature_set::last_restart_slot_sysvar::id());
  10296. let bank2 = Arc::new(Bank::new_from_parent(bank1.clone(), &Pubkey::default(), 2));
  10297. assert!(last_restart_slot_dirty(&bank2));
  10298. assert_eq!(get_last_restart_slot(&bank2), Some(0));
  10299. let bank3 = Arc::new(Bank::new_from_parent(bank1, &Pubkey::default(), 3));
  10300. assert!(last_restart_slot_dirty(&bank3));
  10301. assert_eq!(get_last_restart_slot(&bank3), Some(0));
  10302. // Not dirty in children where the last restart slot has not changed
  10303. let bank4 = Arc::new(Bank::new_from_parent(bank2, &Pubkey::default(), 4));
  10304. assert!(!last_restart_slot_dirty(&bank4));
  10305. assert_eq!(get_last_restart_slot(&bank4), Some(0));
  10306. let bank5 = Arc::new(Bank::new_from_parent(bank3, &Pubkey::default(), 5));
  10307. assert!(!last_restart_slot_dirty(&bank5));
  10308. assert_eq!(get_last_restart_slot(&bank5), Some(0));
  10309. // Last restart slot has now changed so it will be dirty again
  10310. let bank6 = Arc::new(Bank::new_from_parent(bank4, &Pubkey::default(), 6));
  10311. assert!(last_restart_slot_dirty(&bank6));
  10312. assert_eq!(get_last_restart_slot(&bank6), Some(6));
  10313. // Last restart will not change for a hard fork that has not occurred yet
  10314. bank6.register_hard_fork(10);
  10315. let bank7 = Arc::new(Bank::new_from_parent(bank6, &Pubkey::default(), 7));
  10316. assert!(!last_restart_slot_dirty(&bank7));
  10317. assert_eq!(get_last_restart_slot(&bank7), Some(6));
  10318. }
  10319. /// Test that simulations report the compute units of failed transactions
  10320. #[test]
  10321. fn test_failed_simulation_compute_units() {
  10322. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  10323. let program_id = Pubkey::new_unique();
  10324. let (bank, _bank_forks) =
  10325. Bank::new_with_mockup_builtin_for_tests(&genesis_config, program_id, MockBuiltin::vm);
  10326. const TEST_UNITS: u64 = 10_000;
  10327. const MOCK_BUILTIN_UNITS: u64 = 1;
  10328. let expected_consumed_units = TEST_UNITS + MOCK_BUILTIN_UNITS;
  10329. let expected_loaded_program_account_data_size =
  10330. bank.get_account(&program_id).unwrap().data().len() as u32;
  10331. declare_process_instruction!(MockBuiltin, MOCK_BUILTIN_UNITS, |invoke_context| {
  10332. invoke_context.consume_checked(TEST_UNITS).unwrap();
  10333. Err(InstructionError::InvalidInstructionData)
  10334. });
  10335. let message = Message::new(
  10336. &[Instruction::new_with_bincode(program_id, &0, vec![])],
  10337. Some(&mint_keypair.pubkey()),
  10338. );
  10339. let transaction = Transaction::new(&[&mint_keypair], message, bank.last_blockhash());
  10340. bank.freeze();
  10341. let sanitized = RuntimeTransaction::from_transaction_for_tests(transaction);
  10342. let simulation = bank.simulate_transaction(&sanitized, false);
  10343. assert_eq!(expected_consumed_units, simulation.units_consumed);
  10344. assert_eq!(
  10345. expected_loaded_program_account_data_size,
  10346. simulation.loaded_accounts_data_size
  10347. );
  10348. }
  10349. /// Test that simulations report the load error of fees-only transactions
  10350. #[test]
  10351. fn test_failed_simulation_load_error() {
  10352. let (genesis_config, mint_keypair) = create_genesis_config(LAMPORTS_PER_SOL);
  10353. let bank = Bank::new_for_tests(&genesis_config);
  10354. let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
  10355. let missing_program_id = Pubkey::new_unique();
  10356. let message = Message::new(
  10357. &[Instruction::new_with_bincode(
  10358. missing_program_id,
  10359. &0,
  10360. vec![],
  10361. )],
  10362. Some(&mint_keypair.pubkey()),
  10363. );
  10364. let transaction = Transaction::new(&[&mint_keypair], message, bank.last_blockhash());
  10365. bank.freeze();
  10366. let mint_balance = bank.get_account(&mint_keypair.pubkey()).unwrap().lamports();
  10367. let sanitized = RuntimeTransaction::from_transaction_for_tests(transaction);
  10368. let simulation = bank.simulate_transaction(&sanitized, false);
  10369. assert_eq!(
  10370. simulation,
  10371. TransactionSimulationResult {
  10372. result: Err(TransactionError::ProgramAccountNotFound),
  10373. logs: vec![],
  10374. post_simulation_accounts: vec![],
  10375. units_consumed: 0,
  10376. loaded_accounts_data_size: 0,
  10377. return_data: None,
  10378. inner_instructions: None,
  10379. fee: Some(0),
  10380. pre_balances: Some(vec![mint_balance, 0]),
  10381. post_balances: Some(vec![mint_balance, 0]),
  10382. pre_token_balances: Some(vec![]),
  10383. post_token_balances: Some(vec![]),
  10384. }
  10385. );
  10386. }
  10387. #[test]
  10388. fn test_filter_program_errors_and_collect_fee_details() {
  10389. // TX | PROCESSING RESULT | COLLECT | COLLECT
  10390. // | | (TX_FEE, PRIO_FEE) | RESULT
  10391. // ---------------------------------------------------------------------------------
  10392. // tx1 | not processed | (0 , 0) | Original Err
  10393. // tx2 | processed but not executed | (5_000, 1_000) | Ok
  10394. // tx3 | executed has error | (5_000, 1_000) | Ok
  10395. // tx4 | executed and no error | (5_000, 1_000) | Ok
  10396. //
  10397. let initial_payer_balance = 7_000;
  10398. let tx_fee = 5000;
  10399. let priority_fee = 1000;
  10400. let fee_details = FeeDetails::new(tx_fee, priority_fee);
  10401. let expected_collected_fee_details = CollectorFeeDetails {
  10402. transaction_fee: 3 * tx_fee,
  10403. priority_fee: 3 * priority_fee,
  10404. };
  10405. let GenesisConfigInfo {
  10406. genesis_config,
  10407. mint_keypair,
  10408. ..
  10409. } = create_genesis_config_with_leader(initial_payer_balance, &Pubkey::new_unique(), 3);
  10410. let bank = Bank::new_for_tests(&genesis_config);
  10411. let results = vec![
  10412. Err(TransactionError::AccountNotFound),
  10413. Ok(ProcessedTransaction::FeesOnly(Box::new(
  10414. FeesOnlyTransaction {
  10415. load_error: TransactionError::InvalidProgramForExecution,
  10416. rollback_accounts: RollbackAccounts::default(),
  10417. fee_details,
  10418. },
  10419. ))),
  10420. new_executed_processing_result(
  10421. Err(TransactionError::InstructionError(
  10422. 0,
  10423. SystemError::ResultWithNegativeLamports.into(),
  10424. )),
  10425. fee_details,
  10426. ),
  10427. new_executed_processing_result(Ok(()), fee_details),
  10428. ];
  10429. bank.filter_program_errors_and_collect_fee_details(&results);
  10430. assert_eq!(
  10431. expected_collected_fee_details,
  10432. *bank.collector_fee_details.read().unwrap()
  10433. );
  10434. assert_eq!(
  10435. initial_payer_balance,
  10436. bank.get_balance(&mint_keypair.pubkey())
  10437. );
  10438. }
  10439. #[test]
  10440. fn test_deploy_last_epoch_slot() {
  10441. solana_logger::setup();
  10442. // Bank Setup
  10443. let (mut genesis_config, mint_keypair) = create_genesis_config(1_000_000 * LAMPORTS_PER_SOL);
  10444. activate_feature(
  10445. &mut genesis_config,
  10446. agave_feature_set::enable_loader_v4::id(),
  10447. );
  10448. let bank = Bank::new_for_tests(&genesis_config);
  10449. // go to the last slot in the epoch
  10450. let (bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
  10451. let slots_in_epoch = bank.epoch_schedule().get_slots_in_epoch(0);
  10452. let bank = new_bank_from_parent_with_bank_forks(
  10453. &bank_forks,
  10454. bank,
  10455. &Pubkey::default(),
  10456. slots_in_epoch - 1,
  10457. );
  10458. eprintln!("now at slot {} epoch {}", bank.slot(), bank.epoch());
  10459. // deploy a program
  10460. let payer_keypair = Keypair::new();
  10461. let program_keypair = Keypair::new();
  10462. let mut file = File::open("../programs/bpf_loader/test_elfs/out/noop_aligned.so").unwrap();
  10463. let mut elf = Vec::new();
  10464. file.read_to_end(&mut elf).unwrap();
  10465. let min_program_balance = bank.get_minimum_balance_for_rent_exemption(
  10466. LoaderV4State::program_data_offset().saturating_add(elf.len()),
  10467. );
  10468. let upgrade_authority_keypair = Keypair::new();
  10469. let mut program_account = AccountSharedData::new(
  10470. min_program_balance,
  10471. LoaderV4State::program_data_offset().saturating_add(elf.len()),
  10472. &solana_sdk_ids::loader_v4::id(),
  10473. );
  10474. let program_state = <&mut [u8; LoaderV4State::program_data_offset()]>::try_from(
  10475. program_account
  10476. .data_as_mut_slice()
  10477. .get_mut(0..LoaderV4State::program_data_offset())
  10478. .unwrap(),
  10479. )
  10480. .unwrap();
  10481. let program_state = unsafe {
  10482. std::mem::transmute::<&mut [u8; LoaderV4State::program_data_offset()], &mut LoaderV4State>(
  10483. program_state,
  10484. )
  10485. };
  10486. program_state.authority_address_or_next_version = upgrade_authority_keypair.pubkey();
  10487. program_account
  10488. .data_as_mut_slice()
  10489. .get_mut(LoaderV4State::program_data_offset()..)
  10490. .unwrap()
  10491. .copy_from_slice(&elf);
  10492. let payer_base_balance = LAMPORTS_PER_SOL;
  10493. let deploy_fees = {
  10494. let fee_calculator = genesis_config.fee_rate_governor.create_fee_calculator();
  10495. 3 * fee_calculator.lamports_per_signature
  10496. };
  10497. let min_payer_balance = min_program_balance.saturating_add(deploy_fees);
  10498. bank.store_account(
  10499. &payer_keypair.pubkey(),
  10500. &AccountSharedData::new(
  10501. payer_base_balance.saturating_add(min_payer_balance),
  10502. 0,
  10503. &system_program::id(),
  10504. ),
  10505. );
  10506. bank.store_account(&program_keypair.pubkey(), &program_account);
  10507. let message = Message::new(
  10508. &[loader_v4::deploy(
  10509. &program_keypair.pubkey(),
  10510. &upgrade_authority_keypair.pubkey(),
  10511. )],
  10512. Some(&payer_keypair.pubkey()),
  10513. );
  10514. let signers = &[&payer_keypair, &upgrade_authority_keypair];
  10515. let transaction = Transaction::new(signers, message.clone(), bank.last_blockhash());
  10516. let ret = bank.process_transaction(&transaction);
  10517. assert!(ret.is_ok(), "ret: {ret:?}");
  10518. goto_end_of_slot(bank.clone());
  10519. // go to the first slot in the new epoch
  10520. let bank =
  10521. new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), slots_in_epoch);
  10522. eprintln!("now at slot {} epoch {}", bank.slot(), bank.epoch());
  10523. let instruction = Instruction::new_with_bytes(program_keypair.pubkey(), &[], Vec::new());
  10524. let message = Message::new(&[instruction], Some(&mint_keypair.pubkey()));
  10525. let binding = mint_keypair.insecure_clone();
  10526. let signers = vec![&binding];
  10527. let transaction = Transaction::new(&signers, message, bank.last_blockhash());
  10528. let result_with_feature_enabled = bank.process_transaction(&transaction);
  10529. assert_eq!(result_with_feature_enabled, Ok(()));
  10530. }
  10531. #[test_case(false; "informal_loaded_size")]
  10532. #[test_case(true; "simd186_loaded_size")]
  10533. fn test_loader_v3_to_v4_migration(formalize_loaded_transaction_data_size: bool) {
  10534. solana_logger::setup();
  10535. // Bank Setup
  10536. let (mut genesis_config, mint_keypair) = create_genesis_config(1_000_000 * LAMPORTS_PER_SOL);
  10537. activate_feature(
  10538. &mut genesis_config,
  10539. agave_feature_set::enable_loader_v4::id(),
  10540. );
  10541. let mut bank = Bank::new_for_tests(&genesis_config);
  10542. if formalize_loaded_transaction_data_size {
  10543. bank.activate_feature(&feature_set::formalize_loaded_transaction_data_size::id());
  10544. }
  10545. let (bank, bank_forks) = bank.wrap_with_bank_forks_for_tests();
  10546. let fee_calculator = genesis_config.fee_rate_governor.create_fee_calculator();
  10547. let mut next_slot = 1;
  10548. // deploy a program
  10549. let mut file = File::open("../programs/bpf_loader/test_elfs/out/noop_aligned.so").unwrap();
  10550. let mut elf = Vec::new();
  10551. file.read_to_end(&mut elf).unwrap();
  10552. let program_keypair = Keypair::new();
  10553. let (programdata_address, _) = Pubkey::find_program_address(
  10554. &[program_keypair.pubkey().as_ref()],
  10555. &bpf_loader_upgradeable::id(),
  10556. );
  10557. let payer_keypair = Keypair::new();
  10558. let upgrade_authority_keypair = Keypair::new();
  10559. let min_program_balance =
  10560. bank.get_minimum_balance_for_rent_exemption(UpgradeableLoaderState::size_of_program());
  10561. let mut program_account = AccountSharedData::new(
  10562. min_program_balance,
  10563. UpgradeableLoaderState::size_of_program(),
  10564. &bpf_loader_upgradeable::id(),
  10565. );
  10566. program_account
  10567. .set_state(&UpgradeableLoaderState::Program {
  10568. programdata_address,
  10569. })
  10570. .unwrap();
  10571. bank.store_account(&program_keypair.pubkey(), &program_account);
  10572. let closed_programdata_account = AccountSharedData::new(0, 0, &bpf_loader_upgradeable::id());
  10573. let mut uninitialized_programdata_account = AccountSharedData::new(
  10574. 0,
  10575. UpgradeableLoaderState::size_of_programdata_metadata(),
  10576. &bpf_loader_upgradeable::id(),
  10577. );
  10578. uninitialized_programdata_account
  10579. .set_state(&UpgradeableLoaderState::Uninitialized)
  10580. .unwrap();
  10581. let mut finalized_programdata_account = AccountSharedData::new(
  10582. 0,
  10583. UpgradeableLoaderState::size_of_programdata(elf.len()),
  10584. &bpf_loader_upgradeable::id(),
  10585. );
  10586. finalized_programdata_account
  10587. .set_state(&UpgradeableLoaderState::ProgramData {
  10588. slot: 0,
  10589. upgrade_authority_address: None,
  10590. })
  10591. .unwrap();
  10592. finalized_programdata_account
  10593. .data_as_mut_slice()
  10594. .get_mut(UpgradeableLoaderState::size_of_programdata_metadata()..)
  10595. .unwrap()
  10596. .copy_from_slice(&elf);
  10597. let message = Message::new(
  10598. &[
  10599. solana_loader_v3_interface::instruction::migrate_program(
  10600. &programdata_address,
  10601. &program_keypair.pubkey(),
  10602. &program_keypair.pubkey(),
  10603. ),
  10604. ComputeBudgetInstruction::set_compute_unit_limit(12_000),
  10605. ],
  10606. Some(&payer_keypair.pubkey()),
  10607. );
  10608. let signers = &[&payer_keypair, &program_keypair];
  10609. let finalized_migration_transaction =
  10610. Transaction::new(signers, message.clone(), bank.last_blockhash());
  10611. let mut upgradeable_programdata_account = AccountSharedData::new(
  10612. 0,
  10613. UpgradeableLoaderState::size_of_programdata(elf.len()),
  10614. &bpf_loader_upgradeable::id(),
  10615. );
  10616. let min_programdata_balance =
  10617. bank.get_minimum_balance_for_rent_exemption(upgradeable_programdata_account.data().len());
  10618. upgradeable_programdata_account.set_lamports(min_programdata_balance);
  10619. upgradeable_programdata_account
  10620. .set_state(&UpgradeableLoaderState::ProgramData {
  10621. slot: 0,
  10622. upgrade_authority_address: Some(upgrade_authority_keypair.pubkey()),
  10623. })
  10624. .unwrap();
  10625. upgradeable_programdata_account
  10626. .data_as_mut_slice()
  10627. .get_mut(UpgradeableLoaderState::size_of_programdata_metadata()..)
  10628. .unwrap()
  10629. .copy_from_slice(&elf);
  10630. let message = Message::new(
  10631. &[
  10632. solana_loader_v3_interface::instruction::migrate_program(
  10633. &programdata_address,
  10634. &program_keypair.pubkey(),
  10635. &upgrade_authority_keypair.pubkey(),
  10636. ),
  10637. ComputeBudgetInstruction::set_compute_unit_limit(10_000),
  10638. ],
  10639. Some(&payer_keypair.pubkey()),
  10640. );
  10641. let signers = &[&payer_keypair, &upgrade_authority_keypair];
  10642. let upgradeable_migration_transaction =
  10643. Transaction::new(signers, message.clone(), bank.last_blockhash());
  10644. let payer_account = AccountSharedData::new(LAMPORTS_PER_SOL, 0, &system_program::id());
  10645. bank.store_account(
  10646. &programdata_address,
  10647. &upgradeable_programdata_account.clone(),
  10648. );
  10649. bank.store_account(&payer_keypair.pubkey(), &payer_account);
  10650. // Error case: Program was deployed in this block already
  10651. let case_redeployment_cooldown = vec![
  10652. AccountMeta::new(programdata_address, false),
  10653. AccountMeta::new(programdata_address, false),
  10654. AccountMeta::new(programdata_address, false),
  10655. ];
  10656. let message = Message::new(
  10657. &[Instruction::new_with_bincode(
  10658. bpf_loader_upgradeable::id(),
  10659. &UpgradeableLoaderInstruction::Migrate,
  10660. case_redeployment_cooldown,
  10661. )],
  10662. Some(&payer_keypair.pubkey()),
  10663. );
  10664. let signers = &[&payer_keypair];
  10665. let transaction = Transaction::new(signers, message.clone(), bank.last_blockhash());
  10666. let error = bank.process_transaction(&transaction).unwrap_err();
  10667. assert_eq!(
  10668. error,
  10669. TransactionError::InstructionError(0, InstructionError::InvalidArgument)
  10670. );
  10671. let bank = new_bank_from_parent_with_bank_forks(
  10672. &bank_forks,
  10673. bank.clone(),
  10674. &Pubkey::default(),
  10675. next_slot,
  10676. );
  10677. next_slot += 1;
  10678. // All other error cases
  10679. let case_too_few_accounts = vec![
  10680. AccountMeta::new(programdata_address, false),
  10681. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), true),
  10682. ];
  10683. let case_readonly_programdata = vec![
  10684. AccountMeta::new_readonly(programdata_address, false),
  10685. AccountMeta::new(program_keypair.pubkey(), false),
  10686. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), true),
  10687. ];
  10688. let case_incorrect_authority = vec![
  10689. AccountMeta::new(programdata_address, false),
  10690. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), true),
  10691. AccountMeta::new(program_keypair.pubkey(), false),
  10692. ];
  10693. let case_missing_signature = vec![
  10694. AccountMeta::new(programdata_address, false),
  10695. AccountMeta::new(program_keypair.pubkey(), false),
  10696. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), false),
  10697. ];
  10698. let case_readonly_program = vec![
  10699. AccountMeta::new(programdata_address, false),
  10700. AccountMeta::new_readonly(program_keypair.pubkey(), false),
  10701. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), true),
  10702. ];
  10703. let case_program_has_wrong_owner = vec![
  10704. AccountMeta::new(programdata_address, false),
  10705. AccountMeta::new(upgrade_authority_keypair.pubkey(), false),
  10706. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), true),
  10707. ];
  10708. let case_incorrect_programdata_address = vec![
  10709. AccountMeta::new(program_keypair.pubkey(), false),
  10710. AccountMeta::new(program_keypair.pubkey(), false),
  10711. AccountMeta::new_readonly(program_keypair.pubkey(), true),
  10712. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), true),
  10713. ];
  10714. let case_invalid_program_account = vec![
  10715. AccountMeta::new(programdata_address, false),
  10716. AccountMeta::new(programdata_address, false),
  10717. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), true),
  10718. ];
  10719. let case_missing_loader_v4 = vec![
  10720. AccountMeta::new(programdata_address, false),
  10721. AccountMeta::new(program_keypair.pubkey(), false),
  10722. AccountMeta::new_readonly(upgrade_authority_keypair.pubkey(), true),
  10723. ];
  10724. for (instruction_accounts, expected_error) in [
  10725. (
  10726. case_too_few_accounts,
  10727. InstructionError::NotEnoughAccountKeys,
  10728. ),
  10729. (case_readonly_programdata, InstructionError::InvalidArgument),
  10730. (
  10731. case_incorrect_authority,
  10732. InstructionError::IncorrectAuthority,
  10733. ),
  10734. (
  10735. case_missing_signature,
  10736. InstructionError::MissingRequiredSignature,
  10737. ),
  10738. (case_readonly_program, InstructionError::InvalidArgument),
  10739. (
  10740. case_program_has_wrong_owner,
  10741. InstructionError::IncorrectProgramId,
  10742. ),
  10743. (
  10744. case_incorrect_programdata_address,
  10745. InstructionError::InvalidArgument,
  10746. ),
  10747. (
  10748. case_invalid_program_account,
  10749. InstructionError::InvalidAccountData,
  10750. ),
  10751. (case_missing_loader_v4, InstructionError::MissingAccount),
  10752. ] {
  10753. let message = Message::new(
  10754. &[Instruction::new_with_bincode(
  10755. bpf_loader_upgradeable::id(),
  10756. &UpgradeableLoaderInstruction::Migrate,
  10757. instruction_accounts,
  10758. )],
  10759. Some(&payer_keypair.pubkey()),
  10760. );
  10761. let signers = &[&payer_keypair, &upgrade_authority_keypair, &program_keypair];
  10762. let transaction = Transaction::new(
  10763. &signers[..message.header.num_required_signatures as usize],
  10764. message.clone(),
  10765. bank.last_blockhash(),
  10766. );
  10767. let error = bank.process_transaction(&transaction).unwrap_err();
  10768. assert_eq!(error, TransactionError::InstructionError(0, expected_error));
  10769. }
  10770. for (mut programdata_account, transaction, expected_execution_result) in [
  10771. (
  10772. closed_programdata_account,
  10773. finalized_migration_transaction.clone(),
  10774. Err(TransactionError::InstructionError(
  10775. 0,
  10776. InstructionError::UnsupportedProgramId,
  10777. )),
  10778. ),
  10779. (
  10780. uninitialized_programdata_account,
  10781. finalized_migration_transaction.clone(),
  10782. Err(TransactionError::InstructionError(
  10783. 0,
  10784. InstructionError::UnsupportedProgramId,
  10785. )),
  10786. ),
  10787. (
  10788. finalized_programdata_account,
  10789. finalized_migration_transaction,
  10790. Ok(()),
  10791. ),
  10792. (
  10793. upgradeable_programdata_account,
  10794. upgradeable_migration_transaction,
  10795. Ok(()),
  10796. ),
  10797. ] {
  10798. let bank = new_bank_from_parent_with_bank_forks(
  10799. &bank_forks,
  10800. bank.clone(),
  10801. &Pubkey::default(),
  10802. next_slot,
  10803. );
  10804. next_slot += 1;
  10805. let min_programdata_balance =
  10806. bank.get_minimum_balance_for_rent_exemption(programdata_account.data().len());
  10807. programdata_account.set_lamports(min_programdata_balance);
  10808. let payer_balance = min_program_balance
  10809. .saturating_add(min_programdata_balance)
  10810. .saturating_add(LAMPORTS_PER_SOL)
  10811. .saturating_add(fee_calculator.lamports_per_signature);
  10812. let payer_account = AccountSharedData::new(payer_balance, 0, &system_program::id());
  10813. bank.store_account(&programdata_address, &programdata_account);
  10814. bank.store_account(&payer_keypair.pubkey(), &payer_account);
  10815. let result = bank.process_transaction(&transaction);
  10816. assert!(result.is_ok(), "result: {result:?}");
  10817. goto_end_of_slot(bank.clone());
  10818. let bank =
  10819. new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), next_slot);
  10820. next_slot += 1;
  10821. let instruction = Instruction::new_with_bytes(program_keypair.pubkey(), &[], Vec::new());
  10822. let message = Message::new(&[instruction], Some(&mint_keypair.pubkey()));
  10823. let binding = mint_keypair.insecure_clone();
  10824. let transaction = Transaction::new(&[&binding], message, bank.last_blockhash());
  10825. let execution_result = bank.process_transaction(&transaction);
  10826. assert_eq!(execution_result, expected_execution_result);
  10827. }
  10828. }
  10829. #[test]
  10830. fn test_blockhash_last_valid_block_height() {
  10831. let genesis_config = GenesisConfig::default();
  10832. let mut bank = Arc::new(Bank::new_for_tests(&genesis_config));
  10833. // valid until MAX_PROCESSING_AGE
  10834. let last_blockhash = bank.last_blockhash();
  10835. for i in 1..=MAX_PROCESSING_AGE as u64 {
  10836. goto_end_of_slot(bank.clone());
  10837. bank = Arc::new(new_from_parent(bank));
  10838. assert_eq!(i, bank.block_height);
  10839. let last_valid_block_height = bank
  10840. .get_blockhash_last_valid_block_height(&last_blockhash)
  10841. .unwrap();
  10842. assert_eq!(
  10843. last_valid_block_height,
  10844. bank.block_height + MAX_PROCESSING_AGE as u64 - i
  10845. );
  10846. assert!(bank.is_blockhash_valid(&last_blockhash));
  10847. }
  10848. // Make sure it stays in the queue until `MAX_RECENT_BLOCKHASHES`
  10849. for i in MAX_PROCESSING_AGE + 1..=MAX_RECENT_BLOCKHASHES {
  10850. goto_end_of_slot(bank.clone());
  10851. bank = Arc::new(new_from_parent(bank));
  10852. assert_eq!(bank.block_height, i as u64);
  10853. // the blockhash is outside of the processing age, but still present in the queue,
  10854. // so the call to get the block height still works even though it's in the past
  10855. let last_valid_block_height = bank
  10856. .get_blockhash_last_valid_block_height(&last_blockhash)
  10857. .unwrap();
  10858. assert_eq!(last_valid_block_height, MAX_PROCESSING_AGE as u64);
  10859. // But it isn't valid for processing
  10860. assert!(!bank.is_blockhash_valid(&last_blockhash));
  10861. }
  10862. // one past MAX_RECENT_BLOCKHASHES is no longer present at all
  10863. goto_end_of_slot(bank.clone());
  10864. bank = Arc::new(new_from_parent(bank));
  10865. assert_eq!(
  10866. bank.get_blockhash_last_valid_block_height(&last_blockhash),
  10867. None
  10868. );
  10869. assert!(!bank.is_blockhash_valid(&last_blockhash));
  10870. }
  10871. #[test]
  10872. fn test_bank_epoch_stakes() {
  10873. solana_logger::setup();
  10874. let num_of_nodes: u64 = 30;
  10875. let stakes = (1..num_of_nodes.checked_add(1).expect("Shouldn't be big")).collect::<Vec<_>>();
  10876. let voting_keypairs = stakes
  10877. .iter()
  10878. .map(|_| ValidatorVoteKeypairs::new_rand())
  10879. .collect::<Vec<_>>();
  10880. let total_stake = stakes.iter().sum();
  10881. let GenesisConfigInfo { genesis_config, .. } =
  10882. create_genesis_config_with_vote_accounts(1_000_000_000, &voting_keypairs, stakes.clone());
  10883. let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
  10884. let mut bank1 = Bank::new_from_parent(
  10885. bank0.clone(),
  10886. &Pubkey::default(),
  10887. bank0.get_slots_in_epoch(0) + 1,
  10888. );
  10889. let initial_epochs = bank0.epoch_stake_keys();
  10890. assert_eq!(initial_epochs, vec![0, 1]);
  10891. // Bank 0:
  10892. // First query with bank's epoch. As noted by the above check, the epoch
  10893. // stakes cache actually contains values for the _leader schedule_ epoch
  10894. // (N + 1). Therefore, we should be able to query both.
  10895. assert_eq!(bank0.epoch(), 0);
  10896. assert_eq!(bank0.epoch_total_stake(0), Some(total_stake));
  10897. assert_eq!(bank0.epoch_node_id_to_stake(0, &Pubkey::new_unique()), None);
  10898. for (i, keypair) in voting_keypairs.iter().enumerate() {
  10899. assert_eq!(
  10900. bank0.epoch_node_id_to_stake(0, &keypair.node_keypair.pubkey()),
  10901. Some(stakes[i])
  10902. );
  10903. }
  10904. // Now query for epoch 1 on bank 0.
  10905. assert_eq!(bank0.epoch().saturating_add(1), 1);
  10906. assert_eq!(bank0.epoch_total_stake(1), Some(total_stake));
  10907. assert_eq!(bank0.epoch_node_id_to_stake(1, &Pubkey::new_unique()), None);
  10908. for (i, keypair) in voting_keypairs.iter().enumerate() {
  10909. assert_eq!(
  10910. bank0.epoch_node_id_to_stake(1, &keypair.node_keypair.pubkey()),
  10911. Some(stakes[i])
  10912. );
  10913. }
  10914. // Note using bank's `current_epoch_stake_*` methods should return the
  10915. // same values.
  10916. assert_eq!(bank0.get_current_epoch_total_stake(), total_stake);
  10917. assert_eq!(
  10918. bank0.get_current_epoch_total_stake(),
  10919. bank0.epoch_total_stake(1).unwrap(),
  10920. );
  10921. assert_eq!(
  10922. bank0.get_current_epoch_vote_accounts().len(),
  10923. voting_keypairs.len()
  10924. );
  10925. assert_eq!(
  10926. bank0.epoch_vote_accounts(1).unwrap(),
  10927. bank0.get_current_epoch_vote_accounts(),
  10928. );
  10929. // Bank 1:
  10930. // Run the same exercise. First query the bank's epoch.
  10931. assert_eq!(bank1.epoch(), 1);
  10932. assert_eq!(bank1.epoch_total_stake(1), Some(total_stake));
  10933. assert_eq!(bank1.epoch_node_id_to_stake(1, &Pubkey::new_unique()), None);
  10934. for (i, keypair) in voting_keypairs.iter().enumerate() {
  10935. assert_eq!(
  10936. bank1.epoch_node_id_to_stake(1, &keypair.node_keypair.pubkey()),
  10937. Some(stakes[i])
  10938. );
  10939. }
  10940. // Now query for epoch 2 on bank 1.
  10941. assert_eq!(bank1.epoch().saturating_add(1), 2);
  10942. assert_eq!(bank1.epoch_total_stake(2), Some(total_stake));
  10943. assert_eq!(bank1.epoch_node_id_to_stake(2, &Pubkey::new_unique()), None);
  10944. for (i, keypair) in voting_keypairs.iter().enumerate() {
  10945. assert_eq!(
  10946. bank1.epoch_node_id_to_stake(2, &keypair.node_keypair.pubkey()),
  10947. Some(stakes[i])
  10948. );
  10949. }
  10950. // Again, using bank's `current_epoch_stake_*` methods should return the
  10951. // same values.
  10952. assert_eq!(bank1.get_current_epoch_total_stake(), total_stake);
  10953. assert_eq!(
  10954. bank1.get_current_epoch_total_stake(),
  10955. bank1.epoch_total_stake(2).unwrap(),
  10956. );
  10957. assert_eq!(
  10958. bank1.get_current_epoch_vote_accounts().len(),
  10959. voting_keypairs.len()
  10960. );
  10961. assert_eq!(
  10962. bank1.epoch_vote_accounts(2).unwrap(),
  10963. bank1.get_current_epoch_vote_accounts(),
  10964. );
  10965. // Setup new epoch stakes on Bank 1 for both leader schedule epochs.
  10966. let make_new_epoch_stakes = |stake_coefficient: u64| {
  10967. VersionedEpochStakes::new_for_tests(
  10968. voting_keypairs
  10969. .iter()
  10970. .map(|keypair| {
  10971. let node_id = keypair.node_keypair.pubkey();
  10972. let authorized_voter = keypair.vote_keypair.pubkey();
  10973. let vote_account = VoteAccount::try_from(create_account_with_authorized(
  10974. &node_id,
  10975. &authorized_voter,
  10976. &node_id,
  10977. 0,
  10978. 100,
  10979. ))
  10980. .unwrap();
  10981. (authorized_voter, (stake_coefficient, vote_account))
  10982. })
  10983. .collect::<HashMap<_, _>>(),
  10984. 1,
  10985. )
  10986. };
  10987. let stake_coefficient_epoch_1 = 100;
  10988. let stake_coefficient_epoch_2 = 500;
  10989. bank1.set_epoch_stakes_for_test(1, make_new_epoch_stakes(stake_coefficient_epoch_1));
  10990. bank1.set_epoch_stakes_for_test(2, make_new_epoch_stakes(stake_coefficient_epoch_2));
  10991. // Run the exercise again with the new stake. Now epoch 1 should have the
  10992. // stake added for epoch 1 (`stake_coefficient_epoch_1`).
  10993. assert_eq!(
  10994. bank1.epoch_total_stake(1),
  10995. Some(stake_coefficient_epoch_1 * num_of_nodes)
  10996. );
  10997. assert_eq!(bank1.epoch_node_id_to_stake(1, &Pubkey::new_unique()), None);
  10998. for keypair in voting_keypairs.iter() {
  10999. assert_eq!(
  11000. bank1.epoch_node_id_to_stake(1, &keypair.node_keypair.pubkey()),
  11001. Some(stake_coefficient_epoch_1)
  11002. );
  11003. }
  11004. // Now query for epoch 2 on bank 1. Epoch 2 should have the stake added for
  11005. // epoch 2 (`stake_coefficient_epoch_2`).
  11006. assert_eq!(
  11007. bank1.epoch_total_stake(2),
  11008. Some(stake_coefficient_epoch_2 * num_of_nodes)
  11009. );
  11010. assert_eq!(bank1.epoch_node_id_to_stake(2, &Pubkey::new_unique()), None);
  11011. for keypair in voting_keypairs.iter() {
  11012. assert_eq!(
  11013. bank1.epoch_node_id_to_stake(2, &keypair.node_keypair.pubkey()),
  11014. Some(stake_coefficient_epoch_2)
  11015. );
  11016. }
  11017. }
  11018. /// Ensure rehash() does *not* change the bank hash if accounts are unmodified
  11019. #[test]
  11020. fn test_rehash_accounts_unmodified() {
  11021. let ten_sol = 10 * LAMPORTS_PER_SOL;
  11022. let genesis_config_info = genesis_utils::create_genesis_config(ten_sol);
  11023. let bank = Bank::new_for_tests(&genesis_config_info.genesis_config);
  11024. let lamports = 123_456_789;
  11025. let account = AccountSharedData::new(lamports, 0, &Pubkey::default());
  11026. let pubkey = Pubkey::new_unique();
  11027. bank.store_account_and_update_capitalization(&pubkey, &account);
  11028. // freeze the bank to trigger hash calculation
  11029. bank.freeze();
  11030. // ensure the bank hash is the same before and after rehashing
  11031. let prev_bank_hash = bank.hash();
  11032. bank.rehash();
  11033. let post_bank_hash = bank.hash();
  11034. assert_eq!(post_bank_hash, prev_bank_hash);
  11035. }
  11036. #[test]
  11037. fn test_should_use_vote_keyed_leader_schedule() {
  11038. let genesis_config = genesis_utils::create_genesis_config(10_000).genesis_config;
  11039. let epoch_schedule = &genesis_config.epoch_schedule;
  11040. let create_test_bank = |bank_epoch: Epoch, feature_activation_slot: Option<Slot>| -> Bank {
  11041. let mut bank = Bank::new_for_tests(&genesis_config);
  11042. bank.epoch = bank_epoch;
  11043. let mut feature_set = FeatureSet::default();
  11044. if let Some(feature_activation_slot) = feature_activation_slot {
  11045. let feature_activation_epoch = bank.epoch_schedule().get_epoch(feature_activation_slot);
  11046. assert!(feature_activation_epoch <= bank_epoch);
  11047. feature_set.activate(
  11048. &agave_feature_set::enable_vote_address_leader_schedule::id(),
  11049. feature_activation_slot,
  11050. );
  11051. }
  11052. bank.feature_set = Arc::new(feature_set);
  11053. bank
  11054. };
  11055. // Test feature activation at genesis
  11056. let test_bank = create_test_bank(0, Some(0));
  11057. for epoch in 0..10 {
  11058. assert_eq!(
  11059. test_bank.should_use_vote_keyed_leader_schedule(epoch),
  11060. Some(true),
  11061. );
  11062. }
  11063. // Test feature activated in previous epoch
  11064. let slot_in_prev_epoch = epoch_schedule.get_first_slot_in_epoch(1);
  11065. let test_bank = create_test_bank(2, Some(slot_in_prev_epoch));
  11066. for epoch in 0..=(test_bank.epoch + 1) {
  11067. assert_eq!(
  11068. test_bank.should_use_vote_keyed_leader_schedule(epoch),
  11069. Some(epoch >= test_bank.epoch),
  11070. );
  11071. }
  11072. // Test feature activated in current epoch
  11073. let current_epoch_slot = epoch_schedule.get_last_slot_in_epoch(1);
  11074. let test_bank = create_test_bank(1, Some(current_epoch_slot));
  11075. for epoch in 0..=(test_bank.epoch + 1) {
  11076. assert_eq!(
  11077. test_bank.should_use_vote_keyed_leader_schedule(epoch),
  11078. Some(epoch > test_bank.epoch),
  11079. );
  11080. }
  11081. // Test feature not activated yet
  11082. let test_bank = create_test_bank(1, None);
  11083. let max_cached_leader_schedule = epoch_schedule.get_leader_schedule_epoch(test_bank.slot());
  11084. for epoch in 0..=(max_cached_leader_schedule + 1) {
  11085. if epoch <= max_cached_leader_schedule {
  11086. assert_eq!(
  11087. test_bank.should_use_vote_keyed_leader_schedule(epoch),
  11088. Some(false),
  11089. );
  11090. } else {
  11091. assert_eq!(test_bank.should_use_vote_keyed_leader_schedule(epoch), None);
  11092. }
  11093. }
  11094. }