1. 程式人生 > >Derek解讀Bytom源碼-protobuf生成比原核心代碼

Derek解讀Bytom源碼-protobuf生成比原核心代碼

side pro timestamp nta 靈活 ins plugin 安裝 pes

作者: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等重要數據結構

Derek解讀Bytom源碼-protobuf生成比原核心代碼