diff --git a/doc/build.md b/doc/build.md index c3eeb47ac..b2fdccd8b 100644 --- a/doc/build.md +++ b/doc/build.md @@ -1,6 +1,6 @@ # Grin - Build, Configuration, and Running -*Read this in other languages: [Español](build_ES.md), [Korean](build_KR.md), [日本語](build_JP.md).* +*Read this in other languages: [Español](build_ES.md), [Korean](build_KR.md), [日本語](build_JP.md), [简体中文](build_ZH-CN.md).* ## Supported Platforms diff --git a/doc/build_ES.md b/doc/build_ES.md index c262c4921..ca6d6ff9f 100644 --- a/doc/build_ES.md +++ b/doc/build_ES.md @@ -1,5 +1,7 @@ # Grin - Compilación, configuración y ejecución +*Lea esto en otros idiomas: [English](build.md), [日本語](build_JP.md), [Korean](build_KR.md), [简体中文](build_ZH-CN.md).* + ## Plataformas soportadas En un largo plazo, es probable que la mayoría de las plataformas sean compatibles en cierta medida. diff --git a/doc/build_JP.md b/doc/build_JP.md index 7525e6ab8..12006cb5d 100644 --- a/doc/build_JP.md +++ b/doc/build_JP.md @@ -1,6 +1,6 @@ # grin - ビルド、設定、動作確認 -*Read this in other languages: [Español](build_ES.md), [Korean](build_KR.md), [日本語](build_JP.md).* +*この文章を他の言語で読む: [English](build.md), [Español](build_ES.md), [Korean](build_KR.md), [简体中文](build_ZH-CN.md).* ## 動作環境 diff --git a/doc/build_KR.md b/doc/build_KR.md index 78bd636fd..0f84d76c4 100644 --- a/doc/build_KR.md +++ b/doc/build_KR.md @@ -1,6 +1,6 @@ # Grin - Build, Configuration, and Running -*다른 언어로 되어있는 문서를 읽으려면:[에스파냐어](build_ES.md). +*다른 언어로 되어있는 문서를 읽으려면: [English](build.md), [Español](build_ES.md), [日本語](build_JP.md), [简体中文](build_ZH-CN.md).* ## 지원하는 플랫폼들에 대해서 diff --git a/doc/build_ZH-CN.md b/doc/build_ZH-CN.md new file mode 100644 index 000000000..965c9508c --- /dev/null +++ b/doc/build_ZH-CN.md @@ -0,0 +1,126 @@ +# Grin - 构建,配置和运行 + +*阅读其它语言版本: [English](build.md), [Español](build_ES.md), [日本語](build_JP.md), [Korean](build_KR.md).* + +## 支持的平台 + +从长远来看,大多数平台都可能会得到一定程度的支持。Grin 的编写语言 `rust` 已为大多数平台建立了目标。 + +到目前为止进度: + +* Linux x86\_64 and macOS [grin + 挖矿 + 部署] +* 暂时不支持 Windows 10 [部分 grin。暂时不支持挖矿。希望得到帮助!] + +## 要求 + +* rust 1.34+ (使用 [rustup]((https://www.rustup.rs/))- i.e. `curl https://sh.rustup.rs -sSf | sh; source $HOME/.cargo/env`) +* 如果已经安装过了 rust,只需要运行 `rustup update` 升级版本 +* clang +* ncurses 和 libs (ncurses, ncursesw5) +* zlib libs (zlib1g-dev or zlib-devel) +* pkg-config +* libssl-dev +* linux-headers (有报告指出在 Alpine linux 上是必需的) +* llvm + +对于基于 Debian 的发行版(Debian,Ubuntu,Mint 等),一行就可以搞定(rust 的安装除外): + +```sh +apt install build-essential cmake git libgit2-dev clang libncurses5-dev libncursesw5-dev zlib1g-dev pkg-config libssl-dev llvm +``` + +macOS 用户: + +```sh +xcode-select --install +brew install --with-toolchain llvm +brew install pkg-config +brew install openssl +``` + +## 构建步骤 + +```sh +git clone https://github.com/mimblewimble/grin.git +cd grin +cargo build --release +``` + +Grin也可以在 debug 模式下构建(不带 `--release` 参数,或是使用 `--debug` 或 `--verbose` 参数),但是由于加密的开销很大,这将影响快速同步的性能。 + +## 构建错误 + +详见 [故障排除](https://github.com/mimblewimble/docs/wiki/Troubleshooting) + +## 构建得到了什么? + +成功的构建可以提供给您: + +* `target/release/grin` - grin 主要的二进制文件 + +默认情况下,grin 创建和使用的所有数据,配置和日志文件都位于隐藏的 `~/.grin` 目录中(位于用户主目录下)。 +您可以通过编辑文件 `~/.grin/main/grin-server.toml` 来修改所有配置。 + +也可以让 grin 在当前目录中创建其数据文件。只需要运行 + +```sh +grin server config +``` + +它将在当前目录中生成一个 `grin-server.toml` 文件,该文件已预先配置为使用当前目录中的所有数据。 +在包含 `grin-server.toml` 文件所在的目录下运行 grin 将使用该文件中的配置,而不是默认的 `~/.grin/main/grin-server.toml`。 + +在测试时,将 grin 二进制文件放在您的 `PATH` 中,如下所示: + +```sh +export PATH=`pwd`/target/release:$PATH +``` + +假设您从 Grin 安装的根目录运行。 + +然后您可以直接运行 `grin`(尝试使用 `grin help` 获得更多选项)。 + +## 配置 + +Grin 尝试使用合理的默认值运行,并且可以通过 `grin-server.toml` 文件进行进一步配置。 +该文件是在首次运行时由 grin 生成的,并且包含有关每个可用选项的文档。 + +虽然建议您通过 `grin-server.toml` 配置 grin 服务器,但也可以提供命令行开关以覆盖文件中的任何设置。 + +有关 grin 命令及其开关的帮助,请尝试: + +```sh +grin help +grin wallet --help +grin client --help +``` + +## Docker + +```sh +docker build -t grin -f etc/Dockerfile . +``` +对于 floonet, 使用 `etc/Dockerfile.floonet` 代替 + +您可以绑定安装您的 grin 缓存以在容器中运行。 + +```sh +docker run -it -d -v $HOME/.grin:/root/.grin grin +``` +如果您更喜欢使用名为 volume 的 docker,则可以传递 `-v dotgrin: /root/.grin` 以替换。 +使用命名卷在创建卷时会复制默认配置。 + +## 跨平台构建 + +Rust(cargo)可以在许多平台上构建 grin,因此从理论上讲,可以在低功耗设备上运行 `grin` 作为验证节点。要在 x86 Linux 平台上交叉编译 `grin` 并生成 ARM 二进制文件,例如,为一个 Raspberry Pi。 + +## 使用 grin + +Wiki页面 [Wallet User Guide](https://github.com/mimblewimble/docs/wiki/Wallet-User-Guide) 和链接页面提供了有关我们提供的功能,故障排除等更多信息。 + +## 在 Grin 中挖矿 + +请注意,针对 Grin 的所有挖矿功能已移至一个名为 [grin-miner](https://github.com/mimblewimble/grin-miner) 的独立软件包中。 +一旦您的 Grin 代码节点启动并运行,就可以通过针对正在运行的 Grin 节点构建并运行 grin-miner 开始挖矿。 + +为了使 grin-miner 能够与您的 grin 节点进行通信,请确保在您的 `grin-server.toml` 配置文件中有 `enable_stratum_server = true`,并且您正在运行钱包监听器(`grin wallet listen`)。 diff --git a/doc/code_structure.md b/doc/code_structure.md index 51579fc0d..e14c3e9f7 100644 --- a/doc/code_structure.md +++ b/doc/code_structure.md @@ -1,5 +1,7 @@ # Grin code structure +*Read this in other languages: [简体中文](code_structure_ZH-CN.md).* + Grin is built in [Rust](https://www.rust-lang.org/), a memory safe, compiled language. Performance critical parts like the Cuckoo mining algorithm are built as plugins, making it easy to swap between algorithm implementations for various hardware. Grin comes with CPU and experimental GPU support. ## Files in project root diff --git a/doc/code_structure_ZH-CN.md b/doc/code_structure_ZH-CN.md new file mode 100644 index 000000000..bb1ad4a94 --- /dev/null +++ b/doc/code_structure_ZH-CN.md @@ -0,0 +1,64 @@ +# Grin 代码结构 + +*阅读其它语言版本: [English](code_structure.md).* + +Grin 使用 [Rust](https://www.rust-lang.org/)编写,这是一个内存安全的编译语言。诸如 Cuckoo 挖掘算法之类的性能关键部分都是作为插件构建的,因此可以轻松地在各种硬件的算法实现之间进行交换。Grin 带有 CPU 和实验性 GPU 支持。 + +## 项目根目录中的文件 + +List of files tracked in `git` and some files you'll create when you use grin. +`git` 中跟踪的文件列表以及使用 grin 时将创建的一些文件。 + +- [CODE_OF_CONDUCT](../CODE_OF_CONDUCT.md) - 如果您想参与到其中,该做些什么。取自 rust,并稍作修改。 +- [CONTRIBUTING](../CONTRIBUTING.md) - 如何帮助并参与其中成为 grin 的一部分。 +- [Cargo.toml](../Cargo.toml) 和 Cargo.lock(本地创建,*不*在 git 中)- 定义如何编译和构建项目代码。 +- [LICENSE](../LICENSE) - Apache 2.0 license +- [README](../README.md) - 您应该阅读的第一个文档,同时它列出了包含更多详细信息的进阶阅读。 +- [rustfmt.toml](../rustfmt.toml) - rustfmt 的配置文件。在提交*新*代码之前需要。 + +## 文件夹结构 + +在检查了 grin,构建和使用之后,这些是您的文件夹将会有以下内容: + +- `api`\ + 可通过 REST 访问的 ApiEndpoints 代码。 +- `chain`\ + 区块链实现,接受一个块(请参阅 pipe.rs)并将其添加到链中,或拒绝它。 +- `config`\ + 用于处理配置的代码。 +- `core`\ + 所有核心类型:哈希,块,输入,输出,以及如何对其进行序列化。核心挖掘算法等。 +- `doc`\ + 所有文档。 +- `servers`\ + grin 服务的许多组成部分(adapters, lib, miner, seed, server, sync, types),包括挖矿服务器。 +- `keychain`\ + Code for working safely with keys and doing blinding. +- `p2p`\ + 所有点对点连接和与协议相关的逻辑(握手,块传播等)。 +- `pool`\ + 交易池实现的代码。 +- `server`\ + 在启动服务器之前,您[要创建的文件夹](build_ZH-CN.md):cd 到项目根目录;mkdir server;cd server;grin server start(或 run),它将创建一个子文件夹 .grin + - `.grin` + - `chain` - 具有区块链块和相关信息的数据库 + - `peers` - 一个数据库,其中包含您连接的 Grin peers 节点的列表 + - `txhashset` - 包含内核,范围证明和输出的文件夹,每个文件夹都有一个 pmmr_dat.bin 文件 +- `src`\ + 构建 grin 可执行文件的代码。 +- `store`\ + 数据存储 - Grin 在 LMDB(键值嵌入式数据存储)周围使用了接近零成本的 Rust 包装器。 +- `target`\ + 在编译和构建过程完成之后,grin 的二进制文件所在的位置。 + 万一遇到麻烦,请参阅[troubleshooting](https://github.com/mimblewimble/docs/wiki/Troubleshooting) +- `util`\ + 底层 rust 工具。 +- `wallet`\ + 简单的命令行钱包实现。将会创建: + - `wallet_data` - 储存您“输出”的数据库,一旦被确认并到期,就可以通过 [`grin wallet send`](wallet/usage.md) 命令来花费掉。(本地创建,*不*包含在 git 中) + - `wallet.seed` - 您的钱包种子。(本地创建,*不*包含在 git 中) + +## grin 依赖 + +- [secp256k1](https://github.com/mimblewimble/rust-secp256k1-zkp) + libsecp256k1 的集成和 rust 绑定,还有一些更动等待更新。在 util/Cargo.toml 中被导入。 diff --git a/doc/coinbase_maturity_KR.md b/doc/coinbase_maturity_KR.md index 1b191dffd..5b5e2fa33 100644 --- a/doc/coinbase_maturity_KR.md +++ b/doc/coinbase_maturity_KR.md @@ -38,8 +38,8 @@ Grin은 동시에 출력 셋에 중복된 실행값(commitment)이 존재하는 아래와 같은 몇 가지가 이런 상황을 복잡하게 만듭니다. 1. 특히 빈 블록의 경우 두 블록이 동일한 보상을 받을 수 있습니다. 뿐만 아니라 거래 수수료가 있는 비어 있지 않은 블록의 경우에도 가능합니다. -2. 코인베이스 출력이 아닌 출력값이 코인베이스 출력과 동일한 값을 가질 수 있습니다. -3. 권장되진 않지만 마이너가 비밀키(private key)를 재사용 할 수 있습니다. +1. 코인베이스 출력이 아닌 출력값이 코인베이스 출력과 동일한 값을 가질 수 있습니다. +1. 권장되진 않지만 마이너가 비밀키(private key)를 재사용 할 수 있습니다. Grin은 동시에 출력 셋에 중복된 실행값(commitment)이 존재하는 것을 허용하지 않습니다. 그러나 출력 셋은 특정 체인 분리(fork)의 상태에 따라 다릅니다. 같은 순간에 있는 서로 다른 체인에 중복 된 *동일한* 실행값(commitment)가 동시에 *존재할 수 있습니다*. 그리고 이러한 중복된 실행값은 다른 "lock height"를 가질 수 있습니다. 그리고 각각 다른 체인에서 이런 실행값들은 코인베이스 만기가 다 되어서 소비 할 수 있수도 있습니다. diff --git a/doc/contract_ideas.md b/doc/contract_ideas.md index 25157647a..2f4c9df6a 100644 --- a/doc/contract_ideas.md +++ b/doc/contract_ideas.md @@ -15,7 +15,7 @@ Note that this requires both chains to support hash preimages: all Bitcoin scrip (So far this is the same as the classic Bitcoin atomic swap by Tier Nolan [3]; the difference in locktimes is because during part of the protocol Igno can take his coins but I can't yet take mine, so I want to be sure he can't do this and simultaneously back out. This way ff he takes the coins, I can take mine, but if he backs out then I've long since backed out, and these are his only possibilities.) - 2. Igno and I construct transactions that move the locked coins to their final destinations. We agree on the kernels and signature nonces, and in particular on signature challenges e and e'. +2. Igno and I construct transactions that move the locked coins to their final destinations. We agree on the kernels and signature nonces, and in particular on signature challenges e and e'. 3. Igno sends me a "conversion" keys sconv which satisfies diff --git a/doc/fast-sync.md b/doc/fast-sync.md index d88f61dee..3358f75e2 100644 --- a/doc/fast-sync.md +++ b/doc/fast-sync.md @@ -1,6 +1,6 @@ # Fast Sync -*Read this in other languages: [Español](fast-sync_ES.md), [Korean](fast-sync_KR.md).* +*Read this in other languages: [Español](fast-sync_ES.md), [Korean](fast-sync_KR.md), [简体中文](fast-sync_ZH-CN.md).* In Grin, we call "sync" the process of synchronizing a new node or a node that hasn't been keeping up with the chain for a while, and bringing it up to the diff --git a/doc/fast-sync_ES.md b/doc/fast-sync_ES.md index d87ab298a..7af35ce96 100644 --- a/doc/fast-sync_ES.md +++ b/doc/fast-sync_ES.md @@ -1,5 +1,7 @@ # Sincronización rápida +*Lea esto en otros idiomas: [English](fast-sync.md), [简体中文](fast-sync_ZH-CN.md), [Korean](fast-sync_KR.md).* + En Grin, llamamos "sync" al proceso de sincronizar un nuevo nodo o un nodo que no ha estado al día con la cadena durante un tiempo, y llevarlo hasta el último bloque conocido. La Descarga Inicial de Bloques (o IBD) es usada a menudo por otras cadenas de bloques, pero esto es problemático para Grin ya que típicamente no descarga bloques completos.. diff --git a/doc/fast-sync_KR.md b/doc/fast-sync_KR.md index 21fe9ec07..edb716466 100644 --- a/doc/fast-sync_KR.md +++ b/doc/fast-sync_KR.md @@ -1,6 +1,6 @@ # 빠른 동기화 -*이 문서를 다른 언어로 읽으시려면: [에스파냐어](fast-sync_ES.md).* +*다른 언어로 되어있는 문서를 읽으려면: [English](fast-sync.md), [Español](fast-sync_ES.md), [简体中文](fast-sync_ZH-CN.md).* Grin에서는 새로 네트워크에 참여하는 노드나 얼마 동안 체인을 따라 잡지 않은 노드(의 상태)를 알려진 최신 블록으로( 원문에서는 most-worked block 이라고 표현- 역자 주 ) 가져 오는 프로세스를 "동기화"라고 부릅니다. Initial Block Download (또는 IBD)는 다른 블록 체인에서 자주 사용되지만 빠른 동기화를 사용하는 Grin에서는 일반적으로 전체 블록을 다운로드하지 않으므로 문제가 됩니다. diff --git a/doc/fast-sync_ZH-CN.md b/doc/fast-sync_ZH-CN.md new file mode 100644 index 000000000..ba2272fba --- /dev/null +++ b/doc/fast-sync_ZH-CN.md @@ -0,0 +1,15 @@ +# 快速同步 + +*阅读其它语言版本: [English](fast-sync.md), [Español](fast-sync_ES.md), [Korean](fast-sync_KR.md).* + +在 Grin 中,我们把同步一个新节点或一段时间未跟上链的节点,并将其升级到最新的已知工作量最大的块的过程称为“同步”("sync")。 初始块下载(或 IBD)通常在其他区块链中被采用,但这对 Grin 来说这是有问题的,因为它通常不会下载完整的块。 + +简而言之,在 Grin 中的快速同步会执行以下操作: + +1. 按照其他节点的建议,在最有效的链上按块下载所有块头(block header)。 +1. 找到距链头(chain head)足够靠后的一个头(header)。这称为节点视界(node horizon),因为它是节点可以在不触发另一个新的完整同步的情况下在新分支上重组其链的最远位置。 +1. 下载处于视界的完整状态,包括未花费(unspent)状态输出,范围证明(range proof)和内核数据(kernel data),以及所有相应的 MMR。这些其实只是一个大的 zip 文件。 +1. 验证完整状态。 +1. 从视界开始下载完整的块直到链头。 + +在本节的其余部分,我们将详细阐述每个步骤。 diff --git a/doc/grin4bitcoiners.md b/doc/grin4bitcoiners.md index 7ee996fbb..a06f6d3ba 100644 --- a/doc/grin4bitcoiners.md +++ b/doc/grin4bitcoiners.md @@ -7,8 +7,8 @@ There are 3 main properties of Grin transactions that make them private: 1. There are no addresses. -2. There are no amounts. -3. 2 transactions, one spending the other, can be merged in a block to form only one, removing all intermediary information. +1. There are no amounts. +1. 2 transactions, one spending the other, can be merged in a block to form only one, removing all intermediary information. The 2 first properties mean that all transactions are indistinguishable from one another. Unless you directly participated in the transaction, all inputs and outputs look like random pieces of data (in lingo, they're all random curve points). diff --git a/doc/grin4bitcoiners_KR.md b/doc/grin4bitcoiners_KR.md index 1feb18a02..525764f32 100644 --- a/doc/grin4bitcoiners_KR.md +++ b/doc/grin4bitcoiners_KR.md @@ -5,8 +5,8 @@ Grin 트랜잭션에는 트랜잭션을 프라이빗하게 만드는 3 가지 주요 속성이 있습니다. 1. 주소가 없습니다. -2. 금액은 없습니다. -3. 하나는 다른 트랜잭션을 사용하는 2 개의 트랜잭션을 하나의 블록으로 병합하여 모든 중간 정보를 제거 할 수 있습니다. +1. 금액은 없습니다. +1. 하나는 다른 트랜잭션을 사용하는 2 개의 트랜잭션을 하나의 블록으로 병합하여 모든 중간 정보를 제거 할 수 있습니다. 처음두 가지 속성은 모든 트랜잭션을 서로 구별 할 수 없음을 의미합니다. 거래에 직접 참여하지 않는 한 모든 입력과 출력은 임의의 데이터 조각처럼 보입니다 (말하자면 출력값과 입력값 모두 랜덤한 곡선 위의 점입니다). diff --git a/doc/intro.md b/doc/intro.md index e21a1755a..0d7f41621 100644 --- a/doc/intro.md +++ b/doc/intro.md @@ -424,8 +424,8 @@ Generalizing, we conclude that the chain state (excluding headers) at any point in time can be summarized by just these pieces of information: 1. The total amount of coins created by mining in the chain. -2. The complete set of unspent outputs. -3. The transactions kernels for each transaction. +1. The complete set of unspent outputs. +1. The transactions kernels for each transaction. The first piece of information can be deduced just using the block height (its distance from the genesis block). And both the unspent outputs and the diff --git a/doc/intro_DE.md b/doc/intro_DE.md index 30ebacabd..56b6f627f 100644 --- a/doc/intro_DE.md +++ b/doc/intro_DE.md @@ -1,6 +1,6 @@ # Einführung in Mimblewimble und Grin -*In anderen Sprachen lesen: [English](intro.md), [简体中文](intro_ZH-CN.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md)* +*In anderen Sprachen lesen: [English](intro.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md), [简体中文](intro_ZH-CN.md)* Mimblewimble ist ein Blockchain-Format und Protokoll, welches auf starke kryptographische Primitiven setzt und dadurch äußerst gute Skalierbarkeit, Privatsphäre und Fungibilität bietet. Es befasst sich mit Lücken, die in fast allen gegenwärtigen Blockchainimplementierungen existieren. @@ -275,8 +275,8 @@ Bezug nehmend auf den vorherigen Beispielblock, müssen die Outputs x1 und x2, a Verallgemeinernd können wir schlussfolgern, dass der Chainstate (ausgenommen Header) zu jedem Zeitpunkt durch lediglich die folgenden Informationsstücke zusammengefasst werden kann: 1. Die Gesamtanzahl an Coins, die durch Mining in der Chain erstellt wurden. -2. Das komplette Set nicht verwendeter Outputs. -3. Die Transaktionskernel für jede Transaktion. +1. Das komplette Set nicht verwendeter Outputs. +1. Die Transaktionskernel für jede Transaktion. Das erste Informationsstück kann nur mittels der Blockhöhe (seiner Distanz zum Genesisblock), abgeleitet werden. Beide nicht verwendeten Outputs und die Transaktionskernel sind höchst kompakt. Dies hat 2 wichtige Konsequenzen: diff --git a/doc/intro_ES.md b/doc/intro_ES.md index 8bc185dec..4b6fef5fc 100644 --- a/doc/intro_ES.md +++ b/doc/intro_ES.md @@ -1,6 +1,6 @@ # Introducción a Mimblewimble y Grin -*Lea esto en otros idiomas: [English](intro.md), [简体中文](intro_ZH-CN.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md).* +*Lea esto en otros idiomas: [English](intro.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md), [简体中文](intro_ZH-CN.md).* Mimblewimble es un formato y un protocolo de cadena de bloques que proporciona una escalabilidad, privacidad y funcionalidad extremadamente buenas al basarse en fuertes algoritmos criptográficos. Aborda los vacíos existentes en casi todas las @@ -374,8 +374,8 @@ Concluimos que, generalizando, el estado de la cadena (excluyendo las cabeceras) por estas piezas de información: 1. La cantidad total de monedas creadas por la minería en la cadena. -2. El conjunto completo de resultados no utilizados. -3. Los núcleos de transacciones para cada transacción. +1. El conjunto completo de resultados no utilizados. +1. Los núcleos de transacciones para cada transacción. La primera información se puede deducir simplemente usando la altura del bloque (su distancia del bloque génesis). Y tanto las salidas no utilizadas como los núcleos de transacción son extremadamente compactos. Esto tiene dos consecuencias diff --git a/doc/intro_JP.md b/doc/intro_JP.md index 47831e1a9..afec5705e 100644 --- a/doc/intro_JP.md +++ b/doc/intro_JP.md @@ -1,6 +1,6 @@ # Mimblewimble と Grin 概論 -*この文章を他の言語で読む: [English](intro.md), [简体中文](intro_ZH-CN.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md).* +*この文章を他の言語で読む: [English](intro.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md), [简体中文](intro_ZH-CN.md).* Mimblewimble は、極めてよいスケーラビリティ、プライバシー、そして代替可能性(fungibility)の解決法を提供 するブロックチェーンのフォーマット・プロトコルである。Mimblewimble は、ほとんどすべてのブロックチェーンの @@ -372,8 +372,8 @@ inputs はそれらが使用する outputs への参照である。以前のブ 一般化すると、任意の時点において(ヘッダーを除いて)チェーンの状態は以下の情報によって要約される: 1. マイニングによって作られたコインの総額 -2. utxo の完全な集合 -3. それぞれのトランザクションに対する transaction kernel +1. utxo の完全な集合 +1. それぞれのトランザクションに対する transaction kernel はじめの情報はブロック高(ジェネシスブロックからの距離)から推定することができる。 そして、utxo と transaction kernel は共に極めてコンパクトだ。これは2つの重要な結果を持っている: diff --git a/doc/intro_KR.md b/doc/intro_KR.md index 298ebfa86..afe6b3ca5 100644 --- a/doc/intro_KR.md +++ b/doc/intro_KR.md @@ -1,6 +1,6 @@ # Mimblewimble 과 Grin 에 대한 소개 -*다른 언어로 Intro를 읽으시려면: [English](intro.md), [简体中文](intro.zh-cn.md), [Español](intro_ES.md), [Русский](intro.ru.md), [日本語](intro.jp.md).* +*다른 언어로 되어있는 문서를 읽으려면: [English](intro.md), [Español](intro_ES.md), [Русский](intro.ru.md), [日本語](intro.jp.md), [简体中文](intro.zh-cn.md).* MimbleWimlbe은 블록체인 포맷이면서 프로토콜 입니다. Mimblewimble은 암호학적 기반에 의해서 극대화된 좋은 확장성, 프라이버시, 그리고 대체가능성을 제공합니다. 이러한 특성은 지금 현존하는 모든 블록체인 구현체에 존재하는 문제점들을 처리합니다. @@ -302,8 +302,8 @@ Signature 공개키로서 트랜잭션의 합이 0임을 증명하는 _kernel ex 1. 체인안에서 채굴에 의해서 만들어진 코인의 총량 -2. 쓰지 않은 출력값의 모든 세트 -3. 각 트랜잭션의 트랜잭션 kernel +1. 쓰지 않은 출력값의 모든 세트 +1. 각 트랜잭션의 트랜잭션 kernel 첫번째 정보는 Genesis 블록으로부터의 거리인 블록 높이를 가지고 유추 될 수 있습니다. 그리고 쓰지 않는 출력값과 트랜잭션 kernel은 매우 작습니다. 이것에는 아래와 같이 2가지 중요한 결과를 가지고 있습니다. diff --git a/doc/intro_NL.md b/doc/intro_NL.md index 3f461df46..9978b2dce 100644 --- a/doc/intro_NL.md +++ b/doc/intro_NL.md @@ -1,6 +1,6 @@ # Inleiding tot Mimblewimble en Grin -*Lees dit in andere talen: [English](intro.md), [简体中文](intro_ZH-CN.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md).* +*Lees dit in andere talen: [English](intro.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md), [简体中文](intro_ZH-CN.md).* Mimblewimble is een blockchain formaat en protocol die extreem goede schaalbaarheid, privacy en fungibiliteit biedt door zich te berusten op sterke cryptografische primiteven. Het adresseert de lacunes die in bijna alle huidige blockchain-implementaties bestaan. @@ -390,8 +390,8 @@ Veralgemeend, concluderen we dat de ketenstatus (met uitzondering van headers) o samengevat kunnen worden door alleen deze stukjes informatie: 1. Het totale aantal munten gecreëerd door mining in de keten. -2. De volledige verzameling aan niet-bestede uitgaven. -3. De transactiekernels voor elke transactie. +1. De volledige verzameling aan niet-bestede uitgaven. +1. De transactiekernels voor elke transactie. Het eerste stuk informatie kan afgeleid worden door alleen de blokhoogte (de afstand tot het genesisblok) te gebruiken. En zowel de niet-bestede uitgaven als de diff --git a/doc/intro_PT-BR.md b/doc/intro_PT-BR.md index 3cf0cbc5a..392a17812 100644 --- a/doc/intro_PT-BR.md +++ b/doc/intro_PT-BR.md @@ -1,6 +1,6 @@ # Introdução ao Mimblewimble e ao Grin -*Leia isto em outros idiomas: [English](intro.md), [简体中文](intro_ZH-CN.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md).* +*Leia isto em outros idiomas: [English](intro.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md), [简体中文](intro_ZH-CN.md).* O Mimblewimble é um formato e protocolo blockchain que fornece ótima escalabilidade, privacidade e fungibilidade, para isso contando com primitivas criptográficas fortes. Ele aborda as lacunas existentes em quase todos as implementações blockchain atuais. @@ -275,8 +275,8 @@ Voltando ao bloco do exemplo anterior, as saídas x1 e x2, gastas por I1 e I2, d Generalizando, concluímos que o estado da cadeia (excluindo cabeçalhos) a qualquer momento pode ser resumido simplesmente pelas seguintes informações: 1. A quantidade total de moedas criadas pela mineração na cadeia. -2. O conjunto completo de saídas não gastas. -3. Os núcleos de transações para cada transação. +1. O conjunto completo de saídas não gastas. +1. Os núcleos de transações para cada transação. A primeira informação pode ser deduzida usando apenas a altura do bloco (sua distância do bloco de gênese). E tanto as saídas não gastas quanto os núcleos de transação são extremamente compactos. Isso tem 2 consequências importantes: diff --git a/doc/intro_RU.md b/doc/intro_RU.md index fab45aab0..1efb81854 100644 --- a/doc/intro_RU.md +++ b/doc/intro_RU.md @@ -1,6 +1,6 @@ # Введение в МимблВимбл и Grin -*На других языках: [English](intro.md), [简体中文](intro_ZH-CN.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md).* +*На других языках: [English](intro.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md), [简体中文](intro_ZH-CN.md).* МимблВимбл это формат и протокол блокчейна, предоставляющий исключительную масштабируемость, приватность и обезличенность криптовалюты, @@ -407,8 +407,8 @@ range proof-ов можно найти в [публикации о range proof- сведено к следующей информации: 1. Общее количество монет, созданное майнингом цепочки. -2. Полный набор непотраченых выходов транзакций. -3. Ядра каждой из транзакций. +1. Полный набор непотраченых выходов транзакций. +1. Ядра каждой из транзакций. Информацию для первого пункта мы можем получить просто из высоты (расстояние от генезиса) блока. А, в свою очередь, непотраченые выходы и ядра транзакций довольно компактны. diff --git a/doc/intro_SE.md b/doc/intro_SE.md index db91fc14f..72bd0c8a4 100644 --- a/doc/intro_SE.md +++ b/doc/intro_SE.md @@ -1,6 +1,6 @@ # Introduktion till Mimblewimble och Grin -*Läs detta på andra språk: [English](intro.md), [简体中文](intro_ZH-CN.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md).* +*Läs detta på andra språk: [English](intro.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md), [简体中文](intro_ZH-CN.md).* Mimblewimble är ett blockkedjeformat och protokoll som erbjuder extremt bra skalbarhet, integritet, och fungibilitet genom starka kryptografiska primitiver. @@ -369,8 +369,8 @@ I1 och I2 alla tas bort från blockkedjan eftersom de nu är mellanliggande tran Vi slutleder att kedjetillståndet kan (bortsett från block headers) vid varje tidspunkt sammanfattas med endast dessa tre ting: 1. Den totala mängden mynt skapade genom mining. -2. Den kompletta mängden av UTXOs. -3. Transaktionskärnorna för varje transaktion. +1. Den kompletta mängden av UTXOs. +1. Transaktionskärnorna för varje transaktion. Det första kan härledas genom att endast observera blockhöjden. diff --git a/doc/intro_ZH-CN.md b/doc/intro_ZH-CN.md index e74f1a5b1..45b2171f5 100644 --- a/doc/intro_ZH-CN.md +++ b/doc/intro_ZH-CN.md @@ -1,7 +1,7 @@ Mimblewimble 和 Grin 简介 ===================================== -*阅读其它语言版本: [English](intro.md), [简体中文](intro_ZH-CN.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md).* +*阅读其它语言版本: [English](intro.md), [Español](intro_ES.md), [Nederlands](intro_NL.md), [Русский](intro_RU.md), [日本語](intro_JP.md), [Deutsch](intro_DE.md), [Portuguese](intro_PT-BR.md), [Korean](intro_KR.md).* Mimblewimble是一个区块链格式和协议,依托于健壮的加密原语,提供非常好的可扩展性、隐私和可替代性。它解决了当前几乎所有实现的区块链(与现实需求之间)差距。Mimblewimble 的白皮书在[本项目的WiKi](https://github.com/mimblewimble/docs/wiki/A-Brief-History-of-MinbleWimble-White-Paper)中可以找到,WiKi是开放的。 @@ -291,9 +291,9 @@ Mimblewimble区块格式通过引入一个附加概念来构建:核销(_cut- 总而言之,我们得出结论:任何时间点的链状态(不包括区块头)都可以通过这些信息来概括: -1. 链中采矿产生的硬币总量。 -2. 未使用的交易输出(即UTXO)的完整集合。 -3. 每笔交易的交易内核。 +1. 链中采矿产生的代币总量。 +1. 未使用的交易输出(即UTXO)的完整集合。 +1. 每笔交易的交易内核。 第一条信息可以使用块高度(与起始块的距离)推导出来。未使用的输出和交易内核都非常紧凑。这有两个重要的后果: diff --git a/doc/merkle.md b/doc/merkle.md index a65f89acb..24e0e3e1a 100644 --- a/doc/merkle.md +++ b/doc/merkle.md @@ -1,6 +1,6 @@ # Merkle Structures -*Read this in other languages:[Korean](merkle_KR.md)* +*Read this in other languages: [Korean](merkle_KR.md), [简体中文](merkle_ZH-CN.md).* Mimblewimble is designed for users to verify the state of the system given only pruned data. To achieve this goal, all transaction data is committed @@ -34,12 +34,12 @@ The root sum should be equal to the sum of all excesses since the genesis. Design requirements: 1. Efficient additions and updating from unspent to spent. -2. Efficient proofs that a specific output was spent. -3. Efficient storage of diffs between UTXO roots. -4. Efficient tree storage even with missing data, even with millions of entries. -5. If a node commits to NULL, it has no unspent children and its data should +1. Efficient proofs that a specific output was spent. +1. Efficient storage of diffs between UTXO roots. +1. Efficient tree storage even with missing data, even with millions of entries. +1. If a node commits to NULL, it has no unspent children and its data should eventually be able to be dropped forever. -6. Support for serialization and efficient merging of pruned trees from partial archival nodes. +1. Support for serialization and efficient merging of pruned trees from partial archival nodes. ### Output witnesses diff --git a/doc/merkle_ZH-CN.md b/doc/merkle_ZH-CN.md new file mode 100644 index 000000000..697130ae6 --- /dev/null +++ b/doc/merkle_ZH-CN.md @@ -0,0 +1,128 @@ +# Merkle Structures + +*阅读其它语言版本: [English](merkle.md), [Korean](merkle_KR.md).* + +Mimblewimble 是设计给用户在仅给出修剪后的数据的情况下也能验证系统状态。 +为了实现此目标,所有交易数据都通过 Merkle trees 提交给了区块链,该 Merkle trees 即使在被修剪后也需要在更新和序列化操作上有良好的效率。 + +同样,几乎所有交易数据(输入(inputs),输出(outputs),超额(excesses) 和 超额证明(excess proofs))都可以某种方式进行求和,因此将 Merkle sum trees 作为默认选项并在这里处理总和是完全合理的。 + +Grin 的设计目标是使所有结构都易于实现尽可能的简单。Mimblewimble 引入了许多新的加密技术,应该会使其更易于理解。 +它的验证规则很容易指定(没有脚本),并且 Grin 是用一种具有非常明确的语义的语言编写的,因此简单性也有助于达成易于理解的共识规则。 + +## Merkle Trees + +每个块有四棵 Merkle trees: + +### 总输出集(Total Output Set) + +每个对象都是以下两项之一:用一个承诺来表示未花费的输出(unspent output)或用一个 NULL 标记表示一个已经被花费(spent)的。 +它是所有未花费输出的总和树(已花费输出对总和没有任何贡献)。输出集应反映出在当前块*生效后*链的状态。 + +自创世起,根总和应等于所有超额的总和。 + +设计要求: + +1. 高效地添加和更新从未花费的到已花费的。 +1. 高效地证明一个特定的输出被花费了。 +1. 高效的 UTXO roots 之间的差异存储。 +1. 高效的树存储即使丢失数据、有数百万个条目。 +1. 如果节点提交为 NULL,表示它没有未花费的子节点,并且最终其数据应该是可以被清除的。 +1. 支持序列化并且能够高效的合并来自部分存档的节点中的被修剪过的树。 + +### 输出见证(Output witnesses) + +该树反映了总输出集,但具有范围证明来代替承诺。它从不更新,仅做附加,并且不对任何内容求和。 +当一个输出被花费时,从树上修剪它的范围证明就足够了而不用删除它。 + +设计要求: + +1. 支持序列化并且能够高效的合并来自部分存档的节点中的被修剪过的树。 + +### 输入和输出(Inputs and Outputs) + +每个对象都是这两件事之一:输入(对旧交易(transaction)输出的明确引用)或输出(一对(承诺,范围证明))。 +它是一颗输出承诺的总和树,也就是输入承诺的对立面。 + +输入引用是旧承诺的哈希值。这是一个共识规则,所有未花费的输出必须是唯一的。 + +根总和应等于此块的超额总和。请参阅下一节。 + +通常,验证者要么会看到此 Merkle trees 的 100% 要么 0%,因此它与任何设计都兼容。 + +设计要求: + +1. 有效的包含证明,用于发布证明。(Efficient inclusion proofs, for proof-of-publication.) + +### 超额(Excesses) + +每个对象的形式为(超额,签名)。它是一颗关于超额的总和树。 + +通常,验证者总是会看到该树的 100%,因此甚至完全没有必要使用 Merkle 结构。 +但是,为了将来支持部分存档的节点,我们希望支持高效地修剪。 + +设计要求: + +1. 支持序列化并且能够高效的合并来自部分存档的节点中的被修剪过的树。 + +## 提议的 Merkle 结构 + +**针对所有树提出了以下设计:对于一个 sum-MMR,其中每个节点应该将其子节点的数量以及数据求和然后相加。** +**结果是,每个节点都会提交其所有子节点的计数。** + +[MMRs,或 Merkle Mountain Ranges](https://github.com/opentimestamps/opentimestamps-server/blob/master/doc/merkle-mountain-range.md) + +输出集的六个设计标准是: + +### 高效地插入/更新 + +立即(包含证明)。对于任何平衡 Merkle tree 的设计都是如此。 + +### 高效的花费证明 + +Grin 本身不需要花费证明,但支持是一件好事以便将来应用于 SPV 客户端。 + +子计数(children-counts)表示树中每个对象的索引,该索引不会变动,因为插入仅发生在树的最右侧。 + +这同时也允许永久的花费证明,即使稍后将相同的输出添加到树中,对于相同的输出也可以防止错误的证明。 +对于非插入顺序的树,这些属性很难实现。 + +### 高效的差异存储 + +对于这个来说,存储完整的块应该足够了。 +显然,更新和撤消操作一样容易,并且由于总是按顺序处理块,因此在重组期间回滚它们就像从树的右侧删除一组连续的输出一样简单。 +(这比通过重复删除来支持删除操作的树中要快得多。) + +### 高效的树存储即使丢失数据 + +要在随机输出被花费时候更新根哈希,我们不需要存储或计算整个树。取而代之的是,我们只能存储深度为 20 的哈希,其中最多不超过一百万。 +然后,每个更新仅需要重新计算高于该深度的哈希(根据比特币的历史记录可知它现在的输出数量少于 2^29 个,这意味着只需要为每个更新计算大小为 2^9 = 512 的树),在完成所有更新后,根哈希可以被重新计算出来。 + +这个深度是可配置的,并且可以随着输出集的增长或可用磁盘空间而改变。 + +这对任何 Merkle tree 都是可行的,但可能会因 PATRICIA tree 或其他前缀树而变得复杂,具体取决于如何计算深度。 + +### 丢弃已花费的代币(Dropping spent coins) + +由于代币永远不会从已花费变为未花费,因此对于已花费的代币上的数据不再需要进行任何更新或查找。 + +### 高效地序列化已被修剪的树 + +由于每个节点都有其子节点数,因此验证人无需所有哈希就可以确定树的结构,并且可以确定哪些节点是兄弟节点,依此类推。 + +在输出集中,每个节点还提交其未花费子项的总和,因此验证人通过检查已被修剪节点上的总和是否为零来知道它是否缺少未花费代币的数据。 + +## 算法 + +(To appear alongside an implementation.) + +## 存储 + +求和树数据结构允许高效地存储输出集和输出见证,同时允许立即检索根哈希或根和(适用时)。 +但是,该树必须包含系统中的每个输出承诺和见证哈希。 +这些数据太大,无法永久存储在内存中,即使我们考虑修剪,因为开销太大也无法在每次重新启动时从头开始进行重建(目前,比特币有超过 5000 万个 UTXO,它们需要至少 3.2 GB,假设每个 UTXO 都有几个哈希)。 +因此,我们需要一种高效的方法来将这些数据结构存储在磁盘上。 + +哈希树的另一个限制是,给定一个键(即输出承诺),不可能在与该键关联的树中找到叶子。我们不能以任何有意义的方式从树根上走下来。 +因此,需要在整个键空间上附加索引。由于 MMR 是 append-only 的二叉树,因此我们可以通过其插入位置在树中找到该键。 +因此,还需要插入到树中的键的完整索引(即输出承诺)。 diff --git a/doc/mmr.md b/doc/mmr.md index 48ea212c6..6f4cb763f 100644 --- a/doc/mmr.md +++ b/doc/mmr.md @@ -1,6 +1,6 @@ # Merkle Mountain Ranges -*Read this in other languages: [English](mmr.md), [简体中文](mmr_ZH-CN.md), [Korean](mmr_KR.md)* +*Read this in other languages: [Korean](mmr_KR.md), [简体中文](mmr_ZH-CN.md).* ## Structure @@ -128,8 +128,8 @@ Pruning a MMR relies on a simple iterative process. `X` is first initialized as the leaf we wish to prune. 1. Prune `X`. -2. If `X` has a sibling, stop here. -3. If 'X' has no sibling, assign the parent of `X` as `X`. +1. If `X` has a sibling, stop here. +1. If 'X' has no sibling, assign the parent of `X` as `X`. To visualize the result, starting from our first MMR example and removing leaves [0, 3, 4, 8, 16] leads to the following pruned MMR: diff --git a/doc/mmr_KR.md b/doc/mmr_KR.md index 0194a1e77..9b97816da 100644 --- a/doc/mmr_KR.md +++ b/doc/mmr_KR.md @@ -1,5 +1,7 @@ # Merkle Mountain Ranges +*다른 언어로 되어있는 문서를 읽으려면: [English](mmr.md), [简体中文](mmr_ZH-CN.md).* + ## MMR의 구조 Merkle Mountain Ranges [1]은 Merkle trees [2]의 대안입니다. 후자는 완벽하게 균형 잡힌 이진 트리를 사용하지만 전자는 완벽하게 균형잡힌 binary tree list 거나 오른쪽 상단에서 잘린 single binary tree로 볼 수 있습니다. Merkle Mountain Range (MMR)는 엄격하게 append 에서만 사용됩니다. 원소는 왼쪽에서 오른쪽으로 추가되고, 두 하위 원소가 있는 즉시 부모를 추가하여 그에 따라 범위를 채웁니다. @@ -91,8 +93,8 @@ Grin에서는 해시되고 MMR에 저장되는 많은 데이터가 결국 제거 MMR의 pruning은 간단한 반복 프로세스에 의존합니다. `X`는 우선 첫번째 제거할 리프로 초기화됩니다. 1. `X`를 Pruning 한다. -2. 만약 `x`가 형제 노드가 있다면 여기서 prunging을 중단한다. -3. 만약 `X`가 형제 노드가 없다면 `X`의 부모 노드는 `X`라고 배정된다. +1. 만약 `x`가 형제 노드가 있다면 여기서 prunging을 중단한다. +1. 만약 `X`가 형제 노드가 없다면 `X`의 부모 노드는 `X`라고 배정된다. 결과를 시각화하기 위해 첫 번째 MMR 예시에서 시작하여 리프[0, 3, 4, 8, 16]을 제거하면 다음과 같은 pruning MMR이 발생합니다. diff --git a/doc/mmr_ZH-CN.md b/doc/mmr_ZH-CN.md index 9cea1b708..161b0174a 100644 --- a/doc/mmr_ZH-CN.md +++ b/doc/mmr_ZH-CN.md @@ -1,15 +1,15 @@ # Merkle Mountain Ranges -*Read this in other languages: [English](mmr.md), [简体中文](mmr_ZH-CN.md), [Korean](mmr_KR.md)* +*阅读其它语言版本: [English](mmr.md), [Korean](mmr_KR.md).* ## 结构 Merkle Mountain Ranges [1] 是 Merkle trees [2] 的替代品。 -后者依赖于完美二叉树,前者既可以看作是由许多完美二叉树组成的列表或是看作是一个右上角被截断的二叉树。 +后者依赖于完美二叉树,前者既可以看作是由许多完美二叉树组成的一个列表或着看作是从一个右上角被截断的二叉树。 Merkle Mountain Ranges(MMR)是 append-only 的: -元素自左向右添加,如果有 2 个孩子节点,则立即添加一个父节点,并将相应的 range 填满。 +元素自左向右添加,如果有 2 个孩子节点,则立即添加一个父节点,并将相应的 range 填满/补完整。 -这里展示了一个 range,其中有 11 个叶子,总大小为 19(个节点),其中每个节点都按照插入顺序编号被标注。 +下面展示了一个 range,有 11 个叶子,总大小为 19(个节点),其中每个节点都按照插入顺序编号被标记。 ``` 高度 @@ -26,7 +26,7 @@ Merkle Mountain Ranges(MMR)是 append-only 的: 0 0 1 3 4 7 8 10 11 15 16 18 ``` -这个 range 可以以平面列表的方式展现出来,此处存储了每个节点在其插入位置的高度: +下面是这个 range 以平面列表的方式展示出来的样子,存储了每个节点在其插入位置对应的高度: ``` 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @@ -40,7 +40,7 @@ Merkle Mountain Ranges(MMR)是 append-only 的: ## Hashing 与 Bagging 就像 Merkle trees 一样,MMR 中的父节点的值由其两个孩子节点 hash 得到。 -Grin 自始至终使用 Blake2b 哈希函数,在进行 hashing 之前会预先设置节点在 MMR 中的位置以此来避免冲突。 +Grin 总是使用 Blake2b 哈希函数,在进行 hashing 之前会预先设置节点在 MMR 中的位置以此来避免冲突。 所以对于索引 `n` 处的叶子 `l` 存储的数据 `D`(在输出的情况下,数据是其 Pedersen 承诺,例如),我们有: ``` @@ -69,9 +69,9 @@ Node(p) = Blake2b(m | Node(left_child(p)) | Node(right_child(p))) 0 1 10 100 101 1000 1001 1011 ``` -这个 MMR 有 11 个节点,它所有的峰分别位于索引 111(7),1010(10)和 1011(11)处。 +这个 MMR 一共有 11 个节点,它所有的峰分别位于索引 111(7),1010(10)和 1011(11)处。 我们首先会注意到最左边的第一个峰以二进制表示时,总是最高的并且其所有位 “都是 1”。 -因此该最高峰的位置总是遵循 `2^n - 1` 的规律且处于这个位置的峰一定是 MMR 内部最大的峰(其位置索引值小于 MMR 的大小即节点个数)。 +因此该最高峰的索引总是遵循 `2^n - 1` 的规律且处于这个位置的峰一定是 MMR 内部最大的峰(其索引值小于 MMR 的大小即节点个数)。 我们针对大小为 11 的 MMR 进行迭代处理: ``` @@ -101,17 +101,17 @@ P = Blake2b(N | Blake2b(N | Node(p3) | Node(p2)) | Node(p1)) ## 修剪 -在 Grin 中,有很多经过哈希并存储在 MMR 中的数据最终是可以被删除的。 -发生这种情况时,那些相应的叶子节点的哈希的存在变得不必要并且这些哈希可以被删除。 -当删除掉足够多的叶子后,它们的父节点的存在也变得不必要,因此,我们可以通过删除它的叶子来修剪 MMR 的一大部分。 +在 Grin 中,有很多经过哈希并存储在 MMR 中的数据最后是可以被删除掉的。 +发生这种情况时,相应的叶子节点的哈希也就变得不必要了,它们也是可以被删除掉的。 +当删除掉足够多的叶子后,它们的父节点也会变得不必要,因此,我们可以通过删除它的叶子来修剪掉 MMR 的一大部分。 修剪 MMR 依赖于一个简单的迭代过程。首先将 `X` 初始化为我们希望修剪的那个叶子。 1. 修剪 `X`。 -2. 如果 `X` 有兄弟姐妹,则在此处停止。 -3. 如果 `X` 没有兄弟姐妹,则将 `X` 的父亲节点指定为 `X`。 +2. 如果 `X` 有兄弟节点,则在此处停止。 +3. 如果 `X` 没有兄弟节点,则将 `X` 的父节点指定为 `X`。 -为了可视化结果,从我们的第一个 MMR 示例开始,然后删除叶子 [0、3、4、8、16] 得到以下修剪过后的 MMR: +为了可视化结果,从我们的第一个 MMR 示例开始,删除叶子 [0、3、4、8、16] 后得到以下修剪过的 MMR: ``` 高度 diff --git a/doc/pruning.md b/doc/pruning.md index 7f609cad7..9f1319684 100644 --- a/doc/pruning.md +++ b/doc/pruning.md @@ -1,6 +1,6 @@ # Pruning Blockchain Data -*Read this in other languages: [Korean](pruning_KR.md).* +*Read this in other languages: [Korean](pruning_KR.md), [简体中文](pruning_ZH-CN.md).* One of the principal attractions of Mimblewimble is its theoretical space efficiency. Indeed, a trusted or pre-validated full blockchain state only @@ -11,12 +11,12 @@ understanding of the Mimblewimble protocol): 1. Transaction outputs, which include for each output: 1. A Pedersen commitment (33 bytes). - 2. A range proof (over 5KB at this time). -2. Transaction inputs, which are just output references (32 bytes). -3. Transaction "proofs", which include for each transaction: + 1. A range proof (over 5KB at this time). +1. Transaction inputs, which are just output references (32 bytes). +1. Transaction "proofs", which include for each transaction: 1. The excess commitment sum for the transaction (33 bytes). - 2. A signature generated with the excess (71 bytes average). -4. A block header includes Merkle trees and proof of work (about 250 bytes). + 1. A signature generated with the excess (71 bytes average). +1. A block header includes Merkle trees and proof of work (about 250 bytes). Assuming a blockchain of a million blocks, 10 million transactions (2 inputs, 2.5 outputs average) and 100,000 unspent outputs, we get the following approximate diff --git a/doc/pruning_ZH-CN.md b/doc/pruning_ZH-CN.md new file mode 100644 index 000000000..79715d792 --- /dev/null +++ b/doc/pruning_ZH-CN.md @@ -0,0 +1,61 @@ +# 修剪区块链数据 + +*阅读其它语言版本: [English](pruning.md), [Korean](pruning_KR.md).* + +Mimblewimble 的主要吸引力之一是其理论空间效率。确实,一个受信任或预先验证的完整区块链状态仅需要未花费的交易输出,它可以非常小。 + +grin 的区块链包括以下类型的数据(我们假设对 Mimblewimble 协议有事先了解): + +1. 交易输出,其中每个输出包括: + 1. 一个 Pedersen 承诺(33 个字节)。 + 1. 范围证明(目前超过 5KB)。 +1. 交易输入,仅作为输出的引用(32 字节)。 +1. 交易“证明”,每笔交易包括: + 1. 交易的超额承诺总和(33 个字节)。 + 1. 超额签名生成(平均 71 字节)。 +1. 一个块头包括 Merkle trees 和工作量证明(约 250 个字节)。 + +假设有一个有一百万个区块区块链,一千万笔交易(平均 2 个输入,2.5 个输出)和 100,000 个未花费的输出,我们得到以下近似大小以的一条完整的链(无修剪(no pruning),无核销(no cut-through)): + +* 128GB的 交易数据(输入和输出)。 +* 1 GB 的交易证明数据。 +* 250MB 的块头。 +* 总链大小约为 130GB。 +* 核销后的总链大小为 1.8GB(但包含块头)。 +* UTXO 大小为 520MB。 +* 总链大小,不包含 4GB 的范围证明。 +* UTXO 大小,不包含 3.3MB 的范围证明。 + +我们注意到,在所有数据中,一旦对链进行了充分验证,对于节点正常运行,仅严格要求一组 UTXO 承诺即可。 + +在某些情况下可以修剪数据: + +* 完全验证的节点可能会删除一些已经验证过的数据以释放空间。 +* 部分验证的节点(类似于 SPV)可能并不会对接收或保留所有数据感兴趣。 +* 当一个新节点加入网络时,即使最终是要成为一个完全验证的节点,它也可能暂时充当部分验证的节点,使其可以更快地使用。 + +## 验证完全修剪后的状态 + +修剪需要删除尽可能多的数据,但同时保留完整的 Mimblewimble-style 验证的所有保证。 +为了保持正在修剪的节点状态的正常运行,这是必需的,而且在第一次快速同步时(仅将最小量的数据发送到新节点)。 + +完整验证链状态要求: + +* 所有内核签名均根据其公共密钥进行验证。 +* 所有 UTXO 承诺的总和,减去供给即为有效的公共密钥(可用于对空字符串进行签名)。 +* 所有内核发布密钥的总和等于所有 UTXO 承诺的总和减去供应。 +* UTXO PMMR 的根哈希,范围证明的 PMMR 和内核的 MMR 将块头与有效的工作量证明链相匹配。 +* 所有范围证明均有效。 + +另外,尽管不必验证整个链状态,但为了能够接受和验证新块,还需要其他数据: + +*输出功能,使所有 UTXO 都需要完整的输出数据。 + +至少,需要以下数据: + +* 块头链。 +* 所有内核,按包含在链中的顺序。这也允许重建内核 MMR。 +* 所有未花费的输出。 +* UTXO MMR 和 范围证明 MMR(以了解修剪后的数据的哈希值)。 + +请注意,可以通过仅验证一个由验证节点随机选择的范围证明的子集来进行进一步修剪。 diff --git a/doc/release_instruction.md b/doc/release_instruction.md index c8eb13620..c7198be9f 100644 --- a/doc/release_instruction.md +++ b/doc/release_instruction.md @@ -9,8 +9,8 @@ In Grin, we're using [Semantic Versioning 2.0.0](https://semver.org). For a shor A version number include MAJOR.MINOR.PATCH, and increment the: 1. MAJOR version when you make incompatible API changes, -2. MINOR version when you add functionality in a backwards-compatible manner, and -3. PATCH version when you make backwards-compatible bug fixes. +1. MINOR version when you add functionality in a backwards-compatible manner, and +1. PATCH version when you make backwards-compatible bug fixes. And **additional labels for pre-release** and **build metadata** are available as extensions to the MAJOR.MINOR.PATCH format. diff --git a/doc/state.md b/doc/state.md index 466e347db..9ccabfc27 100644 --- a/doc/state.md +++ b/doc/state.md @@ -1,6 +1,6 @@ # State and Storage -*Read this in other languages: [Korean](state_KR.md), [日本語](state_JP.md).* +*Read this in other languages: [Korean](state_KR.md), [日本語](state_JP.md), [简体中文](state_ZH-CN.md).* ## The Grin State diff --git a/doc/state_JP.md b/doc/state_JP.md index 0dbd7c0a6..1d3846768 100644 --- a/doc/state_JP.md +++ b/doc/state_JP.md @@ -1,6 +1,6 @@ # 状態とストレージ -*別の言語で読む: [Korean](state_KR.md), [日本語](state_JP.md).* +*別の言語で読む: [English](state.md), [Korean](state_KR.md), [简体中文](state_ZH-CN.md).* ## Grinの状態 diff --git a/doc/state_KR.md b/doc/state_KR.md index 737cd5b63..459816d94 100644 --- a/doc/state_KR.md +++ b/doc/state_KR.md @@ -1,5 +1,7 @@ # 상태와 스토리지 +*다른 언어로 되어있는 문서를 읽으려면: [English](state.md), [日本語](state_JP.md), [简体中文](state_ZH-CN.md).* + ## Grin의 상태 ### 구조 @@ -19,9 +21,9 @@ Grin chain의 모든 상태는 다음 데이터와 같이 이루어져 있습니 완전한 Grin의 상태를 사용해서 우리는 다음과 같은 것들을 인증 할 수 있습니다. 1. Kernel 의 signature 가 Kernel의 실행에 대해 유효하다면 (공개키), 이것은 Kernel이 유효하다는것을 증명합니다. -2. 모든 커밋 실행의 합이 모든 UTXO 실행의 합에서 총 공급량을 뺸 값이 같다면 이것은 Kernal과 출력값의 실행들이 유효하고 코인이 새로이 만들어지지 않았다는 것을 증명합니다. -3. 모든 UTXO, range prook 와 Kernel 해쉬들은 각각의 MMR이 있고 그 MMR 들은 유효한 root 를 해쉬합니다. -4. 특정 시점에 가장 많이 일했다고 알려진 Block header 에는 3개의 MMR에 대한 root 가 포함됩니다. 이것은 전체 상태가 가장 많이 일한 chain (가장 긴 체인)에서 MMR과 증명들이 만들어졌다는 것을 입증합니다. +1. 모든 커밋 실행의 합이 모든 UTXO 실행의 합에서 총 공급량을 뺸 값이 같다면 이것은 Kernal과 출력값의 실행들이 유효하고 코인이 새로이 만들어지지 않았다는 것을 증명합니다. +1. 모든 UTXO, range prook 와 Kernel 해쉬들은 각각의 MMR이 있고 그 MMR 들은 유효한 root 를 해쉬합니다. +1. 특정 시점에 가장 많이 일했다고 알려진 Block header 에는 3개의 MMR에 대한 root 가 포함됩니다. 이것은 전체 상태가 가장 많이 일한 chain (가장 긴 체인)에서 MMR과 증명들이 만들어졌다는 것을 입증합니다. ### MMR 과 Pruning diff --git a/doc/state_ZH-CN.md b/doc/state_ZH-CN.md new file mode 100644 index 000000000..54f3e9765 --- /dev/null +++ b/doc/state_ZH-CN.md @@ -0,0 +1,45 @@ +# 状态和存储 + +*阅读其它语言版本: [English](state.md), [Korean](state_KR.md), [日本語](state_JP.md).* + +## Grin 的状态 + +### 结构 + +一条 Grin 链的完整状态包含以下所有数据: + +1. 完整的未花费输出(UTXO)集。 +1. 每个输出的范围证明。 +1. 所有交易内核。 +1. 针对上述每一项的 MMR(除了输出 MMR 以外包括其它所有输出的哈希,不仅仅是未花费的哈希)。 + +此外,链中的所有头都必须使用有效的工作证明来锚定上述状态(该状态对应于工作量最大的链)。 +我们注意到,一旦验证了每个范围证明并计算了所有内核承诺的总和,就不再严格要求范围证明和内核对节点起作用。 + +### 验证方式 + +对于一个完整状态的 Grin,我们可以验证以下内容: + +1. 内核签名针对其承诺(公钥)有效。 这证明内核是有效的。 +1. 所有内核承诺的总和等于所有 UTXO 承诺的总和减去总供应量。这证明内核和输出承诺均有效,并且没有创建任何预期之外的代币。 +1. 所有 UTXO,范围证明和内核哈希都存在于它们各自的 MMR 中,并且那些 MMR 哈希到有效根。 +1. 在给定的时间点上一个已知的工作量最多的块头包括 3 个 MMR 的根。这验证了 MMR,并证明整个状态是由工作量最多的链产生的。 + +### MMR 与修剪 + +用于为每个 MMR 中的叶节点生成的哈希数据(除其位置以外,还包括以下内容: + +* 输出 MMR 哈希的特征字段和自创世以来所有输出的承诺。 +* 范围证明 MMR,对整个范围证明数据进行哈希处理。 +* 内核 MMR 哈希了内核的所有字段:功能(feature),费用(fee),锁高度(lock height),超额承诺(excess commitment)和超额签名(excess signature)。 + +请注意,所有输出,范围证明和内核均以它们在每个块中出现的顺序添加到其各自的 MMR 中(还有一点需要注意,需要对块数据进行排序)。 + +随着输出被花费掉,其承诺和范围证明数据都可以被删除掉。此外,相应的输出和范围验证 MMR 可以被修剪。 + +## 状态存储 + +Grin 中的输出,范围证明和内核的数据存储很简单:一个 append-only 的文件,通过内存映射来访问数据。 +随着输出被花费,删除日志将维护可以删除的职位。这些位置与 MMR 节点位置完全匹配,因为它们均以相同顺序插入。 +当删除日志变大时,可以偶尔通过重写相应文件来压缩这些文件,而无需删除它们(同样也是 append-only),并且可以清空删除日志。 +对于 MMR,我们需要增加一些复杂性。 diff --git a/doc/stratum_KR.md b/doc/stratum_KR.md index d91589e05..ba7e3a236 100644 --- a/doc/stratum_KR.md +++ b/doc/stratum_KR.md @@ -6,14 +6,14 @@ 1. [Messages](#메세지_들) 1. [getjobtemplate](#getjobtemplate) - 2. [job](#job) - 3. [keepalive](#keepalive) - 4. [login](#login) - 5. [status](#status) - 6. [submit](#submit) -2. [에러 메시지들](#error-messages) -3. [채굴자의 행동양식](#miner-behavior) -4. [참고 구현체](#reference-implementation) + 1. [job](#job) + 1. [keepalive](#keepalive) + 1. [login](#login) + 1. [status](#status) + 1. [submit](#submit) +1. [에러 메시지들](#error-messages) +1. [채굴자의 행동양식](#miner-behavior) +1. [참고 구현체](#reference-implementation) ## 메세지 들