2. The only problem is the time it takes to open a large file to write one line. That's why everything was so slow. With a table, even just with an Int *var array, everything happens much faster. I accumulated 1024 points, opened the file and wrote it down, and so on in a circle. There you just need to add a counter and conditions, rewrite the File2save() function. But I have already rewritten it, which I advise you to do as well. I agree this will take some time. Github has not been updated. After these changes, the speed increased. 3. The periods for preserving the working herd of kangaroos are set once every 10 minutes. Flags are set based on the timer, and based on the presence of flags, data from the GPU is uploaded to the array. Next, they are written from the array to the work file. Function SaveWorkKangaroosToFile(). And when the program is restarted, on the contrary, the start keys are not generated, but are unloaded from the file. Function LoadWorkKangaroosFromFile(). 4. Text files provide an advantage, since you do not need to process a large table with data every time. The table is cleared - this is also time. And the array can simply be rewritten. There is a difference? I saved a small file and spat it out to the server via a socket.
I already tried all these steps. Some physical maximum is around 600 Mkeys - if you manage to hack the CUDA kernel (+GPU BIOS modding) we will probably reach 1000-1200 Mkeys as stated by the Philosopher. I think more and more that we need a very fast (predefined?) database(via unix socket) - instead of text files. Has anyone tried to make Kangaroo in PHP? Just thoughts from my notes: Create a MySQL database that will store the data for the tame and wild herds. Create tables to store the data, with appropriate fields such as 'x' and 'y' for points. Create a PHP script that connects to the MySQL database and performs the required operations. Use PHP's mysqli or PDO to establish a connection to your MySQL database. Create a PHP class similar to the 'Point' class in the code to represent points on the elliptic curve. Translate the mathematical functions egcd, rev, mul2, add, mulk, X2Y*(or whatever you call them), and check into PHP. Replace specific libraries or functions with their PHP equivalents. Modify the file reading/writing functions to interact with your MySQL database. Replace file I/O operations with database query and update operations. Use PHP's rand() or random_int() to generate random numbers. Define the constants (modulo, order, Gx, Gy, etc.) in your PHP script. Modify the output to store results or print information as needed. etc... Share a Kangaroo MySQL database across the globe. (Peer-to-Peer)
|
|
|
Guys come on, seeing a few things like puzzle 66, sha256 double, base58 in your scripts is a turn off.🤣
For how long you are going to stick with finding addresses? I believe I have said this before, you don't need to go beyond rmd160 check, just generate public key, do a sha256 and a rmd160 then compare with rmd160 of puzzle, when you convert rmd160 to address, you are doing the following which is unnecessary : adding network byte + sha256d + taking checksum + adding checksum + encoding to base58. So 5 extra steps, 5 useless operations per key.
You can condense the code into a one-liner to calculate the RIPEMD-160 hash from a decimal private key as follows: import sys, random, hashlib, ecdsa while True: dec = random.randint(36893488147419103231, 73786976294838206463) h160 = hashlib.new('ripemd160', hashlib.sha256(ecdsa.SigningKey.from_string((b'\x00' * 32)[:-len(dec.to_bytes((dec.bit_length() + 7) // 8, 'big'))] + dec.to_bytes((dec.bit_length() + 7) // 8, 'big'), curve=ecdsa.SECP256k1).get_verifying_key().to_string("compressed")).digest()).digest() message = "\r{}".format(h160.hex());messages = [];messages.append(message);output = "\033[01;33m" + ''.join(messages) + "\r";sys.stdout.write(output);sys.stdout.flush() if h160.hex()=='20d45a6a762535700ce9e0b216e31994335db8a5':print(dec);break But this means absolutely nothing in terms of shortening the task. 5, 50, 500, even 1000 Mkeys means nothing realistically. We need much, much, much more speed p.s. I don't even think C++ is enough. We would have to invent a new programming language.
|
|
|
the interest in hacking began to fade
This is all a conspiracy from the beginning, isn't it?
|
|
|
I mean, first of all, what kind of wallet software can you use to "randomly" generate 256 keys that are all perfectly spaced apart, with Log2 values that just happen to be exactly incremental by one each...?
Excellent questions for further thinking. I really don't know what a special wallet it is. Maybe NSA’s chief of mathematics research wallet. As the creator said, you need to trim the high bytes of the key with zeros!
I think it's obvious that he has his own custom deterministic wallet. Based on an existing one or completely new one from scratch.
That said, I'm not sure it can sign a message with that tool. Maybe. And it’s not even necessary, just add your own salt, and that will be enough - going over SEED will be useless. string seed = Timer::getSeed(32);
//seed = "bla bla bla";// Mnemonic code words
string salt = "Bitcoin seed";// = "VanitySearch"; unsigned char hseed[64];
pbkdf2_hmac_sha512(hseed, 64, (const uint8_t *)seed.c_str(), seed.length(), (const uint8_t *)salt.c_str(), salt.length(), //2048);// 2048 rounds of hashing required by the BIP 39 Standard ??? //2048);// Used 2048 rounds ??? //0);// Used 0 rounds !!! 1024);// Electrum ?
If you use Mnemonic code words, that's where the problem arises. All WIFs fall into 256 bits import re, random, os, sys, binascii, hashlib, time, platform from mnemonic import Mnemonic import secp256k1 as ice import multiprocessing
def PrivateKeyFromMnemonic(mnemonic_phrase): mne = Mnemonic("english") seed = mne.to_seed(mnemonic_phrase, passphrase="") private_key_bytes = hashlib.sha256(seed).digest() private_key_hex = binascii.hexlify(private_key_bytes).decode() private_key_int = int(private_key_hex, 16) compressAddress = ice.privatekey_to_address(0, True, private_key_int) UncompressAddress = ice.privatekey_to_address(0, False, private_key_int) return compressAddress, UncompressAddress, private_key_int
def GetMnemonic(): list_word = [] wordlist = "AbandonAbilityAbleAboutAboveAbsentAbsorbAbstractAbsurdAbuseAccessAccidentAccountAccuseAchieveAcidAcousticAcquireAcrossActActionActorActressActualAdaptAddAddictAddressAdjustAdmitAdultAdvanceAdviceAerobicAffairAffordAfraidAgainAgeAgentAgreeAheadAimAirAirportAisleAlarmAlbumAlcoholAlertAlienAllAlleyAllowAlmostAloneAlphaAlreadyAlsoAlterAlwaysAmateurAmazingAmongAmountAmusedAnalystAnchorAncientAngerAngleAngryAnimalAnkleAnnounceAnnualAnotherAnswerAntennaAntiqueAnxietyAnyApartApologyAppearAppleApproveAprilArchArcticAreaArenaArgueArmArmedArmorArmyAroundArrangeArrestArriveArrowArtArtefactArtistArtworkAskAspectAssaultAssetAssistAssumeAsthmaAthleteAtomAttackAttendAttitudeAttractAuctionAuditAugustAuntAuthorAutoAutumnAverageAvocadoAvoidAwakeAwareAwayAwesomeAwfulAwkwardAxisBabyBachelorBaconBadgeBagBalanceBalconyBallBambooBananaBannerBarBarelyBargainBarrelBaseBasicBasketBattleBeachBeanBeautyBecauseBecomeBeefBeforeBeginBehaveBehindBelieveBelowBeltBenchBenefitBestBetrayBetterBetweenBeyondBicycleBidBikeBindBiologyBirdBirthBitterBlackBladeBlameBlanketBlastBleakBlessBlindBloodBlossomBlouseBlueBlurBlushBoardBoatBodyBoilBombBoneBonusBookBoostBorderBoringBorrowBossBottomBounceBoxBoyBracketBrainBrandBrassBraveBreadBreezeBrickBridgeBriefBrightBringBriskBroccoliBrokenBronzeBroomBrotherBrownBrushBubbleBuddyBudgetBuffaloBuildBulbBulkBulletBundleBunkerBurdenBurgerBurstBusBusinessBusyButterBuyerBuzzCabbageCabinCableCactusCageCakeCallCalmCameraCampCanCanalCancelCandyCannonCanoeCanvasCanyonCapableCapitalCaptainCarCarbonCardCargoCarpetCarryCartCaseCashCasinoCastleCasualCatCatalogCatchCategoryCattleCaughtCauseCautionCaveCeilingCeleryCementCensusCenturyCerealCertainChairChalkChampionChangeChaosChapterChargeChaseChatCheapCheckCheeseChefCherryChestChickenChiefChildChimneyChoiceChooseChronicChuckleChunkChurnCigarCinnamonCircleCitizenCityCivilClaimClapClarifyClawClayCleanClerkCleverClickClientCliffClimbClinicClipClockClogCloseClothCloudClownClubClumpClusterClutchCoachCoastCoconutCodeCoffeeCoilCoinCollectColorColumnCombineComeComfortComicCommonCompanyConcertConductConfirmCongressConnectConsiderControlConvinceCookCoolCopperCopyCoralCoreCornCorrectCostCottonCouchCountryCoupleCourseCousinCoverCoyoteCrackCradleCraftCramCraneCrashCraterCrawlCrazyCreamCreditCreekCrewCricketCrimeCrispCriticCropCrossCrouchCrowdCrucialCruelCruiseCrumbleCrunchCrushCryCrystalCubeCultureCupCupboardCuriousCurrentCurtainCurveCushionCustomCuteCycleDadDamageDampDanceDangerDaringDashDaughterDawnDayDealDebateDebrisDecadeDecemberDecideDeclineDecorateDecreaseDeerDefenseDefineDefyDegreeDelayDeliverDemandDemiseDenialDentistDenyDepartDependDepositDepthDeputyDeriveDescribeDesertDesignDeskDespairDestroyDetailDetectDevelopDeviceDevoteDiagramDialDiamondDiaryDiceDieselDietDifferDigitalDignityDilemmaDinnerDinosaurDirectDirtDisagreeDiscoverDiseaseDishDismissDisorderDisplayDistanceDivertDivideDivorceDizzyDoctorDocumentDogDollDolphinDomainDonateDonkeyDonorDoorDoseDoubleDoveDraftDragonDramaDrasticDrawDreamDressDriftDrillDrinkDripDriveDropDrumDryDuckDumbDuneDuringDustDutchDutyDwarfDynamicEagerEagleEarlyEarnEarthEasilyEastEasyEchoEcologyEconomyEdgeEditEducateEffortEggEightEitherElbowElderElectricElegantElementElephantElevatorEliteElseEmbarkEmbodyEmbraceEmergeEmotionEmployEmpowerEmptyEnableEnactEndEndlessEndorseEnemyEnergyEnforceEngageEngineEnhanceEnjoyEnlistEnoughEnrichEnrollEnsureEnterEntireEntryEnvelopeEpisodeEqualEquipEraEraseErodeErosionErrorEruptEscapeEssayEssenceEstateEternalEthicsEvidenceEvilEvokeEvolveExactExampleExcessExchangeExciteExcludeExcuseExecuteExerciseExhaustExhibitExileExistExitExoticExpandExpectExpireExplainExposeExpressExtendExtraEyeEyebrowFabricFaceFacultyFadeFaintFaithFallFalseFameFamilyFamousFanFancyFantasyFarmFashionFatFatalFatherFatigueFaultFavoriteFeatureFebruaryFederalFeeFeedFeelFemaleFenceFestivalFetchFeverFewFiberFictionFieldFigureFileFilmFilterFinalFindFineFingerFinishFireFirmFirstFiscalFishFitFitnessFixFlagFlameFlashFlatFlavorFleeFlightFlipFloatFlockFloorFlowerFluidFlushFlyFoamFocusFogFoilFoldFollowFoodFootForceForestForgetForkFortuneForumForwardFossilFosterFoundFoxFragileFrameFrequentFreshFriendFringeFrogFrontFrostFrownFrozenFruitFuelFunFunnyFurnaceFuryFutureGadgetGainGalaxyGalleryGameGapGarageGarbageGardenGarlicGarmentGasGaspGateGatherGaugeGazeGeneralGeniusGenreGentleGenuineGestureGhostGiantGiftGiggleGingerGiraffeGirlGiveGladGlanceGlareGlassGlideGlimpseGlobeGloomGloryGloveGlowGlueGoatGoddessGoldGoodGooseGorillaGospelGossipGovernGownGrabGraceGrainGrantGrapeGrassGravityGreatGreenGridGriefGritGroceryGroupGrowGruntGuardGuessGuideGuiltGuitarGunGymHabitHairHalfHammerHamsterHandHappyHarborHardHarshHarvestHatHaveHawkHazardHeadHealthHeartHeavyHedgehogHeightHelloHelmetHelpHenHeroHiddenHighHillHintHipHireHistoryHobbyHockeyHoldHoleHolidayHollowHomeHoneyHoodHopeHornHorrorHorseHospitalHostHotelHourHoverHubHugeHumanHumbleHumorHundredHungryHuntHurdleHurryHurtHusbandHybridIceIconIdeaIdentifyIdleIgnoreIllIllegalIllnessImageImitateImmenseImmuneImpactImposeImproveImpulseInchIncludeIncomeIncreaseIndexIndicateIndoorIndustryInfantInflictInformInhaleInheritInitialInjectInjuryInmateInnerInnocentInputInquiryInsaneInsectInsideInspireInstallIntactInterestIntoInvestInviteInvolveIronIslandIsolateIssueItemIvoryJacketJaguarJarJazzJealousJeansJellyJewelJobJoinJokeJourneyJoyJudgeJuiceJumpJungleJuniorJunkJustKangarooKeenKeepKetchupKeyKickKidKidneyKindKingdomKissKitKitchenKiteKittenKiwiKneeKnifeKnockKnowLabLabelLaborLadderLadyLakeLampLanguageLaptopLargeLaterLatinLaughLaundryLavaLawLawnLawsuitLayerLazyLeaderLeafLearnLeaveLectureLeftLegLegalLegendLeisureLemonLendLengthLensLeopardLessonLetterLevelLiarLibertyLibraryLicenseLifeLiftLightLikeLimbLimitLinkLionLiquidListLittleLiveLizardLoadLoanLobsterLocalLockLogicLonelyLongLoopLotteryLoudLoungeLoveLoyalLuckyLuggageLumberLunarLunchLuxuryLyricsMachineMadMagicMagnetMaidMailMainMajorMakeMammalManManageMandateMangoMansionManualMapleMarbleMarchMarginMarineMarketMarriageMaskMassMasterMatchMaterialMathMatrixMatterMaximumMazeMeadowMeanMeasureMeatMechanicMedalMediaMelodyMeltMemberMemoryMentionMenuMercyMergeMeritMerryMeshMessageMetalMethodMiddleMidnightMilkMillionMimicMindMinimumMinorMinuteMiracleMirrorMiseryMissMistakeMixMixedMixtureMobileModelModifyMomMomentMonitorMonkeyMonsterMonthMoonMoralMoreMorningMosquitoMotherMotionMotorMountainMouseMoveMovieMuchMuffinMuleMultiplyMuscleMuseumMushroomMusicMustMutualMyselfMysteryMythNaiveNameNapkinNarrowNastyNationNatureNearNeckNeedNegativeNeglectNeitherNephewNerveNestNetNetworkNeutralNeverNewsNextNiceNightNobleNoiseNomineeNoodleNormalNorthNoseNotableNoteNothingNoticeNovelNowNuclearNumberNurseNutOakObeyObjectObligeObscureObserveObtainObviousOccurOceanOctoberOdorOffOfferOfficeOftenOilOkayOldOliveOlympicOmitOnceOneOnionOnlineOnlyOpenOperaOpinionOpposeOptionOrangeOrbitOrchardOrderOrdinaryOrganOrientOriginalOrphanOstrichOtherOutdoorOuterOutputOutsideOvalOvenOverOwnOwnerOxygenOysterOzonePactPaddlePagePairPalacePalmPandaPanelPanicPantherPaperParadeParentParkParrotPartyPassPatchPathPatientPatrolPatternPausePavePaymentPeacePeanutPearPeasantPelicanPenPenaltyPencilPeoplePepperPerfectPermitPersonPetPhonePhotoPhrasePhysicalPianoPicnicPicturePiecePigPigeonPillPilotPinkPioneerPipePistolPitchPizzaPlacePlanetPlasticPlatePlayPleasePledgePluckPlugPlungePoemPoetPointPolarPolePolicePondPonyPoolPopularPortionPositionPossiblePostPotatoPotteryPovertyPowderPowerPracticePraisePredictPreferPreparePresentPrettyPreventPricePridePrimaryPrintPriorityPrisonPrivatePrizeProblemProcessProduceProfitProgramProjectPromoteProofPropertyProsperProtectProudProvidePublicPuddingPullPulpPulsePumpkinPunchPupilPuppyPurchasePurityPurposePursePushPutPuzzlePyramidQualityQuantumQuarterQuestionQuickQuitQuizQuoteRabbitRaccoonRaceRackRadarRadioRailRainRaiseRallyRampRanchRandomRangeRapidRareRateRatherRavenRawRazorReadyRealReasonRebelRebuildRecallReceiveRecipeRecordRecycleReduceReflectReformRefuseRegionRegretRegularRejectRelaxReleaseReliefRelyRemainRememberRemindRemoveRenderRenewRentReopenRepairRepeatReplaceReportRequireRescueResembleResistResourceResponseResultRetireRetreatReturnReunionRevealReviewRewardRhythmRibRibbonRiceRichRideRidgeRifleRightRigidRingRiotRippleRiskRitualRivalRiverRoadRoastRobotRobustRocketRomanceRoofRookieRoomRoseRotateRoughRoundRouteRoyalRubberRudeRugRuleRunRunwayRuralSadSaddleSadnessSafeSailSaladSalmonSalonSaltSaluteSameSampleSandSatisfySatoshiSauceSausageSaveSayScaleScanScareScatterSceneSchemeSchoolScienceScissorsScorpionScoutScrapScreenScriptScrubSeaSearchSeasonSeatSecondSecretSectionSecuritySeedSeekSegmentSelectSellSeminarSeniorSenseSentenceSeriesServiceSessionSettleSetupSevenShadowShaftShallowShareShedShellSheriffShieldShiftShineShipShiverShockShoeShootShopShortShoulderShoveShrimpShrugShuffleShySiblingSickSideSiegeSightSignSilentSilkSillySilverSimilarSimpleSinceSingSirenSisterSituateSixSizeSkateSketchSkiSkillSkinSkirtSkullSlabSlamSleepSlenderSliceSlideSlightSlimSloganSlotSlowSlushSmallSmartSmileSmokeSmoothSnackSnakeSnapSniffSnowSoapSoccerSocialSockSodaSoftSolarSoldierSolidSolutionSolveSomeoneSongSoonSorrySortSoulSoundSoupSourceSouthSpaceSpareSpatialSpawnSpeakSpecialSpeedSpellSpendSphereSpiceSpiderSpikeSpinSpiritSplitSpoilSponsorSpoonSportSpotSpraySpreadSpringSpySquareSqueezeSquirrelStableStadiumStaffStageStairsStampStandStartStateStaySteakSteelStemStepStereoStickStillStingStockStomachStoneStoolStoryStoveStrategyStreetStrikeStrongStruggleStudentStuffStumbleStyleSubjectSubmitSubwaySuccessSuchSuddenSufferSugarSuggestSuitSummerSunSunnySunsetSuperSupplySupremeSureSurfaceSurgeSurpriseSurroundSurveySuspectSustainSwallowSwampSwapSwarmSwearSweetSwiftSwimSwingSwitchSwordSymbolSymptomSyrupSystemTableTackleTagTailTalentTalkTankTapeTargetTaskTasteTattooTaxiTeachTeamTellTenTenantTennisTentTermTestTextThankThatThemeThenTheoryThereTheyThingThisThoughtThreeThriveThrowThumbThunderTicketTideTigerTiltTimberTimeTinyTipTiredTissueTitleToastTobaccoTodayToddlerToeTogetherToiletTokenTomatoTomorrowToneTongueTonightToolToothTopTopicToppleTorchTornadoTortoiseTossTotalTouristTowardTowerTownToyTrackTradeTrafficTragicTrainTransferTrapTrashTravelTrayTreatTreeTrendTrialTribeTrickTriggerTrimTripTrophyTroubleTruckTrueTrulyTrumpetTrustTruthTryTubeTuitionTumbleTunaTunnelTurkeyTurnTurtleTwelveTwentyTwiceTwinTwistTwoTypeTypicalUglyUmbrellaUnableUnawareUncleUncoverUnderUndoUnfairUnfoldUnhappyUniformUniqueUnitUniverseUnknownUnlockUntilUnusualUnveilUpdateUpgradeUpholdUponUpperUpsetUrbanUrgeUsageUseUsedUsefulUselessUsualUtilityVacantVacuumVagueValidValleyValveVanVanishVaporVariousVastVaultVehicleVelvetVendorVentureVenueVerbVerifyVersionVeryVesselVeteranViableVibrantViciousVictoryVideoViewVillageVintageViolinVirtualVirusVisaVisitVisualVitalVividVocalVoiceVoidVolcanoVolumeVoteVoyageWageWagonWaitWalkWallWalnutWantWarfareWarmWarriorWashWaspWasteWaterWaveWayWealthWeaponWearWeaselWeatherWebWeddingWeekendWeirdWelcomeWestWetWhaleWhatWheatWheelWhenWhereWhipWhisperWideWidthWifeWildWillWinWindowWineWingWinkWinnerWinterWireWisdomWiseWishWitnessWolfWomanWonderWoodWoolWordWorkWorldWorryWorthWrapWreckWrestleWristWriteWrongYardYearYellowYouYoungYouthZebraZeroZoneZoo" words = re.findall('[A-Z][a-z]+', wordlist) for i in range(2048): word_C = words[i] list_word.append(word_C) word1 = random.choice(list_word) word2 = random.choice(list_word) word3 = random.choice(list_word) word4 = random.choice(list_word) word5 = random.choice(list_word) word6 = random.choice(list_word) word7 = random.choice(list_word) word8 = random.choice(list_word) word9 = random.choice(list_word) word10 = random.choice(list_word) word11 = random.choice(list_word) word12 = random.choice(list_word) return f"{word1} {word2} {word3} {word4} {word5} {word6} {word7} {word8} {word9} {word10} {word11} {word12}"
rl = [line.strip() for line in open('go.txt').readlines()] richList = set(rl)
def check_private_key(richList, STOP_EVENT): while not STOP_EVENT.is_set(): wod = GetMnemonic() compressAddress, UncompressAddress, PrivateKey = PrivateKeyFromMnemonic(wod) message = "\r[+] {} ".format(compressAddress) messages = [] messages.append(message) output = "\033[01;33m" + ''.join(messages) + "\r" sys.stdout.write(output) sys.stdout.flush() if compressAddress in richList or UncompressAddress in richList: with open("KEYFOUNDKEYFOUND.txt", "a") as f: f.write(f'COMPRESSED: {compressAddress}\n') f.write(f'UNCOMPRESSED: {UncompressAddress}\n') f.write(f'PRIVATEKEY: {PrivateKey}\n') f.write(f'Mnemonic: {wod}\n') f.write('-----------------------------------------------------------------------------------------------------------\n')
STOP_EVENT.set() sys.stdout.write("\033[?25h") sys.stdout.flush() return
if __name__ == '__main__': if 'win' in platform.platform() or 'Windows' in platform.platform(): os.system('cls') elif 'linux' or 'Linux' in platform.platform(): os.system('clear') t = time.ctime() sys.stdout.write(f"\033[01;33m[+] {t}\n") STOP_EVENT = multiprocessing.Event() num_processes = multiprocessing.cpu_count() # Number of CPU cores
processes = [] for _ in range(num_processes): process = multiprocessing.Process(target=check_private_key, args=(richList, STOP_EVENT)) processes.append(process) process.start()
for process in processes: process.join() The results are all of this length. - 89754425042582330695652602694071763691823510269073462781416259935330261521348
|
|
|
If it didn't work, appeal to our future overlord aka AD(artificial dumbness).😉
ChatGTP is a dead horse for programming. I don't advise any normal person to do any serious things with it. Doesn't see many things at once, you have to draw him exactly what you want, the possibility of it predicting what you want is small... Example..... I tell him that I want to separate segments from the text file... Segments are separated by a vertical line | In file 1.txt : text1 | text2 | text3| text4 I want to get in file 2.txt : text1 | text2 | text4 From file 1.txt . . . And tells me dead serious here is a python script for you: import re
# Function to process the text and extract the desired parts def extract_text(input_file, output_file): with open(input_file, 'r') as f: input_text = f.read()
# Regular expression pattern to capture the desired text pattern = r'(\b\w+_\w+\b)\s*\|\s*(\b\w+_\w+\b)\s*\|\s*\w+\s*\|\s*(\b\w+_\w+\b)\s*\|'
matches = re.findall(pattern, input_text)
# Create the new text format from the extracted matches output_text = "\n".join([" | ".join(match) for match in matches])
# Write the new text to the output file with open(output_file, 'w') as f: f.write(output_text)
# Example usage input_file = '1.txt' output_file = '2.txt' extract_text(input_file, output_file) The script does nothing....I have a blank file. Too much dulls and overcomplicate it... The solution is in bash one line cat 1.txt | cut -d '|' -f1,2,4 > 2.txt He says you are right, sorry for the confusion…. p.s. If someone thinks that this story has nothing to do with the topic - it does. This is 1.txt file https://raw.githubusercontent.com/HomelessPhD/BTC32/main/BTC32_solved_unsolved.txt
which program is that ? Can you link, please?
https://github.com/albertobsd/keyhunt
|
|
|
reduce all of the additional hex keys i am searching for.
import os, random, secrets, hashlib, ecdsa
# List of target Hash 160 values to search for target_public_key_hashes = [ bytes.fromhex('20d45a6a762535700ce9e0b216e31994335db8a5'), bytes.fromhex('739437bb3dd6d1983e66629c5f08c70e52769371'), bytes.fromhex('e0b8a2baee1b77fc703455f39d51477451fc8cfc'), bytes.fromhex('61eb8a50c86b0584bb727dd65bed8d2400d6d5aa'), bytes.fromhex('f6f5431d25bbf7b12e8add9af5e3475c44a0a5b8'), ] # Open a file for writing the found matches with open('found_matches.txt', 'w') as output_file: while True: dec = secrets.SystemRandom().randrange(36893488147419103231, 2361183241434822606847) private_key_bytes = (b'\x00' * 32)[:-len(dec.to_bytes((dec.bit_length() + 7) // 8, 'big'))] + dec.to_bytes((dec.bit_length() + 7) // 8, 'big') signing_key = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1) h160 = hashlib.new('ripemd160', hashlib.sha256(signing_key.get_verifying_key().to_string("compressed")).digest()).digest() h160_hex = h160.hex() if h160_hex.startswith(('20d45a', '739437', 'e0b8a2', '61eb8a', 'f6f543')): print(h160_hex, dec) if h160 in target_public_key_hashes: match_str = f"Found match with hash {dec}\n" print(match_str) output_file.write(match_str) target_public_key_hashes.remove(h160) # Remove the found hash from the list if not target_public_key_hashes: print("All target hashes found.") break There is no limit and way someone can search for a puzzle. It's like art. Mostly worthless art collection.
|
|
|
worked for more than 25 years on EC
To better understand the claim and specific experience with elliptic curves, we can ask you about your work, projects, and expertise in this area. This will provide more context and clarity about the 25 years you are referring to. Can you point us to your published studies? I'm really curious and looking forward reading them.
We are still waiting for your reply from the other day.
|
|
|
The same goal, only simplified. simplified..but you're pulling hashes from all over. this seems like it will take forever to find a match. even with impressive speed. and the peed may be that impressive because its not generating the correct hash values, they dont match the private keys. 0000000000000000000000000000000000000000000000c856c4ca3cb9c8766e Iteration 133394: Generated hash 04133ae3a72b383457c8116a13a8f6fe12236ced Private Key Hex: 0000000000000000000000000000000000000000000000c85509b05931fa7e0f Iteration 133395: Generated hash 5503e52f2f7b052b7f0d06680931e1e5f7dc72bf Private Key Hex: 0000000000000000000000000000000000000000000000c5783688057c9ff90e Iteration 133396: Generated hash dea497f05ab93a4cd82c04b7042e8909cb71ed86 Private Key Hex: 00000000000000000000000000000000000000000000002bfa3a7bcb95a6bda1 Iteration 133397: Generated hash 4924746a8c9c8d0de3598cecd6a12005579b4c75 Private Key Hex: 0000000000000000000000000000000000000000000000c8c0e47fd806b23588 Iteration 133398: Generated hash 31c10fc8c9584b7d454e191f7ba046f171ea5ebc Private Key Hex: 00000000000000000000000000000000000000000000004d1d18f8ba61efb1c9 Iteration 133399: Generated hash b6c3e00fdc24f63f5b9ae43c86ddad3048259c0f import os import hashlib import ecdsa # List of target Hash 160 values to search for target_public_key_hashes = [ bytes.fromhex('20d45a6a762535700ce9e0b216e31994335db8a5'), bytes.fromhex('739437bb3dd6d1983e66629c5f08c70e52769371'), bytes.fromhex('e0b8a2baee1b77fc703455f39d51477451fc8cfc'), bytes.fromhex('61eb8a50c86b0584bb727dd65bed8d2400d6d5aa'), bytes.fromhex('f6f5431d25bbf7b12e8add9af5e3475c44a0a5b8'), ]
min_range = 36893488147419103231 # Puzzle 66 max_range = 2361183241434822606847 # Puzzle 71
while True: random_bytes = os.urandom(9) initial_bytes = b'\x00' * 23 full_bytes = initial_bytes + random_bytes dec = int.from_bytes(full_bytes, byteorder='big')
if min_range <= dec <= max_range: signing_key = ecdsa.SigningKey.from_string(full_bytes, curve=ecdsa.SECP256k1) h160 = hashlib.new('ripemd160', hashlib.sha256(signing_key.get_verifying_key().to_string("compressed")).digest()).digest() if h160 in target_public_key_hashes: print(f"Found match with hash {h160.hex()}. Decoded value: {dec}") target_public_key_hashes.remove(h160) # Remove the found hash from the list if not target_public_key_hashes: print("All target hashes found.") break You can filter full_bytes based on a decimal range, a condition to check if the decimal value falls within the specified range. Three more lines of code. p.s. Do not worry. This will last forever (on home computers) no matter what we invent.
|
|
|
He said it was from keyhunt, so unless he modified it, its straight brute force as pub key is not available for 66.
You're right. I can achieve a maximum of ~1 Ekeys/s with AMD Ryzen 9 7950X3D, but if I know what public key is. - Version 0.2.230519 Satoshi Quest, developed by AlbertoBSD
- Random mode
- K factor 512
- Search compress only
- Endomorphism enabled
- Threads : 16
- Stats output every 20 seconds
- Quiet thread output
- Mode BSGS random
- Opening file tests/130.txt
- Added 1 points from file
- Bit Range 130
- -- from : 0x200000000000000000000000000000000
- -- to : 0x400000000000000000000000000000000
- N = 0x400000000000
- Bloom filter for 4294967296 elements : 14722.65 MB
- Bloom filter for 134217728 elements : 460.08 MB
- Bloom filter for 4194304 elements : 14.38 MB
- Allocating 64.00 MB for 4194304 bP Points
- Reading bloom filter from file keyhunt_bsgs_4_4294967296.blm .... Done!
- Reading bloom filter from file keyhunt_bsgs_6_134217728.blm .... Done!
- Reading bP Table from file keyhunt_bsgs_2_4194304.tbl .... Done!
- Reading bloom filter from file keyhunt_bsgs_7_4194304.blm .... Done!
- Total 22924448003222667264 keys in 20 seconds: ~1 Ekeys/s (1146222400161133363 keys/s)
I just modified the Makefile to have -msse4.2 . If I don't know what public key is, the speed cannot be higher than 50 MKey/s. . . Theoretically it could get closer... If you have a 128 Core https://www.titancomputers.com/Titan-A475-Dual-AMD-EPYC-Milan-7003-Series-Proce-p/a475.htm
|
|
|
hows this one? ready for some fun? THIS ONE SCRIPT IS SEARCHING FOR PUZZLES 66 -71 from a single hex which is 20000000000000000...2ffffffffffffffff. I can also adjust the step size. import os, random, secrets, hashlib, ecdsa
# List of target Hash 160 values to search for target_public_key_hashes = [ bytes.fromhex('20d45a6a762535700ce9e0b216e31994335db8a5'), bytes.fromhex('739437bb3dd6d1983e66629c5f08c70e52769371'), bytes.fromhex('e0b8a2baee1b77fc703455f39d51477451fc8cfc'), bytes.fromhex('61eb8a50c86b0584bb727dd65bed8d2400d6d5aa'), bytes.fromhex('f6f5431d25bbf7b12e8add9af5e3475c44a0a5b8'), ]
while True: dec = secrets.SystemRandom().randrange(36893488147419103231, 2361183241434822606847) private_key_bytes = (b'\x00' * 32)[:-len(dec.to_bytes((dec.bit_length() + 7) // 8, 'big'))] + dec.to_bytes((dec.bit_length() + 7) // 8, 'big') signing_key = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1) h160 = hashlib.new('ripemd160', hashlib.sha256(signing_key.get_verifying_key().to_string("compressed")).digest()).digest() if h160 in target_public_key_hashes: dec = int.from_bytes(full_bytes, byteorder='big') print(f"Found match with hash {h160.hex()}. Decoded value: {dec}") target_public_key_hashes.remove(h160) # Remove the found hash from the list if not target_public_key_hashes: print("All target hashes found.") break The same goal, only simplified.
|
|
|
How is that i9 able to outperform the 4090 in straight brute forcing?
It depends on what the script calculates and how it calculates. Are only compressed keys counted or all together? Is it a key or a hash? Which parameters do you use in one script and which in the other? (user input)* You can practice in Python to see how counting works. import sys, os, time, secrets, multiprocessing, random import binascii, base58, hashlib, ecdsa
def generate_private_key_WIF(start, miss): characters = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" return start + "".join(secrets.choice(characters) for _ in range(miss))
def format_hash_rate(hash_rate): suffixes = ["", "k", "M", "G", "T", "P"]
magnitude = 0 while hash_rate >= 1000 and magnitude < len(suffixes) - 1: hash_rate /= 1000.0 magnitude += 1
return f"{hash_rate:.2f} {suffixes[magnitude]}Hash/s"
def check_private_key(start, miss, target_binary, min_range, max_range): while not STOP_EVENT.is_set(): private_key_WIF = generate_private_key_WIF(start, miss) dec = int(binascii.hexlify(base58.b58decode(private_key_WIF))[2:-10].decode("utf-8")[0:64], 16) if min_range <= dec <= max_range: private_key_bytes = (b'\x00' * 32)[:-len(dec.to_bytes((dec.bit_length() + 7) // 8, 'big'))] + dec.to_bytes((dec.bit_length() + 7) // 8, 'big') signing_key = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1) HASH160 = hashlib.new('ripemd160', hashlib.sha256(signing_key.get_verifying_key().to_string("compressed")).digest()).digest()
hashes_per_second = 0 target_hash_count = 1000000 # You can adjust this to your desired count start_time = time.time()
while hashes_per_second < target_hash_count: HASH160.hex() hashes_per_second += 1
end_time = time.time() elapsed_time = end_time - start_time hashes_per_second = target_hash_count / elapsed_time
formatted_hash_rate = format_hash_rate(hashes_per_second)
message = "\r[+] Hashes per second: {}".format(formatted_hash_rate) messages = [] messages.append(message) output = "\033[01;33m" + ''.join(messages) + "\r" sys.stdout.write(output)
if HASH160 == target_binary: dec_to_hex = hex(dec).split('x')[-1] HASH160_wif = base58.b58encode(b'\x80' + private_key_bytes + b'\x01' + hashlib.sha256(hashlib.sha256(b'\x80' + private_key_bytes + b'\x01').digest()).digest()[:4]).decode() bitcoin_address = base58.b58encode(b'\x00' + HASH160 + hashlib.sha256(hashlib.sha256(b'\x00' + HASH160).digest()).digest()[:4]).decode() t = time.ctime() sys.stdout.write(f"\033[0m\n\n") sys.stdout.write(f"[+] SOLVED: |\033[32m {t} \033[0m\n") sys.stdout.write(f"[+] Key Found: |\033[32m {dec_to_hex} \033[0m\n" f"[+] WIF: |\033[32m {HASH160_wif} \033[0m\n" f"[+] Address: |\033[32m {bitcoin_address} \033[0m") sys.stdout.flush()
with open("KEYFOUNDKEYFOUND.txt", "a") as f: f.write("SOLVED: " + str(t) + '\n' + "HEX: " + str(dec_to_hex) + '\n' + "WIF: " + str(HASH160_wif) + '\n' + "Address: " + str(bitcoin_address) + '\n\n') f.flush() f.close()
STOP_EVENT.set() sys.stdout.write("\033[?25h") sys.stdout.flush() return
if __name__ == '__main__': start = "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qZ" miss = 52 - (len(start)) min_range = 36893488147419103231 max_range = 73786976294838206463 target_hex = "20d45a6a762535700ce9e0b216e31994335db8a5" target_binary = bytes.fromhex(target_hex) puzzle = 0 while max_range >= 2 ** puzzle: puzzle += 1 if min_range <= (2 ** puzzle) - 1: puzzle = puzzle
STOP_EVENT = multiprocessing.Event() num_processes = multiprocessing.cpu_count()
os.system("clear") t = time.ctime() sys.stdout.write(f"\033[01;33m[+] {t}\n") sys.stdout.write(f"\033[01;33m[+] Puzzle = {puzzle}\n") sys.stdout.write(f"\033[01;33m[+] Ending characters missing: {miss}\n") sys.stdout.write(f"\033[01;33m[+] Public Key Hash (Hash 160): {target_hex}\n") sys.stdout.flush()
pool = multiprocessing.Pool(processes=num_processes)
for i in range(num_processes): pool.apply_async(check_private_key, args=(start, miss, target_binary, min_range, max_range))
pool.close() pool.join() Let's say in raw Python you can achieve about 3.98 MHash/s on 12 cores - Fri Oct 27 10:06:46 2023
- Puzzle = 66
- Ending characters missing: 18
- Public Key Hash (Hash 160): 20d45a6a762535700ce9e0b216e31994335db8a5
- Hashes per second: 3.98 MHash/s
In the same Python with the kangaroo algorithm I have about 50 MKeys/s (if you count jumps) In C++ everything is 10 or 100 times more (if is GPU). What exactly is counted depends on which algorithm was used and how is used. *It even depends on how it is compiled for which platform - for example: AMD Ryzen 9 7950X3D gcc -Q -march=native --help=target | grep -E '^\s+-.*(sse|march)' g++ -m64 -march=native -mtune=native -msse4.2 -pthread -O3 -I. -o ...etc... The presence of SSE4.1 and SSE4.2 instruction sets can be particularly beneficial for cryptographic operations, as they include instructions that can accelerate certain mathematical operations required for SECPK1 calculations. You can experiment with these flags for cryptographic workloads. Effectiveness of this flag depends on the specific algorithms and code you are working with. It's a good practice to benchmark code with and without the flag.
|
|
|
So 5 extra steps, 5 useless operations per key.
import sys, os, random, secrets, hashlib, ecdsa while True: dec = secrets.SystemRandom().randrange(36893488147419103231, 73786976294838206463) h160 = hashlib.new('ripemd160', hashlib.sha256(ecdsa.SigningKey.from_string((b'\x00' * 32)[:-len(dec.to_bytes((dec.bit_length() + 7) // 8, 'big'))] + dec.to_bytes((dec.bit_length() + 7) // 8, 'big'), curve=ecdsa.SECP256k1).get_verifying_key().to_string("compressed")).digest()).digest() message = "\r[+] {} ".format(h160.hex());messages = [];messages.append(message);output = "\033[01;33m" + ''.join(messages) + "\r";sys.stdout.write(output);sys.stdout.flush() if h160.hex() == "20d45a6a762535700ce9e0b216e31994335db8a5": print(dec);break It can't be simpler than this.. But even for this you have to wait 5000 years.
|
|
|
This has become boring, lets make some noise.
I already have a collection of completely ridiculous programs. import ecdsa import hashlib
start_bytes = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff\xff\xff') end_bytes = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff') target_binary = b'\x20\xd4Zjv%5p\x0c\xe9\xe0\xb2\x16\xe3\x19\x9435\xb8\xa5'
current_bytes = start_bytes[:]
while current_bytes <= end_bytes: signing_key = ecdsa.SigningKey.from_string(bytes(current_bytes), curve=ecdsa.SECP256k1) HASH160 = hashlib.new('ripemd160', hashlib.sha256(signing_key.get_verifying_key().to_string("compressed")).digest()).digest() if HASH160 == target_binary: with open("KEYFOUNDKEYFOUND.txt", "a") as f: wif = current_bytes.hex().upper() f.write("WIF: " + wif + '\n\n') # Increment the bytes from the right (little-endian) for i in range(len(current_bytes) - 1, -1, -1): if current_bytes[i] != 255: current_bytes[i] += 1 break else: current_bytes[i] = 0 This is Puzzle 66 believe it or not . .
|
|
|
Anyone can find one bit of the K nonce ?
What exactly do you mean? There are 2^32 possible values, which means there are 4,294,967,296 different nonces. Scientists from Sorbonne University claim to be able to solve the entire 256-bit SECP256K1 in 9 Hours with Cat Qubits However, it's important to exercise caution when evaluating such claims, as cryptographic claims in the context of quantum computing are often met with skepticism and scrutiny. Quantum computing is still an emerging field, and practical quantum computers capable of breaking widely used cryptographic algorithms are not yet a reality. But I wouldn't be surprised if some government organizations make this first.
|
|
|
puzzle designer doesn't know how to solve these puzzles, and he didn't leave any clues, because there are no clues.
It's hard to believe he manually write each puzzle after extracting 256 keys from HD wallet... He masked them (one by one) with leading 000...0001 to set difficulty. it is done with some script, with errors = ZERO So his script knows precisely how to solve the second part. Or to put it another way, he knows how to solve these puzzles.
|
|
|
#include <iostream> #include <vector>...
- Bytea HASH160 Search by NoMachine
- Sat Oct 21 10:39:23 2023
- Puzzle: 15
- Public Key Hash (Hash 160): fe7c45126731f7384640b0b0045fd40bac72e2a2
- PUZZLE SOLVED: 2023-10-21 10:39:24
- Target Public Key Hash (Hash160) found! Private Key: 00000000000000000000000000000000000000000
Hi @nomachine how to make it work sequential instead of random ? here you go, buddy #include <iostream> #include <vector> #include <iomanip> #include <openssl/bn.h> #include <openssl/ec.h> #include <openssl/obj_mac.h> #include <openssl/sha.h> #include <openssl/evp.h> #include <openssl/ripemd.h> #include <ctime> #include <sstream> #include <fstream>
// Function to convert a byte vector to a hexadecimal string std::string bytesToHex(const std::vector<unsigned char>& bytes) { std::stringstream ss; for (unsigned char byte : bytes) { ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte); } return ss.str(); }
// Function to calculate the RIPEMD160 hash of a byte vector std::vector<unsigned char> calculateRIPEMD160(const std::vector<unsigned char>& data) { std::vector<unsigned char> hash(RIPEMD160_DIGEST_LENGTH); RIPEMD160(data.data(), data.size(), hash.data()); return hash; }
int main() { // Initialize the OpenSSL library if (OpenSSL_add_all_algorithms() != 1) { std::cerr << "OpenSSL initialization failed." << std::endl; return 1; }
// Define the range std::string start_range_hex = "000000000000000000000000000000000000000000000001ffffffffffffffff"; std::string end_range_hex = "000000000000000000000000000000000000000000000003ffffffffffffffff"; // Set the target Hash160 value (replace with your target hash) std::string target_hash160_hex = "20d45a6a762535700ce9e0b216e31994335db8a5";
// Create an EC_KEY object EC_KEY* ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);
// Calculate the SHA-256 hash of the public key unsigned char sha256_result[SHA256_DIGEST_LENGTH];
// Calculate the RIPEMD160 hash of the SHA-256 hash std::vector<unsigned char> ripemd160_result(RIPEMD160_DIGEST_LENGTH);
BIGNUM* start_range = BN_new(); BIGNUM* end_range = BN_new(); BN_hex2bn(&start_range, start_range_hex.c_str()); BN_hex2bn(&end_range, end_range_hex.c_str());
while (BN_cmp(start_range, end_range) <= 0) { // Create a BIGNUM from the current value in the range BIGNUM* bn_private_key = BN_dup(start_range);
// Set the private key in the EC_KEY object EC_KEY_set_private_key(ec_key, bn_private_key);
// Compute the public key from the private key EC_POINT* public_key_point = EC_POINT_new(EC_KEY_get0_group(ec_key)); EC_POINT_mul(EC_KEY_get0_group(ec_key), public_key_point, bn_private_key, NULL, NULL, NULL);
// Convert the public key point to binary representation (compressed) size_t public_key_length = EC_POINT_point2oct(EC_KEY_get0_group(ec_key), public_key_point, POINT_CONVERSION_COMPRESSED, NULL, 0, NULL); std::vector<unsigned char> public_key_bytes(public_key_length); EC_POINT_point2oct(EC_KEY_get0_group(ec_key), public_key_point, POINT_CONVERSION_COMPRESSED, public_key_bytes.data(), public_key_length, NULL);
SHA256(public_key_bytes.data(), public_key_bytes.size(), sha256_result); ripemd160_result = calculateRIPEMD160(std::vector<unsigned char>(sha256_result, sha256_result + SHA256_DIGEST_LENGTH));
// Convert the calculated RIPEMD160 hash to a hexadecimal string std::string calculated_hash160_hex = bytesToHex(ripemd160_result);
// Display the generated public key hash (Hash160) and private key std::string message = "\r\033[01;33m[+] Public Key Hash (Hash 160): " + calculated_hash160_hex; std::cout << message << "\e[?25l"; std::cout.flush();
// Check if the generated public key hash matches the target if (calculated_hash160_hex == target_hash160_hex) { // Get the current time std::time_t currentTime; std::time(¤tTime); std::tm tmStruct = *std::localtime(¤tTime);
// Format the current time into a human-readable string std::stringstream timeStringStream; timeStringStream << std::put_time(&tmStruct, "%Y-%m-%d %H:%M:%S"); std::string formattedTime = timeStringStream.str();
std::cout << "\n\033[32m[+] PUZZLE SOLVED: " << formattedTime << "\033[0m" << std::endl; std::cout << "\r\033[32m[+] Target Public Key Hash (Hash160) found! Private Key: " << BN_bn2hex(bn_private_key) << std::endl;
// Append the private key information to a file if it matches std::ofstream file("KEYFOUNDKEYFOUND.txt", std::ios::app); if (file.is_open()) { file << "\nPUZZLE SOLVED " << formattedTime; file << "\nPrivate Key (hex): " << BN_bn2hex(bn_private_key); file << "\n--------------------------------------------------------------------------------------------------------------------------------------------"; file.close(); }
BN_free(bn_private_key); break; }
// Increment the current value in the range BN_add_word(start_range, 1); }
// Free the EC_KEY and BIGNUM objects BN_free(start_range); BN_free(end_range); EC_KEY_free(ec_key);
return 0; }
g++ -m64 -march=native -pthread -O3 -I. -o puzzle66 puzzle.cpp -lssl -lcrypto -ldl
|
|
|
Maybe you are on to something, maybe not.
Maybe maybe not.
|
|
|
so how fast is fast?
For first test is fast Print ALL the keys on screen is stupid and slow
I agree. but I need to have insight into what the application does exactly in the test phases. soooo is obvious you are making fun of his speed, lets say the script is so fast that it flashes on the screen very fast
Even I joke about my speed.
|
|
|
If i want to try this program for different puzzles what parameters i need to change in the code That's the first test script...You have a pm. Let's not bother others with technicalities here.
|
|
|
Let's say we have a 66 bit private key. Such key must be a multiple of smaller number
Why numbers at all? Let's say we have a Puzzle 65, 64, 63 private keys in bytes: Puzzle 65 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xa88\xb15\x05\xb2hg' Puzzle 64 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x05\x1f'\xb0\x91\x12\xd4" Puzzle 63 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\xce^\xfd\xac\xcfh\x08' and so on.... Do you see how many leading zeros there are and how small the end is in bytes? b'\x00' * 23 (twenty-three zeroes) + 9 bytes You need to generate the last 9 bytes to get full WIF (from 66 to 71 bits). I went one step further now. To represent hash160 directly in the vector as bytes and std::vector<std::vector<unsigned char>> target_hash160_list = { {0x20, 0xd4, 0x5a, 0x6a, 0x76, 0x25, 0x35, 0x70, 0x0c, 0xe9, 0xe0, 0xb2, 0x16, 0xe3, 0x19, 0x94, 0x33, 0x5d, 0xb8, 0xa5}, {0x73, 0x94, 0x37, 0xbb, 0x3d, 0xd6, 0xd1, 0x98, 0x3e, 0x66, 0x62, 0x9c, 0x5f, 0x08, 0xc7, 0x0e, 0x52, 0x76, 0x93, 0x71}, {0xe0, 0xb8, 0xa2, 0xba, 0xee, 0x1b, 0x77, 0xfc, 0x70, 0x34, 0x55, 0xf3, 0x9d, 0x51, 0x47, 0x74, 0x51, 0xfc, 0x8c, 0xfc}, {0x61, 0xeb, 0x8a, 0x50, 0xc8, 0x6b, 0x05, 0x84, 0xbb, 0x72, 0x7d, 0xd6, 0x5b, 0xed, 0x8d, 0x24, 0x00, 0xd6, 0xd5, 0xaa}, {0xf6, 0xf5, 0x43, 0x1d, 0x25, 0xbb, 0xf7, 0xb1, 0x2e, 0x8a, 0xdd, 0x9a, 0xf5, 0xe3, 0x47, 0x5c, 0x44, 0xa0, 0xa5, 0xb8}, {0xbf, 0x74, 0x13, 0xe8, 0xdf, 0x4e, 0x7a, 0x34, 0xce, 0x9d, 0xc1, 0x3e, 0x2f, 0x26, 0x48, 0x78, 0x3e, 0xc5, 0x4a, 0xdb}, {0xfe, 0x7c, 0x45, 0x12, 0x67, 0x31, 0xf7, 0x38, 0x46, 0x40, 0xb0, 0xb0, 0x04, 0x5f, 0xd4, 0x0b, 0xac, 0x72, 0xe2, 0xa2} };
compare them directly afterwards without any conversion to hex. This works fast as hell. It is SO fast that you can barely see the numbers on the display. Flashing characters on the screen.... But it's not fast enough for Puzzles over 60...Need GPU....
|
|
|
|