马上要过年了,这里整理了一些资料,重写一个自建虚拟货币教程当作提前拜年礼物,让你也能在不到一天的时间内,自建虚拟币,。

#教程#TAD教你一天内自建虚拟货币-92KM

2017年度,比特币一定能列在最热关键词。去年由于国内局势,你懂得比特币呈现规律性大涨。很多新人都加入虚拟货币市场。当然也有很多人浑水摸鱼,扰乱市场。再次声明:虚拟货币不具有一般等价物的特征、功能,入坑需谨慎!

你需要做的事就是,部署cryptonote,自己搭建一个虚拟货币官网(可以参考知名网站,例如全球傻逼链平台),当然白皮书也必不可少。淘宝上甚至还有代写白皮书服务。

准备事项

1.新建一个github账号,(当然能看到此处的大部分都有github帐号,就不需要注册了)。
2.fork cryptonote的源码,点击这里
3.购买独立服务器(一到两台,Ubuntu系统)作为节点,至少需要2G的内存(online的特价独服就是不错的选择,vps也ok,不过我并未试过)。

命名货币

1.无论是哪个虚拟货币,一个独一无二的名字才算是一个好名字。例如傻逼链之类,保证缩写尽量不要重复。
2.将你的虚拟币名字加入到你fork的源码中,以下假设sbcoin为虚拟货币的名字。
(1)在src/CryptoNoteConfig.h中的CRYPTONOTE_NAME 你需要将sbcoin填入冒号之间,如下:

const char CRYPTONOTE_NAME[] = "sbcoin";

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

set_property(TARGET daemon PROPERTY OUTPUT_NAME "sbcoin")

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

货币发行政策

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

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

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

const unsigned EMISSION_SPEED_FACTOR = 18;

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

const uint64_t DIFFICULTY_TARGET = 60;

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得到下图:

#教程#TAD教你一天内自建虚拟货币-92KM网络设置

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中的下列参数中,以8.8.8.8:17236和4.4.4.4:17236为例:

const std::initializer_list<const char*> SEED_NODES = {
  "8.8.8.8:17236",
  "4.4.4.4: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由Tad做简易整理,完整代码请参阅github