欢迎光临
我们一直在努力

【教程】自建虚拟货币

虚拟货币不具有一般等价物的特征、功能,入坑需谨慎!

准备工作

1.新建一个github账号,点击这里注册。
2.fork虚拟货币的源码,点击这里fork它。
3.购买一到两台给予Ubuntu系统的独立服务器作为节点,至少需要2G的内存。

命名货币

1.对于虚拟货币来说,一个独一无二的名字才算是一个好名字。为了确保其独一性,请在GoogleMap of Coins中检查一下。
2.将想好的名字加入到你fork的源码中,你需要操作三个地方,以下假设furiouscoin为虚拟货币的名字。
(1)在src/CryptoNoteConfig.h中的CRYPTONOTE_NAME 你需要将furiouscoin填入冒号之间,如下:

const char CRYPTONOTE_NAME[] = "furiouscoin";

(2)在src/CMakeList.txt中的set_property(TARGET daemon PROPERTY OUTPUT_NAME””) 你需要将furiouscoin填入冒号之间,如下:

set_property(TARGET daemon PROPERTY OUTPUT_NAME "furiouscoind")

(3)最重要的是,你需要将你fork的repository名字给改过来。

货币发行政策

1.货币发行量
作为一个虚拟货币,事先规定发行总量是必须的。你可以使用(uint64_t)(-1)来设置(一共有18446744073709551616个),也可以直接设置一个数字,比如UINT64_C(858986905600000000)这样。以(uint64_t)(-1)为例,在src/CryptoNoteConfig.h中修改为:

const uint64_t MONEY_SUPPLY = (uint64_t)(-1);

2.货币发行曲线
默认的策略是随着发行量的增加,每个区块的奖励都会有轻微的减少,而不是像比特币那样每四年减半。EMISSION_SPEED_FACTOR这个参数是用来定义发行曲线的,也就是计算区块奖励。 以18这一较平均的数为例,在src/CryptoNoteConfig.h中修改为:

const unsigned EMISSION_SPEED_FACTOR = 18;

3.目标难度
目标难度是区块之间的理想时间间隔,一旦区块之间的平均时间小于目标难度,那么整体的难度就将上升。目标难度是以秒为计算单位。
目标难度会对虚拟货币造成以下的表现:
(1)交易处理速度:区块之间的时间越长,事务确认越慢。
(2)发行速度:区块之间的时间越长,发行速度越慢。
(3)孤立率:更快的区块链将产生更高的独立率。
常见的目标难度在60-120秒之间,以120为例,在src/CryptoNoteConfig.h中修改为:

const uint64_t DIFFICULTY_TARGET = 120;

4.区块奖励公式
如果你不满意默认的区块奖励方式,你也可以改变它。具体的方法在src/CryptoNoteCore/Currency.cpp中:
bool Currency::getBlockReward(size_t medianSize, size_t currentBlockSize, uint64_t alreadyGeneratedCoins, uint64_t fee, uint64_t& reward, int64_t& emissionChange) const
此功能由两个部分组成:
(1)基础区块奖励
uint64_t baseReward = (m_moneySupply – alreadyGeneratedCoins) >> m_emissionSpeedFactor;
基础区块奖励将会直接影响货币发行曲线
(2)大区块惩罚计算
为了同时保护链不被泛滥交易攻击和提供有机网络增长,故设置了大区块惩罚计算。

货币发行计算

通过更改DIFFICULTY_TARGET和EMISSION_SPEED_FACTOR这两个参数,可以将虚拟货币的发行和比特就进行对比。比如,将DIFFICULTY_TARGET设置为21,将EMISSION_SPEED_FACTOR设置为120得到下图:
coin

网络设置

1.P2P和RPC网络的端口
P2P端口被用来和其他设备进行互相通信,钱包和其他软件则使用RPC端口进行通信。建议使用不常用的端口赋给P2P和RPC,以避免出现端口占用的问题。常见端口请参阅speedguide.netnetworksorcery.comkeir.net。以17236和18236为例,在src/CryptoNoteConfig.h中修改为:

const int P2P_DEFAULT_PORT = 17236;
const int RPC_DEFAULT_PORT = 18236;

2.网络身份认证
利用网络身份认证以避免多个虚拟货币的流量混淆,将在src/P2p/P2pNetworks.h中下列的参数改为随机数值:

const static boost::uuids::uuid CRYPTONOTE_NETWORK = { { 0xA1, 0x1A, 0xA1, 0x1A, 0xA1, 0x0A, 0xA1, 0x0A, 0xA0, 0x1A, 0xA0, 0x1A, 0xA0, 0x1A, 0xA1, 0x1A } };

3.种子节点
将服务器的IP地址添加到src/CryptoNoteConfig.h中的下列参数中,以111.11.11.11:17236和222.22.22.22:17236为例:

const std::initializer_list<const char*> SEED_NODES = {
  "111.11.11.11:17236",
  "222.22.22.22:17236",
};

交易费用及相关参数

1.最低交易费用
最低交易费用为零可能会导致交易泛滥,一般minimum_fee 100000是比较合适的。以100000为例,在src/CryptoNoteConfig.h中更改:

const uint64_t MINIMUM_FEE = 100000;

2.处罚自由区块
通过减少大于中等区块的区块奖励来保护链收到tx flooding影响,参数需要大于RYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE。以20000为例,在src/CryptoNoteConfig.h中更改:

const size_t CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE = 20000;

地址前缀

选择一个或几个字母以作为所有的货币公共地址的前缀。由于地址前缀规则是独有的,所以需要使用前缀生成器工具。点击这里查看。以0xe9为例,设置如下:

const uint64_t CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = 0xe9; // 地址以"f"作为前缀。

起始区块

1.用一个空的源代码生成十六进制二进制文件。
在src/CryptoNoteConfig.h中的GENESIS不填写任何参数,如下:

const char GENESIS_COINBASE_TX_HEX[] = "";

2.启动守护进程以产出起始区块
通过添加–print-genesis-tx,产出起始区块的交易hash值,如下:
furiouscoind –print-genesis-tx
3.加入交易hash值
复制hash值到src/CryptoNoteConfig.h中GENESIS_COINBASE_TX_HEX,以013c01ff0001ffff…785a33d9ebdba68b0为例:
const char GENESIS_COINBASE_TX_HEX[] = “013c01ff0001ffff…785a33d9ebdba68b0”;
4.重新编译的二进制文件
将所有的文件重新编译一遍,完成后你的虚拟货币就开始了!

本文技术来源于cryptonote,完整代码请参阅github

Premium WordPress Themes Download
Download Premium WordPress Themes Free
Premium WordPress Themes Download
Download WordPress Themes
free download udemy course
download karbonn firmware
Download WordPress Themes Free
udemy course download free
赞(0) 打赏
未经允许不得转载:顶好爱迪 » 【教程】自建虚拟货币
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

顶好爱迪 更专业 更方便

联系我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏