bi参数学习

本文深入解析比特币核心参数的功能与作用,包括创世区块、难度调整、奖励减半等关键机制,并指导如何通过修改这些参数轻松制作自己的山寨币。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ubuntu终端获取时间戳:date +%s

 

密钥生成:https://github.com/lhartikk/GenesisH0 要安装X11,选择DarkCoin方法

 

https://blog.youkuaiyun.com/wab719591157/article/details/80747043

修改创世区块中的 pszTimestamp 修改成任意你想输入的话

 vAlertPubKey = ParseHex("04517d8xxxxx")

然后继续修改公钥也就是  ParseHex("[中间的值]")

 

 

--------------------------------------------------------------------------

建议先用1个月左右的时间熟悉一下比特币协议的原理之后再看源代码,理解复杂事物需要有个循序渐进的过程,欲速则不达。

先简要说明一些这几个参数的作用:

 

genesis.nTime    = nTime;创始区块产生时的unix时间戳
genesis.nBits    = nBits;////这个是难度
genesis.nNonce   = nNonce;创始区块产生时的随机数 ////这个不是随机数字,挖矿的过程,就是寻找这个数字,来使得区块的HASH值小于genesis.nBits 所指定的难度. genesis.nNonce是参与hash运算的源数据的一部份.所以,修改这个值,整个hash值就会发生改变

----------------
        consensus.nSubsidyHalvingInterval = 210000;  // 每隔210000个块减半一次,按每10分钟出一个块计算,大约间隔为4年;
        consensus.nMajorityEnforceBlockUpgrade = 750; // 软分叉"规则"激活的阈值,此时如果区块声明了使用某个规则,那么就需要根据该规则严格验证该区块;
        consensus.nMajorityRejectBlockOutdated = 950; // 软分叉“分叉”生效的阈值,此时矿工将拒绝收录不符合新规则的区块;
        consensus.nMajorityWindow = 1000; // 软分叉投票的观察窗口(每次统计最近的“1000”个块的投票情况)
        consensus.BIP34Height = 227931; // BIP34规则生效时所在的高度(BIP34是一个比较重要的软分叉规则,该规则要求在每个块的coinbase中必须写入当前的区块高度,从而避免产生出重复的genesis交易)
        consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"); // BIP34规则生效时的区块hash值,相当于是一个检查点(checkpoint)
        consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // 最低难度值(difficult = 1)时所对应的256位的二进制数值;
        consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks  每两周调整一次难度
        consensus.nPowTargetSpacing = 10 * 60; // 平均每600秒出一个块(10分钟)
        consensus.fPowAllowMinDifficultyBlocks = false; // 不允许在当前难度周期挖低难度的块(仅在testnet网上测试时才允许)
        consensus.fPowNoRetargeting = false; // 每个难度周期内(2016个块)不允许调整难度值

 

 

 

----------------------------

原文出处:http://www.tiny-calf.com/2018/03/20/比特币核心主要参数分析/

创世块相关

Timestamp

这里的timestamp就是一句随机的话,表明创建创世块创建的时候发生的某个时间,这句话会被一并加入创世块的哈系算法中。其实只是一个象征意义,在代码里能找到创世块的原文,在Bitcore src/chainparams.cppCreateGenesisBlock函数中,原文如下:

1
const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";

 

nTime nNonce nBit

nTime这个才是我们通常说的linux时间戳,是创世块开采时候的时间,比特核心代码中为1231006505。我们知道比特币挖矿的原理是寻找某个随机数加上一个固定的算法所得出的值的哈系值,如果前n多位是0,那么就可以算是一个新的区块。挖矿就是寻找这个随机数的过程。n越多,难度久越大,这里的nBit其实就代表了创世块的难度,代码中为0x1d00ffff,而真正生成创世块的随机数就是这个nNounce,代码中为2083236893。这三个参数在代码中直接以函数的参数的形式出现,也在src/chainparams.cpp中:

1
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);

 

这里的50 * COIN其实没什么用,因为创世块的币是没法用的。每个块的奖励其实不在这里设置,后面再讲。

生成创世块

创世块需要两个参数,一个是创世块的hash值hashGenesisBlock,一个是创世块的hashMerkleRoot 。区块链是树状的,需要merkleroot来建立块与块之间的联系。生成创世块我们就需要以上说的 Timestamp,nTime,nBit ,按照指定算法挖矿,得出nNounce,hashMerkleRoot,hashMerkleRoot。有一个python能完成生成创世块的工作,点击这个传送门

得到nNounce,hashMerkleRoot,hashMerkleRoot以后,nNounce还是填入之前的函数参数中,hashMerkleRoot,hashMerkleRoot分别可以在以下代码中找到:

1
2
assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));

 

共识机制相关

SubsidyHalvingInterval

这个是减半周期,我们了解比特币4年减半,但是这里的减半周期单位是块,也就是每过210000个块比特币的产出减半。后面我还会回来说为什么是4年。代码是这样的:

1
2
// 位置  /src/chainparams.cpp
consensus.nSubsidyHalvingInterval = 210000;

 

PowTargetSpacing PowTargetSpacing

PowTargetSpacing是目标难度变更时间,源码为2周。PowTargetSpacing是目标出块时间代码中为10分钟。这两个参数相除,就是难度变化周期2016(单位:块)。总结来说,就是每隔2016个块,挖矿难度会重新定义,以此来动态平衡出块时间。举个实际的例子:在前难度周期中,由于矿工算力过大,没有像预期的一样每十分钟出一个块,那么在下一个难度周期中,会按照上一个周期的算力,增加合适的难度,来保证下一个周期中每个块的出块时间大约是十分钟。那么其实我们的初始难度设置低一点也没有太大影响,最终都会按PowTargetSpacing来决定难度。另外,结合上面的减半周期210000和每十分钟出一个块,我们就得出了4年减半的结论。

这两个参数的源码如下:

1
2
3
// 位置  /src/chainparams.cpp
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;

 

Subsidy

这个就是挖矿的初始奖励。代码中为50,结合减半周期,每个周期内的的产出为 50 × 2100000,所以总产出为 50 × 2100000 ×(1 + 1/2 + 1/4 + 1/16 + …),积分一下,结果就是2100万。

1
2
//位置  /src/main.cpp
CAmount nSubsidy = 50 * COIN;

 

其他非重要参数

1
2
3
4
5
// 位置  /src/chainparams.cpp
pchMessageStart[0] = 0xf9;
pchMessageStart[1] = 0xbe;
pchMessageStart[2] = 0xb4;
pchMessageStart[3] = 0xd9;

这个是网络消息头,用来合其他比特币altcoin区分,随便改其他数字就行

1
2
3
4
5
6
// 位置  /src/chainparams.cpp
vSeeds.push_back(CDNSSeedData("bitcoin.sipa.be", "seed.bitcoin.sipa.be", true)); // Pieter Wuille, only supports x1, x5, x9, and xd
vSeeds.push_back(CDNSSeedData("bluematt.me", "dnsseed.bluematt.me", true)); // Matt Corallo, only supports x9
vSeeds.push_back(CDNSSeedData("dashjr.org", "dnsseed.bitcoin.dashjr.org")); // Luke Dashjr
vSeeds.push_back(CDNSSeedData("bitcoinstats.com", "seed.bitcoinstats.com", true)); // Christian Decker, supports x1 - xf
vSeeds.push_back(CDNSSeedData("bitcoin.jonasschnelli.ch", "seed.bitcoin.jonasschnelli.ch", true)); // Jonas Schnelli, only supports x1, x5, x9, and xd

 

这个是比特币的初始固定节点,开启比特币时会自动连接,如果你的altcoin一开始没有的话全部注释就行

1
2
3
4
// 位置  /src/chainparams.cpp
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0);
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,5);
base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,128);

 

这三个参数会影响地址生成的校验位,以区分不同的币种,如果你要做altcoin的最好还是要改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 位置  /src/chainparams.cpp
checkpointData = (CCheckpointData) {
    {
        { 11111, uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d")},
        { 33333, uint256S("0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6")},
        { 74000, uint256S("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")},
        {105000, uint256S("0x00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97")},
        {134444, uint256S("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe")},
        {168000, uint256S("0x000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763")},
        {193000, uint256S("0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317")},
        {210000, uint256S("0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e")},
        {216116, uint256S("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e")},
        {225430, uint256S("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932")},
        {250000, uint256S("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214")},
        {279000, uint256S("0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40")},
        {295000, uint256S("0x00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983")},
    }
};

 

这个是校验区块链上的固定块是否正确,同样,需要altcoin的话这里注释掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 位置 src/util.cpp
#ifdef WIN32
    // Windows
    return GetSpecialFolderPath(CSIDL_APPDATA) / DATA_FILE_NAME;
#else
    fs::path pathRet;
    char* pszHome = getenv("HOME");
    if (pszHome == NULL || strlen(pszHome) == 0)
        pathRet = fs::path("/");
    else
        pathRet = fs::path(pszHome);
#ifdef MAC_OSX
    // Mac
    pathRet /= "Library/Application Support";
    TryCreateDirectory(pathRet);
    return pathRet / DATA_FILE_NAME;
#else
    // Unix
    return pathRet / DATA_FILE_NAME_UNIX;
#endif

 

这里直接把DATA_FILE_NAME和DATA_FILE_NAME_UNIX换成altcoin名字就行,是默认文件夹名称。

完成

所以按照整篇文章说的,改掉一些数据,就能很容易自己编译自己的altcoin了,具体编译流程可以参照我以前的比特币文章。
但是毕竟,这个技术没什么卵用,自己玩玩就好。

---------------------------------

一老外写的经典之作:

http://dillingers.com/blog/2015/04/18/how-to-make-an-altcoin/#respond

 

优快云:【比特币】自己动手制作山寨币

https://blog.youkuaiyun.com/hacode/article/details/40422535#commentBox

 

 

https://blog.youkuaiyun.com/wab719591157/article/details/80747043

 

 

通过修改创世区块简单制作山寨币

https://blog.youkuaiyun.com/mjfh095215/article/details/80250536

### BiLSTM 参数设置方法及最佳实践 在 PyTorch 中实现 BiLSTM 模型时,参数的选择和配置对于模型的性能至关重要。以下是关于 BiLSTM 的主要参数及其推荐的最佳实践: #### 1. 输入维度 (`input_size`) 输入维度应与嵌入层(Embedding Layer)的输出一致。如果使用的是预训练词向量,则 `input_size` 应等于该词向量的维度大小。 ```python embedding_dim = 300 # 假设使用 GloVe 或其他预训练词向量 lstm_input_size = embedding_dim ``` #### 2. 隐藏单元数 (`hidden_size`) 隐藏单元的数量决定了 LSTM 能够捕获多少复杂特征。通常情况下,较大的隐藏单元数量能够提高模型表达能力,但也可能导致过拟合。建议从小规模开始尝试并逐步调整。 ```python hidden_size = 128 # 推荐范围:64 至 512 ``` #### 3. 双向模式 (`bidirectional`) BiLSTM 是通过将前向 LSTM 和后向 LSTM 结合起来构建的,因此需要启用双向模式以充分利用上下文信息[^2]。 ```python is_bidirectional = True num_directions = 2 if is_bidirectional else 1 ``` #### 4. 层数 (`num_layers`) 层数控制堆叠 LSTM 层的数量。增加层数可能提升模型表现,但也会使梯度消失或爆炸问题更加严重。一般而言,单层或多层(不超过 3 层)即可满足大多数需求。 ```python num_layers = 2 # 推荐范围:1 至 3 ``` #### 5. Dropout 正则化 (`dropout`) Dropout 技术有助于防止过拟合,在多层网络中尤为重要。可以通过设置 `dropout` 参数来指定每层之间的丢弃概率。 ```python dropout_rate = 0.5 # 推荐范围:0.2 至 0.7 if num_layers > 1: lstm_dropout = dropout_rate else: lstm_dropout = 0 ``` #### 6. 批次大小 (`batch_size`) 和序列长度 (`sequence_length`) 批次大小影响 GPU 利用率以及收敛速度;而序列长度则决定每次传递给模型的数据片段长短。这两者需根据硬件资源合理设定。 ```python batch_size = 64 # 推荐范围:16 至 128 seq_len = 50 # 根据具体任务调整 ``` #### 7. 学习(`learning_rate`) 和优化器 选择合适的优化算法(如 Adam、SGD 等)和初始学习率对训练过程非常重要。Adam 通常是首选方案之一。 ```python learning_rate = 0.001 # 推荐范围:1e-3 至 1e-5 optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=1e-5) ``` #### 完整代码示例 以下是一个简单的 BiLSTM 实现案例: ```python import torch.nn as nn class BiLSTMModel(nn.Module): def __init__(self, vocab_size, embedding_dim, hidden_size, output_size, num_layers, bidirectional=True, dropout=0.5): super(BiLSTMModel, self).__init__() self.embedding = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM( input_size=embedding_dim, hidden_size=hidden_size, num_layers=num_layers, batch_first=True, bidirectional=bidirectional, dropout=(dropout if num_layers > 1 else 0) ) self.fc = nn.Linear(hidden_size * (2 if bidirectional else 1), output_size) def forward(self, x): embedded = self.embedding(x) lstm_out, _ = self.lstm(embedded) final_hidden_state = lstm_out[:, -1, :] # 获取最后一个时间步的状态 logits = self.fc(final_hidden_state) return logits ``` --- ### 注意事项 - **正则化**:除了 Dropout 外,还可以引入 L2 正则化(即权重衰减)进一步抑制过拟合现象。 - **初始化策略**:适当初始化 LSTM 权重矩阵能加速收敛进程[^1]。 - **超参调优工具**:借助网格搜索或贝叶斯优化等手段自动化寻找最优参数组合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值