{"id":23256909,"url":"https://github.com/dmdv/chaindev_latoken","last_synced_at":"2025-10-06T21:33:27.282Z","repository":{"id":141043965,"uuid":"129158868","full_name":"Dmdv/chaindev_latoken","owner":"Dmdv","description":null,"archived":false,"fork":false,"pushed_at":"2018-04-09T11:05:41.000Z","size":6639,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-06T04:28:13.308Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Dmdv.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-04-11T21:56:43.000Z","updated_at":"2019-05-31T06:57:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"cc2633f4-9cb2-4b8a-995b-44767ea2334c","html_url":"https://github.com/Dmdv/chaindev_latoken","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Dmdv/chaindev_latoken","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dmdv%2Fchaindev_latoken","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dmdv%2Fchaindev_latoken/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dmdv%2Fchaindev_latoken/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dmdv%2Fchaindev_latoken/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Dmdv","download_url":"https://codeload.github.com/Dmdv/chaindev_latoken/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dmdv%2Fchaindev_latoken/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278685657,"owners_count":26028322,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-19T12:20:03.905Z","updated_at":"2025-10-06T21:33:27.276Z","avatar_url":"https://github.com/Dmdv.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"Chaindev_Latoken Core integration/staging tree\n=====================================\n\n[![Build Status](https://travis-ci.org/LAToken/chaindev_latoken.svg?branch=master)](https://travis-ci.org/LAToken/chaindev_latoken)\nФоркаем https://github.com/litecoin-project/litecoin. \n1. Придумываем название для нашего токена - например, chaindev_latoken.\n2. Переименовываем склонированную папку в chaindev_latoken.\n3. В ней в терминале делаем команду grep -rl 'litecoin' ./ | xargs sed -i 's/litecoin/chaindev_latoken/g' - команда заменит все вхождения litecoin в файлах на chaindev_latoken и после сборки сгенерирует файлы chaindev_latokend и chaindev_latoken-cli как у биткоина только с названием вашего альта.\n\nИнструкция по выставлению параметров:\n1. Основное действие происходит в файле src/chainparams.cpp. Меняем параметры класса CTestNetParams, но то же самое можно делать и с CChainMainNetParams. Выставляйте consensus.BIP34Height = 0; сonsensus.BIP34Hash = uint256S(\"0x00\"); consensus.BIP65Height = 0; consensus.BIP66Height = 0; - значения с каких блоков в основной цепочке принимаются изменения протоколов BIP34, BIP65, BIP66 - у нас они сразу же. \n2. consensus.powLimit = uint256S(\"0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\") - выставляется в отличии от биткоина всего с 1 начальным нулем, ибо мы для начала хотим такую сложность сети, чтобы быстро генерить блоки - это верхний предел для сложности генерации блоков. О difficulty можно почитать тут - https://bitcoin.org/en/developer-reference#target-nbits и вообще https://bitcoin.org/en/developer-reference и https://bitcoin.org/en/developer-guide для понимания того, как работает блокчейн биткоина. \n3. consensus.nPowTargetTimespan = 4 * 60; - 4 минуты, сколько продолжается время для текущей сложности\n4. consensus.nPowTargetSpacing = 60; - 1 минута, через сколько генерятся блоки в цепочке;      consensus.nMinerConfirmationWindow = consensus.nPowTargetTimespan / consensus.nPowTargetSpacing; - через сколько блоков меняется сложность consensus.nRuleChangeActivationThreshold = 0.75 * consensus.nMinerConfirmationWindow; - 75% от предыдущего параметра для тестовой сети и 95% для основной сети. consensus.fPowAllowMinDifficultyBlocks = true - нам нужна минимальная сложность; consensus.fPowNoRetargeting = false - мы хотим retargeting; \nconsensus.nMinimumChainWork = uint256S(\"0x00\") - вначале 0 для сети; consensus.defaultAssumeValid = uint256S(\"0x00\"); - валидная цепочка для нулевого блока (параметр для оптимизации, не влияющий на запуск сети) pchMessageStart[0] = 0xf2; pchMessageStart[1] = 0xde; pchMessageStart[2] = 0xc3; pchMessageStart[3] = 0xf5; - ставьте какими угодно, примерно радномными, странный параметр, скорее всего используется для генерации сообщений между нодами в сети с определенным началом nDefaultPort = 55103; - выставляем внутренний порт для своей сети; nPruneAfterHeight = 1000; - через сколько блоков в цепочке удалять старые блоки. Дальше как в файле src/chainparams.cpp вставляете кусок, начиная с unsigned int nBits = 0x00001000; до genesis = CreateGenesisBlock(secs, nNonce, nBits, 1, 50 * COIN); - это генерирует вам нужные параметры timestamp, nNonce, nBits. Затем после генерации закомменьте часть с циклами и выставите найденные константые значение и собирете снова. Закомменьте следующие строчки от assert до base58 невключительно. Выставьте в первых четырех массивах base58Prefixes вторые элементы какие хотите до 255 - для того, чтобы ваши адреса сети имели специфичный вид. В последних двух третий и четвертый элементы. checkpointData = {\n    {\n        {0, consensus.hashGenesisBlock},\n    }\n}; chainTxData = ChainTxData{\n    0,\n    0,\n    0\n}; - выставьте как в src/chainparams.cpp - это данные для проверки уже имеющихся блоков.\n4. Далее в chainparamsbase.cpp в классе CBaseTestNetParams выставьте нужный вам nRPCPort, по которому вы будете делать RPC запросы и укажите после в chaindev_latoken.conf (-rpcport).\n5. В chainparamsseeds.h в pnSeed6_test выставьте в формате hex ipv4 адреса (они равны первые два байта 0xff и 0xff, далее преобразованные сами в hex формат). Порты выставьте равные nDefaultPort.\n6. В файле amount.h можете поменять static const CAmount MAX_MONEY = 84000000 * COIN; например на 10^8.\n7. В файле consensus/consensus.h можете поменять static const unsigned int MAX_BLOCK_SERIALIZED_SIZE = 2500000;\nstatic const unsigned int MAX_BLOCK_WEIGHT = 2500000; с 4 миллионов байт на 2,5. COINBASE_MATURITY со 100 на 6 - это после скольки блоков майнеру можно будет вывести свою награду за создание блока.\n\n\nИнстуркция по запуску:\n\n1. git clone https://github.com/LAToken/chaindev_latoken.git\n2. cd chaindev_latoken\n3. ./autogen.sh\n4. ./configure\n5. make\n6. ./src/chaindev_latokend -testnet\n7. Подождите и получите secs и nNonce.\n8. Поменяйте их значения на полученные в файле /src/chainparams.cpp в классе CTestNetParams. Закомментируйте: \n        for (; nNonce \u003c (int)1e9; ++nNonce) {       \n            genesis = CreateGenesisBlock(secs, nNonce, 0x1e0ffff0, 1, 50 * COIN);\n            consensus.hashGenesisBlock = genesis.GetHash();\n            arith_uint256 bnTarget;\n            bool fNegative, fOveflow;\n            bnTarget.SetCompact(0x1e0ffff0, \u0026fNegative, \u0026fOveflow);\n            if (UintToArith256(consensus.hashGenesisBlock) \u003c= bnTarget) {\n                break;\n            }\n        }\n        fprintf(stderr, \"nNonce: %d ||| secs: %d\\n\", nNonce, secs);\n9. Снова make и ./src/chaindev_latokend -testnet\n10. Сеть локально запущена, к ней можно обращаться через ./src/chaindev_latoken-cli -testnet \u003ccommmand\u003e (вместо \u003ccommand\u003e например getnewaddress - выведи произвольный валидный адрес в сети или generate n m - намайни до n блоков за m итераций).\n\nВажный update: выбор так называемого параметра блока nBits в src/chainparams.cpp, который определяет таргет для майнеров. Его нужно выбирать в зависимости от выставленного consensus.powLimit. Для uint256S(\"0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\") - на старте подходят все хеши с одним нулем вначале, что является начальным таргетом для развертывания тестовой сети, ибо мы хотим генерировать блоки быстро с обычным процессором. Для него подходят исходные nBits. выставленные в сети у genesisBlock у litecoin и bitcoin. Для значений с большим числом нулей - его также надо перебрать с помощью тупого перебора всех uint32 и условий в файле src/pow.cpp. Обновленнйы код можно посмотреть в файле src/chainparams.cpp в классе CChainTestNetParams.   \n   \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmdv%2Fchaindev_latoken","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmdv%2Fchaindev_latoken","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmdv%2Fchaindev_latoken/lists"}