基于 Java 语言构建区块链(七)—— 交易脚本(智能合约)
上一篇 文章我们引入 UTXOset 和 Merkle Tree 对交易流程做了些许优化,本篇文章我们将介绍比特币另一个更加重要的机制 —— 交易脚本。
在介绍 UTXO 的文章 中,我们已经了解到比特币的交易输出由锁定脚本锁定,它只能被交易输出所被指向的交易输入中的解锁脚本所解锁,今天让我们来详细讨论一下它们的实现机制。
交易详情如今,大多数比特币网络处理的交易是以 “Alice 付给 Bob” 的形式存在的。同时,它们是以一种称为 “P2PKH”(Pay-to-Public-Key-Hash)脚本为基础的。然而,通过使用脚本来锁定输出和解锁输入意味着通过使用编程语言,比特币交易可以包含无限数量的条件。当然,比特币交易并不限于 “Alice 付给 Bob” 的形式和模式。”
这只是这个脚本语言可以表达的可能性的冰山一角。稍后, 我们将会全面展示比特币交易脚本语言的各个组成部分;同时,我们也会演示如何使用它去表达复杂的使用条件以及解锁脚本如何去满足这些花费条件。
比特币交易验证并不基于一个不变的模式,而是通过运行脚本语言来实现。这种语言可以表达出多到数不尽的条件变种。这也 ...
基于 Java 语言构建区块链(六)—— 交易(Merkle Tree)
文章的主要思想和内容均来自 https://jeiwan.cc/posts/building-blockchain-in-go-part-6/
引言在这一系列文章的最开始部分,我们提到过区块链是一个分布式的数据库。那时候,我们决定跳过” 分布式” 这一环节,并且聚焦于” 数据存储” 这一环节。到目前为止,我们几乎实现了区块链的所有组成部分。在本篇文章中,我们将会涉及一些在前面的文章中所忽略的一些机制,并且在下一篇文章中我们将开始研究区块链的分布式特性。
前面各个部分内容:
基本原型
工作量证明
持久化 & 命令行
交易(UTXO)
地址(钱包)
UTXO 池在 持久化 & 命令行 这篇文章中,我们研究了比特币核心存储区块的方式。当中我们提到过与区块相关的数据存储在 blocks 这个数据桶中,而交易数据则存储在 chainstate 这个数据桶中,让我们来回忆一下,chainstate 数据桶的数据结构:
‘c’ + 32-byte transaction hash -> unspent transaction output record ...
基于 Java 语言构建区块链(五)—— 地址(钱包)
文章的主要思想和内容均来自 https://jeiwan.cc/posts/building-blockchain-in-go-part-5/
引言在 上一篇 文章当中,我们开始了交易机制的实现。你已经了解到交易的一些非个人特征:没有用户账户,您的个人数据(例如:姓名、护照号码以及 SSN (美国社会安全卡(Social Security Card)上的 9 位数字))不是必需的,并且不存储在比特币的任何地方。但仍然必须有一些东西能够识别你是这些交易输出的所有者(例如:锁定在这些输出上的币的所有者)。这就是比特币地址的作用所在。到目前为止,我们只是使用了任意的用户定义的字符串当做地址,现在是时候来实现真正的地址了,就像它们在比特币中实现的一样。
比特币地址这里有一个比特币地址的示例:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa。这是一个非常早期的比特币地址,据称是属于中本聪的比特币地址。比特币地址是公开的。如果你想要给某人发送比特币,你需要知道对方的比特币地址。但是地址(尽管它是唯一的)并不能作为你是一个钱包所有者的凭证。事实上,这样的地址是 ...
基于 Java 语言构建区块链(四)—— 交易(UTXO)
文章的主要思想和内容均来自 https://jeiwan.cc/posts/building-blockchain-in-go-part-4/
引言上一篇 文章,我们实现了区块数据的持久化,本篇开始交易环节的实现。交易这一环节是整个比特币系统当中最为关键的一环,并且区块链唯一的目的就是通过安全的、可信的方式来存储交易信息,防止它们创建之后被人恶意篡改。今天我们开始实现交易这一环节,但由于这是一个很大的话题,所以我们分为两部分:第一部分我们将实现区块链交易的基本机制,到第二部分,我们再来研究它的细节。
比特币交易如果你开发过 Web 应用程序,为了实现支付系统,你可能会在数据库中创建一些数据库表:账户 和 交易记录。账户用于存储用户的个人信息以及账户余额等信息,交易记录用于存储资金从一个账户转移到另一个账户的记录。但是在比特币中,支付系统是以一种完全不一样的方式实现的,在这里:
没有账户
没有余额
没有地址
没有 Coins(币)
没有发送者和接受者
由于区块链是一个公开的数据库,我们不希望存储有关钱包所有者的敏感信息。Coins 不会汇总到钱包中。交易不会将资金从 ...
基于 Java 语言构建区块链(三)—— 持久化 & 命令行
文章的主要思想和内容均来自:https://jeiwan.cc/posts/building-blockchain-in-go-part-3/
引言上一篇 文章我们实现了区块链的工作量证明机制(Pow),尽可能地实现了挖矿。但是距离真正的区块链应用还有很多重要的特性没有实现。今天我们来实现区块链数据的存储机制,将每次生成的区块链数据保存下来。有一点需要注意,区块链本质上是一款分布式的数据库,我们这里不实现” 分布式”,只聚焦于数据存储部分。
数据库选择到目前为止,我们的实现机制中还没有区块存储这一环节,导致我们的区块每次生成之后都保存在了内存中。这样不便于我们重新使用区块链,每次都要从头开始生成区块,也不能够跟他人共享我们的区块链,因此,我们需要将其存储在磁盘上。
我们该选择哪一款数据库呢?事实上,在《比特币白皮书》中并没有明确指定使用哪一种的数据库,因此这个由开发人员自己决定。中本聪 开发的 Bitcoin Core 中使用的是 LevelDB。原文 Building Blockchain in Go. Part 3: Persistence and CLI 中使用的 ...
基于 Java 语言构建区块链(二)—— 工作量证明
文章的主要思想和内容均来自 https://jeiwan.cc/posts/building-blockchain-in-go-part-2/
引言在 上一篇 文章中,我们实现了区块链最基本的数据结构模型,添加区块以及和前一个区块连接在一起。但是,我们的实现方式非常简单,而真实的比特币区块链中,每一个区块的添加都是需要经过大量的计算才可以完成,这个过程就是我们熟知的挖矿。
工作量证明机制区块链最关键的一个思想就是,必须进行大量且困难的计算工作才能将交易数据存放到区块链上。这种工作机制才能保证整个区块链数据的安全性和一致性。同时,完成这个计算工作的矿工会得到相应的 Token 奖励。
这套机制和我们的现实生活非常相似:我们必须努力工作来赚取报酬用以维持我们的生活。在区块链中,网络中的矿工们努力工作来维持区块链网络,为其添加区块,并且获得一定的 Token 奖励。作为他们工作的成果,一个区块以安全的方式被组合进了区块链中,这样就保证了整个区块链数据库的稳定性。还有一个必须要注意的是,某个矿工完成了计算工作的结果,还必须得到其他所有矿工的认同(证明是正确的),这样才算完成 ...
基于 Java 语言构建区块链(一)—— 基本原型
文章的主要思想和内容均来自 https://jeiwan.cc/posts/building-blockchain-in-go-part-1/
引言区块链技术是一项比人工智能更具革命性的技术,人工智能只是提高了人类的生产力,而区块链则将改变人类社会的生产关系,它将会颠覆我们人类社会现有的协作方式。了解和掌握区块链相关知识和技术,是我们每位开发人员必须要去做的事情,这样我们才能把握住这波时代趋势的红利。
本文将基于 Java 语言构建简化版的 blockchain,来实现数字货币。
创建区块区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。区块被从后向前有序地链接在这个链条里,每个区块都指向前一个区块。以比特币为例,每个区块主要包含如下信息字段:
区块大小:用字节表示的区块数据大小
区块头:组成区块头的几个字段
区块头 hash 值
父区块头 hash 值
时间戳:区块产生的近似时间
Merkle 根:该区块中交易的 merkle 树根的哈希值
难度目标:该区块工作量证明算法的难度目标
Nonce:用于工作量证明算法的计数器
交易计数器:交易的数量
...
Node.Js 学习笔记
Node.js 是我 2018 年计划学习的一门编程语言,学习一下 JS 异步编程与函数式编程的思想。
项目地址:https://github.com/wangweiX/node.js-learning
Javascript 学习
Variables
Operators
Primitive Data Type
Functions
Objects
Symbol Type
Array
Map,WeakMap,Set,WeakSet
Iterables
JSON
Date and time
Property flags and descriptors
Property getters and setters
Prototypal inheritance
Node.Js 学习
Build First Web Server
EOS 学习 (3) | EOS 货币合约演示
本文演示如何创建账号、如何转账
官方文档:https://github.com/eosio/eos#example-currency-contract-walkthrough
启动 EOSIO12$ cd ~/eos/build/programs/eosiod/$ ./eosiod
设置钱包并导入账户私钥创建钱包
请确保你在启动 eosiod 之前,已经在 config.ini 中配置了钱包插件 plugin = eosio::wallet_api_plugin
1234$ cd ~/eos/build/programs/eosioc/$ ./eosioc wallet create -n wangwei # 将在 ~/eos/build/programs/eosiod/data-dir/ 下生成一个名为wangwei的钱包文件 wangwei.wallet# 不加 -n wangwei, 则会生成默认钱包文件,名为 default.wallet 文件
导入测试账号
将配置文件 config.ini 中给予的测试私钥导入到钱包中来,该私钥为测试账号 in ...
由浅入深学习 EOS
带你系统性地、由浅入深地学习和了解 EOS 相关技术……
前提
需要对区块链有个基本的认识,比如什么是区块链,有哪些特点等等,网上资料很多。
对比特币的工作原理有一个深入的研究,推荐《精通比特币》第二版,一定要精读。
对以太坊、智能合约有所了解。
初识 EOS
熟读 EOS 白皮书,这一块后面我会写一些 EOS 白皮书解读版出来。
白皮书地址:https://github.com/EOSIO/Documentation
EOS 术语表
部署运行 EOS
运行 EOS 源代码(一)
运行 EOS 源代码(二)
EOS Programs & Tools 介绍
EOS 货币合约演示
连接 EOS 公共测试网络