Derek解读Bytom源码-protobuf生成比原核心代码

简介:

作者:Derek

简介

Github地址:https://github.com/Bytom/bytom

Gitee地址:https://gitee.com/BytomBlockchain/bytom

本章介绍bytom代码Api-Server接口服务

作者使用MacOS操作系统,其他平台也大同小异

Golang Version: 1.8

protobuf生成比原核心代码

protobuf介绍

Protocol buffers是一个灵活的、高效的、自动化的用于对结构化数据进行序列化的协议。Protocol buffers序列化后的码流更小、速度更快、操作更简单。只需要将序列化的数据结构(.proto文件),便可以生成的源代码。

protobuf 3.0语法介绍

protobuf 语法

protobuf 安装

安装protobuf 3.4.0

protobuf download

./configure
make
make install
protoc —version

安装grpc-go

export PATH=$PATH:$GOPATH/bin
go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go

查看比原bc.proto核心文件

protocol/bc/bc.proto

syntax = "proto3";

package bc;

message Hash {
  fixed64 v0 = 1;
  fixed64 v1 = 2;
  fixed64 v2 = 3;
  fixed64 v3 = 4;
}

message Program {
  uint64 vm_version = 1;
  bytes  code       = 2;
}

// This message type duplicates Hash, above. One alternative is to
// embed a Hash inside an AssetID. But it's useful for AssetID to be
// plain old data (without pointers). Another alternative is use Hash
// in any protobuf types where an AssetID is called for, but it's
// preferable to have type safety.
message AssetID {
  fixed64 v0 = 1;
  fixed64 v1 = 2;
  fixed64 v2 = 3;
  fixed64 v3 = 4;
}

message AssetAmount {
  AssetID asset_id = 1;
  uint64  amount   = 2;
}

message AssetDefinition {
  Program issuance_program = 1;
  Hash    data             = 2;
}

message ValueSource {
  Hash        ref      = 1;
  AssetAmount value    = 2;
  uint64      position = 3;
}

message ValueDestination {
  Hash        ref      = 1;
  AssetAmount value    = 2;
  uint64      position = 3;
}

message BlockHeader {
  uint64            version                 = 1;
  uint64            height                  = 2;
  Hash              previous_block_id       = 3;
  uint64            timestamp               = 4;
  Hash              transactions_root       = 5;
  Hash              transaction_status_hash = 6;
  uint64            nonce                   = 7;
  uint64            bits                    = 8;
  TransactionStatus transaction_status      = 9;
}

message TxHeader {
  uint64        version         = 1;
  uint64        serialized_size = 2;
  uint64        time_range      = 3;
  repeated Hash result_ids      = 4;
}

message TxVerifyResult {
  bool status_fail = 1;
}

message TransactionStatus {
  uint64                  version        = 1;
  repeated TxVerifyResult verify_status  = 2;
}

message Mux {
  repeated ValueSource      sources              = 1; // issuances, spends, and muxes
  Program                   program              = 2;
  repeated ValueDestination witness_destinations = 3; // outputs, retirements, and muxes
  repeated bytes            witness_arguments    = 4;
}

message Coinbase {
  ValueDestination witness_destination = 1;
  bytes            arbitrary           = 2;
}

message Output {
  ValueSource source          = 1;
  Program     control_program = 2;
  uint64      ordinal         = 3;
}

message Retirement {
  ValueSource source   = 1;
  uint64      ordinal  = 2;
}

message Issuance {
  Hash             nonce_hash               = 1;
  AssetAmount      value                    = 2;
  ValueDestination witness_destination      = 3;
  AssetDefinition  witness_asset_definition = 4;
  repeated bytes   witness_arguments        = 5;
  uint64           ordinal                  = 6;
}

message Spend {
  Hash             spent_output_id     = 1;
  ValueDestination witness_destination = 2;
  repeated bytes   witness_arguments   = 3;
  uint64           ordinal             = 4;
}

根据bc.proto生成bc.pb.go代码

protoc -I/usr/local/include -I. \
      -I${GOPATH}/src \
      --go_out=plugins=grpc:. \
      ./*.proto

执行完上面命令,我们会看到当前目录下生成的bc.pb.go文件,该文件在比原链中承载这block、transaction、coinbase等重要数据结构

相关文章
|
8月前
|
存储 编解码 Go
编程之美:自定义二进制文件实用指南
编程之美:自定义二进制文件实用指南
223 0
《C++避坑神器·一》头文件相互包含
《C++避坑神器·一》头文件相互包含
68 0
|
安全 机器人 测试技术
惨,给Go提的代码被批麻了
hello大家好,我是小楼。 不知道大家还记不记得我上次找到了一个Go的Benchmark执行会超时的Bug?就是这篇文章《我好像发现了一个Go的Bug?》。 之后我就向Go提交了一个PR进行修复,本想等着代码被Merge进去,以后也可以吹牛说自己是个Go的Contributor,但事情并不顺利,今天就来分享一下这次失败的代码提交。
160 0
惨,给Go提的代码被批麻了
|
Java 数据库
“化繁为简”-神奇的Jar命令 | 带你学《Java面向对象编程》之六十九
简单的测试开发中可以通过javac命令进行编译,但当类的数量变多以后,编译出的.class文件也会急剧增多,本节将教你使用jar命令进行打包处理这些文件。
“化繁为简”-神奇的Jar命令   | 带你学《Java面向对象编程》之六十九
|
C++ 编译器 C语言
带你读《LLVM编译器实战教程》之二:外部项目
本书的前半部分将向您介绍怎么样去配置、构建、和安装LLVM的不同软件库、工具和外部项目。接下来,本书的后半部分将向您介绍LLVM的各种设计细节,并逐步地讲解LLVM的各个编译步骤:前段、中间表示(IR)、后端、即时编译(JIT)引擎、跨平台编译和插件接口。本书包含有大量翔实的示例和代码片段,以帮助读者平稳顺利的掌握LLVM的编译器开发环境。
|
Java 程序员 Linux
javac选项以递归方式编译给定目录下的所有Java文件 - IT屋-程序员软件开发技术分享社区
http://www.it1352.com/539276.html #Linux $ find -name“* .java”> sources.txt $ javac @ sources.txt :: Windows > dir / s / B * .java> sources.txt > javac @ sources.txt  网名:浩秦; 邮箱:root#landv.pw; 只要我能控制一個國家的貨幣發行,我不在乎誰制定法律。
1800 0
|
安全 Ubuntu Linux
biostar handbook(一)分析环境和数据可重复
biostarhandbook(一)分析环境和数据可重复 2017/10/18/11:00第一版本笔记,主要更新了生物信息要用那些基本技能和电脑配置简单说明,以及如何在虚拟机器上安装bioconda 2017/10/18/12:30第二版笔记,增加虚拟机配置 2017/10/18/13:05 第三版笔记,增加文件结构 2017/10/19/10:30 第四版笔记, 增加如何用xshell连接虚拟机内部系统 2017/10/20/08:09 第五版笔记,增加线下辅导部分。
1587 0