从什么是区块链到一个小时内构建区块链

2024-01-31 14:40
文章标签 构建 区块 小时 链到

本文主要是介绍从什么是区块链到一个小时内构建区块链,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从"什么是区块链"到一个小时内构建区块链

1620

区块链是记录的数字账本, 以称作区块的块状数据排列. 这些区块随后通过称为哈希函数的加密验证相互链接.这些区块连在一起形成一个连续的链 - 区块链.

这种类型的数据结构对加密货币等有用的原因是去中心化. 去中心化意味着链中的记录不存储在任何单一的位置, 这些记录每个人都可以访问, 并且任何一方都不可以改变.

1620中心化结构与去中心化结构, 来源: SoftwareAdvice

应用

尽管区块链通常会让人联想到比特币, 但该技术有很多用途.有几大类的区块链应用程序, 其中包括:

货币和数字资产

组成比特币的区块链将资金发送给全球的个体和商家.但区块链也可以创建数字资产, 如股票和债券.

可验证的数据和合约

区块链可以创建任何数据, 文件或合约的可验证记录.这对于任何使用大数据的行业(如医疗行业或政府)都很有用.

了解代码

在开始之前, 我想指出本文假设你对编程有一个基本的了解, 并对计算机科学理论有一定的了解.

这篇文章并不是包罗万象的, 而是为那些希望扩展技术知识的人介绍区块链编程.

我相信真正理解一个概念的最好方法就是付诸实践.如果你有兴趣了解如何实现一个区块链合约, 我将在下面编写一个简单易行的分步教程.

你将使用以太坊来制作一份智能合约.以太坊是一个内建了图灵完备的编程语言的区块链, 这意味着它可以运行应用程序为任何可计算的问题建模(只要运行时间和内存允许).在开始之前, 请务必熟悉以下以太坊术语:

账户是以太坊的基本单元或对象. 区块链跟踪每个帐户的状态. 有两种类型的帐户: 外部拥有帐户(EOA, Externally Owned Accounts )(由人类用户控制)和合约帐户(由其内部合约代码控制并可由外部拥有帐户激活).

"智能合约(Smart Contract)"或"去中心化应用(DApp, Decentralized Application)"由合约账户中的代码确定, 当EOA将交易发送至合约账户时, 该合约账户将被激活.合约账户由外部EOA触发, 以产生一个被所有看到它的节点都接受的应答.

每个帐户最多包含四个字段:

  • 随机数(Nonce, 用于确保每次交易只发生一次的计数器)
  • 以太平衡
  • 合约代码
  • 存储

交易是一个存储从账户间发送的消息的已签名的数据包.它包含以下数据字段:

  • 接受者
  • 签名
  • 以太转移量
  • 数据

以太是以太坊的加密货币(ETH / USD = ~$50, 按当天的汇率换算), 每当在以太坊上进行一次动作时, 以太就会兑换成一笔费用.

1620来源: EtherScan

为了降低恶意交易的风险, 例如分布式拒绝服务(DDoS, Distributed Denial of Service)攻击, 以太坊会对每一笔通过它执行的交易收取费用.

那么谁收取这些费用?有些节点称为矿工, 这些矿工收取费用以验证和执行所有交易.矿工将交易分组成区块, 然后可以将其添加到区块链中.

现在你已经对以太坊的工作原理有了一个基本的了解, 是时候开始了.

请注意, 我使用的是Ubuntu Linux, 但这也适用于其他Linux发行版以及MacOS(含Homebrew)和 Windows 10(使用你的终端和最新稳定版本).命令行工具和安装技术的完整列表可以在这里找到.

制作区块链

安装geth

首先你需要从PPA安装以太坊.在你的终端中, 运行以下命令:

sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install -y ethereum

现在你可以通过创建一个新目录并写入一个json文件来创建一个初始块(genesis block):

cd
mkdir eth-new
cd eth-new
nano genesis.json

接下来, 将以下代码粘贴到json文件中以创建初始块:

{"nonce": "0x0000000000000042","mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000","difficulty": "0x4000","alloc": {},"coinbase": "0x0000000000000000000000000000000000000000","timestamp": "0x00","parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000","extraData": "Custem Ethereum Genesis Block","gasLimit": "0xffffffff"
}

按下Ctrl + X, Y, 回车保存这个新的生成块文件.

创建区块链

下面创建区块链, 将maxpeers命令设置为0以禁用网络.

mkdir eth-data
geth --datadir eth-new genesis.json init eth-new/genesis.json --networkid 123 --nodiscover --maxpeers 0 console

在geth控制台中, 键入以下内容以创建一个新帐户并输入任何你想要的内容创建一个新密码.你将必须输入你的新密码两次.

personal.newAccount()

之后的输出应该是一串字母和数字 -- 你帐户的地址.将该地址保存在某处并通过输入"exit"并按回车键退出.

发送以太到你的帐户

你需要重新打开生成初始块文件.键入以下内容:

nano genesis.json

在"alloc"那个花括号中, 粘贴你先前保存的帐户地址.继续操作, 并给自己一笔以太的款项. 在下面的"balance"旁边显示的金额等于10以太.

{"nonce": "0x0000000000000042","mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000","difficulty": "0x4000","alloc": {"0x09c7b615a1c5b3016ff6b521723364aa9382ec6e": {"balance": "10000000000000000000"}},"coinbase": "0x0000000000000000000000000000000000000000","timestamp": "0x00","parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000","extraData": "Custem Ethereum Genesis Block","gasLimit": "0xffffffff"
}

完成更新后, 使用Ctrl + X, Y, 回车保存文件.

删除旧的区块链并创建一个新的区块链

执行这些命令清除旧的区块链数据并重新启动geth:

cd eth-data
rm -rf chaindata dapp history nodekey
cd ..
geth --datadir eth-new genesis.json --networkid 123 --nodiscover --maxpeers 0 console

在geth控制台中, 键入以下命令:

> primary = eth.accounts[0]
> web3.fromWei(eth.getBalance(primary), "ether")

你的地址和你的10以太的余额将会出现.

开始挖矿( Mining)

为了有一个工作区块链, 你需要创建矿工. 要做到这一点, 请通过键入"exit"并按回车键退出geth控制台.

要开始挖矿, 请执行以下命令:

geth --mine --datadir eth-data --networkid 123 --nodiscover --> maxpeers 0 console 2>>geth.log

Geth现在就开始.如前所述, 你已经创建了一位收取以太费用的矿工.输入以下命令以查看你的余额:

> primary = eth.accounts[0]
> balance = web3.fromWei(eth.getBalance(primary), "ether")

你现在应该拥有比以前更多的以太.

安装Solc

你正在使用的以太坊合约将使用Solidity编写. 你必须安装Solc编译器才能使用Solidity. 为此, 请打开一个新终端并输入以下内容:

bash
sudo add-apt-repository ppa:ethereum/ethereum

出现一条消息, 提示说"Press ENTER to continue.(按ENTER键继续)"按下回车, 然后键入以下内容:

sudo apt-get update
sudo apt-get install solc -y
which solc

你需要记住将要输出的Solc的路径. 返回到显示geth控制台的终端窗口. 执行这些命令, 将\<path>更改为返回给你的路径:

admin.setSolc("<path>")
eth.getCompilers()

对第二个命令的回应是"Solidity", 它告诉我们你现在已拥有Solc并可以使用Solidity.

了解欢迎(greeter)合约

下面是一个带有添加的评论的简单合约代码, 代码是从Sams Class取过来并修改的.它包含两种类型的合约.第一种是凡人合约, 指定一个合约可以由撰写合约的人来处理掉, 并且需要将合约声明为合约, 因为合约默认为永存的.第二个是欢迎合约, 将打印出一个小问候.

contract mortal {/* Define var owner of the type address*//* 定义address类型的变量owner*/address owner;
    /* this function sets the owner of the contract *//* 此函数设置了合约的主人 */function mortal() { owner = msg.sender; }
   /* Function to recover fees *//* 收回费用的函数 */function kill() { if (msg.sender == owner) selfdestruct(owner); }
}
contract greeter is mortal {/* define variable greeting type*//* 定义变量 greeting 的类型*/string greeting;
    /* this runs when the contract is executed *//* 当合约运行时执行以下函数 */function greeter(string _greeting) public {greeting = _greeting;}
   /* main*//* 主函数 */function greet() constant returns (string) {return greeting;}
}
解锁你的帐户

开始一个合约需要花费以太费用, 因此你需要解锁你的账户.你可以通过输入以下内容来完成此操作:

primary = eth.accounts[0]
personal.unlockAccount(primary)

并输入你的密码.一旦你看到输出"true", 你就知道你已经成功地解锁了你的账户.

编译你的合约

在geth控制台中, 从先前的一行没有注释的代码中复制并粘贴合约的整个源代码:

var greeterSource = 'contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }'

这将返回"undefined(未定义)".

在geth控制台中, 键入以下内容:

> var greeterCompiled = web3.eth.compile.solidity(greeterSource)

这次的回应又是"undefined", 如下所示.

准备部署合约

现在你已拥有你的凡人合约和欢迎合约, 你将需要定义问候语并实例化你的帐户对象.这将需要更多的以太.

在geth控制台中, 粘贴这些命令:

var _greeting = "Hello World!"
var greeterContract = web3.eth.contract(greeterCompiled.greeter.info.abiDefinition);
var greeter = greeterContract.new(_greeting, {from: eth.accounts[0], data: greeterCompiled.greeter.code, gas: 1000000}, function(e, contract){if(!e) {
    if(!contract.address) {console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined...");
     } else {console.log("Contract mined! Address: " + contract.address);console.log(contract);}
  }
})

出现"Contract transaction send(合约交易发送)"消息, 几秒钟后, 你会看到一条消息: "Contract mined! (合约已开采! )"

测试合约

以下命令将首先返回一个长地址, 然后返回你的问候语.

eth.getCode(greeter.address)
greeter.greet()

1620欢迎语

当你看到这个欢迎语, 你已经创建了你的第一个婴儿期的区块链程序.做得好!



原文发布时间为:2018-03-02
本文作者:Mr.Crypto
本文来源:腾讯云 云+社区,如需转载请联系原作者。

这篇关于从什么是区块链到一个小时内构建区块链的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/664131

相关文章

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加