主页 > 怎样下载imtoken > 比特币这么受欢迎,你为什么不也发行一个?
比特币这么受欢迎,你为什么不也发行一个?
火遍全球的比特币,无人不知。
隐藏在背后的区块链技术,也曾多次被中央责令“大力支持”。
大家都在谈去中心化,大众关注的结果就是价格一直在飙升。
这么好的赚钱方式! 教我!
好了,今天我们不讨论比特币的“泡沫”有多大,教大家如何制造这样的“泡沫”。
一些小的准备工作
要做比特币,我们需要了解比特币的一些基本规律(初始规则)。
了解了基本规律之后,我们就开始圈一个库进行研究,让一些代码先跑起来。
export type TransactionType = {|
sender : string,
receiver : string,
amount : number,
fee : number
|};
export type BlockType = {|
miner : string,
parentid : string,
id : string,
index : number,
time : number,
elapsed : number,
transactions : Array
, difficulty : number,
reward : number
|};
这里有两个警告:
块下的字段是:
接下来是我最喜欢的常数时间定义。
export const BLOCK_TIME = 1000;
export const INITIAL_REWARD = 1024;
export const REWARD_HALVING_SCHEDULE = 20;
export const BLOCK_SIZE_LIMIT = 10;
export const GENESIS_BLOCK : BlockType = {
id: 'GENESIS',
parentid: 'GENESIS',
miner: 'SATOSHI',
index: 1,
time: now(),
elapsed: 0,
transactions: [],
difficulty: 1,
reward: INITIAL_REWARD
};
定义好常量后比特币发行的最大数量,我们来关注这些重要的参数:
当我们把这些参数写在代码中的时候,它们的意义会越来越深刻,作用点也会逐渐清晰。
这还没有结束,我们还需要将区块链存根作为我们所有区块和交易的“数据库”和记录系统。
export type BlockChainType = {|
addBlock : (hashedBlock : string) => Promise<void>,
createBlock : (publicKey : string, transactions : Array<string>) => Promisestring>,
getBalances : () => Promise
|};
export function BlockChain() : BlockChainType {
const createBlock = async (publicKey, transactions) : Promisestring> => {
};
const addBlock = async (block : BlockType) => {
};
const getBalances = async () : Promise
=> { };
return {
addBlock,
createBlock,
getBalances
};
}
好了,架构搭建好了,我们可以开始动手了!
我挖的不是我的,而是未来
来吧,我们先完成自己的数据结构:
const root = TreeNode(GENESIS_BLOCK);
对于区块链的构建,可能有的同学认为会是链表的状态。 就实际结构而言,区块链其实更像是一棵“区块树”。
Hola~有图为证
在这棵区块树中,可以有很多竞争的分支,我们如何选择和信任?
EASY,三短一长选最长的,我来回答这个问题!
真的,我们选择哪个分支最长,因为更长的分支意味着可以创建更多的计算工作,更多的计算工作可以保证没有其他分支可以超过我们当前的选择。
因此,我们使用内存中的数据结构来表示我们的区块链,使我们能够在任何给定时间轻松计算最长的分支。 请注意,我们将 GENESIS_BLOCK 作为块树的根传入,因为它始终是第一个块。
好了,万事俱备,只差挖矿了,矿山来了!
const createBlock = async (publicKey : string, transactions : Array<string>) : Promisestring> => {
const headBlock = root.getLongestBranchNode().getValue();
const newTransactions = await asyncFilter(transactions, verifyPackedSignature);
const newDifficulty = (headBlock.elapsed) > BLOCK_TIME
? headBlock.difficulty - 1
: headBlock.difficulty + 1;
const newReward = divisibleBy(headBlock.index, REWARD_HALVING_SCHEDULE)
? Math.floor(headBlock.reward / 2)
: headBlock.reward;
const newBlock = {
miner: publicKey,
parentid: headBlock.id,
index: headBlock.index + 1,
id: uniqueID(),
time: now(),
elapsed: now() - headBlock.time,
transactions: newTransactions,
difficulty: newDifficulty,
reward: newReward
};
const hashedBlock = await hashAndPack(newBlock);
const hash = unpackHash(hashedBlock);
if (divisibleBy(hash, headBlock.difficulty)) {
return hashedBlock;
}
};
上面的代码是一个挖新矿的过程。 再用力的锄头,也要注意落地的力度。 在挖矿的过程中,我们需要注意三个步骤:
现有的区块链,在这里表示为根,我们需要在这里调用 getLongestBranchNode() 来找到当前“真实”的区块链,并在其上挖掘另一个区块。 矿工的公钥,它需要是区块的一部分,以便网络上的其他人知道挖掘区块的奖励信息。 一个交易列表,如果不能在网络上发布交易记录,挖矿就没有意义。
矿能挖出来,交易记录没问题,还愁什么?
A:担心奖励制度的设置。
我们希望每20个区块奖励减半,所以这里采用选择判断的方式:
这意味着每个区块的创建过程都会根据前一个区块的创建耗时来调整算法的强度,这将导致整体的区块发现率趋近于一个常数。
无论有多少矿工尝试挖掘新区块,新区块的发现率始终保持在一个恒定的范围内。
你拥有的矿工越多,“哈希率”就越高,“哈希率”是衡量目前在世界不同地区使用多少计算能力来开采比特币的指标。 这反过来会导致两个结果:
矿工数量少,算力低,难度低。
矿工数量多,算力高,难度大。
当我们成功创建一个新块时,任务还没有结束。 我们需要根据前一个块来确定标准。 当相应的难度正确时,我们创建的新区块将被网络接受。
放在包里很安全,放在包里很安全
成功创建新块后,我们要将其添加到我们的数据结构中。
const addBlock = async (hashedBlock : string) => {
const verifiedBlock = await verifyHashAndUnpack(hashedBlock);
const verifiedTransactions = await asyncMap(verifiedBlock.transactions, verifySignatureAndUnpack);
const fullyVerifiedBlock = {
...verifiedBlock,
transactions: verifiedTransactions
};
const headNode = root.findValueByID(fullyVerifiedBlock.parentid);
const hash = unpackHash(hashedBlock);
if (headNode && divisibleBy(hash, headNode.getValue().difficulty)) {
headNode.addChildNodeValue(fullyVerifiedBlock);
}
};
第一步是验证新区块是否匹配哈希,区块中的所有交易是否被正确签名; 然后验证新块是否通过了所有正确的规则; 最后,我们需要找到新区块指定的父区块,并将新区块作为子节点添加到父区块下,bingo,访问工作完成!
接入后,就是计算余额的时候了,这在炒币者中很流行(毕竟是安全的)。
const getBalances = async () : Promise
=> { const balances = new Counter();
for (let { miner, reward, transactions } of root.getLongestChainAsValues()) {
balances.add(miner, reward);
for (let { receiver, amount, fee, sender } of transactions) {
balances.add(miner, fee);
balances.add(receiver, amount);
balances.subtract(sender, amount);
balances.subtract(sender, fee);
}
}
return balances;
};
在最长的分支下,我们将所有余额、费用和区块奖励相加,并计算以下每个选项:
好了,到这里,一个简单的比特币就生成了!
你有没有注意到一个亮点? 比特币交易实际上是一个零和游戏。 从一个帐户中减去一笔金额并添加到另一个帐户中。 所有交易只能使用网络上已经存在的比特币,不能创建或销毁比特币。 (当然,您可以将比特币发送到无效地址,但这不会破坏比特币比特币发行的最大数量,只会使它们永久无法访问。)
虽然交易是零和游戏,但奖励不是。
从新区块的产生,到比特币的最终奖励,这个通道成为了当前所有新比特币的来源。 但这种奖励也有一个应许的结局。 我们说比特币的上限很高,这个定值是2100万。 当最终区块奖励减半为0时,系统将无法增减新的比特币。
这个固定的上限赋予了比特币巨大的 S2F(资产稀缺性)价值。 不会有矿币,也永远不会有央行增发货币造成通胀危机。
因此,您在新闻网站上看到的各种公司或个人都在挖矿方面投入了大量资金。 电商平台显卡供不应求,囤积挖矿。 所有这些人都在追求开采新比特币所带来的承诺回报。 .
引人入胜的数据运算非常有趣,精准的逻辑计算让人着迷。 比特币创造了伟大的经济奇迹(从0元/币到最高6万美元/币,没有实物作为支撑)。
今天我们讲述如何用JAVA简单重构一个比特币的生成过程(从创建新区块到最后计算连接到区块链的余额),希望热爱计算机知识的你能够满意。
就像近两年层出不穷的虚拟货币(狗狗币、火币、OMG币)一样,掌握了先进的计算机知识后,你也可以参与新币的发行和交易。
比特币这么受欢迎,你为什么不也发行一个?
参考链接:
- 结尾 -
过去精选
—