Skip to content

Commit

Permalink
add message model to process transaction content and get original value
Browse files Browse the repository at this point in the history
  • Loading branch information
classicalliu committed Jul 11, 2018
1 parent 10db761 commit 4bcd15f
Show file tree
Hide file tree
Showing 5 changed files with 287 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ gem 'ransack', '~> 1.8', '>= 1.8.8'
# paginate
gem 'kaminari'

gem 'google-protobuf', '~> 3.6'

gem 'ciri', '~> 0.0.2'

group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
Expand Down
20 changes: 20 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ GEM
arel (9.0.0)
awesome_print (1.8.0)
bindex (0.5.0)
bitcoin-secp256k1 (0.4.0)
ffi (>= 1.9.10)
bootsnap (1.3.0)
msgpack (~> 1.0)
builder (3.2.3)
Expand All @@ -72,6 +74,18 @@ GEM
chromedriver-helper (1.2.0)
archive-zip (~> 0.10)
nokogiri (~> 1.8)
ciri (0.0.2)
bitcoin-secp256k1 (~> 0.4.0)
ciri-rlp (~> 0.1.1)
ciri-utils (~> 0.1.0)
concurrent-ruby (~> 1.0.5)
ffi (~> 1.9.23)
lru_redux (~> 1.1.0)
snappy (~> 0.0.17)
ciri-rlp (0.1.1)
ciri-utils (~> 0.1.0)
ciri-utils (0.1.0)
digest-sha3 (~> 1.1.0)
coderay (1.1.2)
coffee-rails (4.2.2)
coffee-script (>= 2.2.0)
Expand All @@ -85,6 +99,7 @@ GEM
safe_yaml (~> 1.0.0)
crass (1.0.4)
daemons (1.2.6)
digest-sha3 (1.1.0)
dotenv (2.5.0)
dotenv-rails (2.5.0)
dotenv (= 2.5.0)
Expand All @@ -96,6 +111,7 @@ GEM
ffi (1.9.25)
globalid (0.4.1)
activesupport (>= 4.2.0)
google-protobuf (3.6.0)
hashdiff (0.3.7)
i18n (1.0.1)
concurrent-ruby (~> 1.0)
Expand Down Expand Up @@ -123,6 +139,7 @@ GEM
loofah (2.2.2)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
lru_redux (1.1.0)
mail (2.7.0)
mini_mime (>= 0.1.1)
marcel (0.3.2)
Expand Down Expand Up @@ -204,6 +221,7 @@ GEM
selenium-webdriver (3.13.0)
childprocess (~> 0.5)
rubyzip (~> 1.2)
snappy (0.0.17)
spring (2.0.2)
activesupport (>= 4.2)
spring-watcher-listen (2.0.1)
Expand Down Expand Up @@ -251,10 +269,12 @@ DEPENDENCIES
byebug
capybara (>= 2.15, < 4.0)
chromedriver-helper
ciri (~> 0.0.2)
coffee-rails (~> 4.2)
daemons (~> 1.2, >= 1.2.6)
dotenv-rails
faraday (~> 0.15.2)
google-protobuf (~> 3.6)
jbuilder (~> 2.5)
kaminari
listen (>= 3.0.5, < 3.2)
Expand Down
60 changes: 60 additions & 0 deletions app/models/message.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
require "blockchain_pb"
require "ciri/utils"
require "ciri/crypto"

class Message
attr_reader :original_data, :original_signature
attr_reader :data, :signature, :value, :to, :from

def initialize(content)
@unverified_transaction = decode(content)

@original_data = @unverified_transaction["transaction"]["data"]
@original_signature = @unverified_transaction["signature"]

@data = to_hex(@original_data)
@signature = to_hex(@original_signature)

@value = to_hex(@unverified_transaction["transaction"]["value"])
@to = "0x" + @unverified_transaction["transaction"]["to"]

@from = get_from
end

# decode
def decode(content)
binary_str = hex_to_binary_str(content)
::UnverifiedTransaction.decode(binary_str)
end

def get_from
digest_data = Ciri::Utils.sha3(@original_data)
pubkey = Ciri::Crypto.ecdsa_recover(digest_data, @original_signature)
# address = Ciri::Utils.sha3(pubkey[1..-1]).unpack("H*").first.downcase[-40..-1]
address = Ciri::Utils.sha3(pubkey[1..-1])[-20..-1]
Ciri::Utils.to_hex(address)
end

def to_hex(hex)
str = hex.unpack("H*").first
return str if str.downcase.start_with?("0x")
"0x" + str
end

# remove 0x with hex string
def filter_hex_str(hex)
return hex[2..-1] if hex.start_with?("0x")
hex
end

def hex_to_buffer(hex)
hex_str = filter_hex_str(hex)
[hex_str].pack('H*').bytes.to_a
end

# deserialization
def hex_to_binary_str(hex)
hex_to_buffer(hex).pack("c*")
end

end
101 changes: 101 additions & 0 deletions lib/blockchain.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
syntax = "proto3";

enum ProofType {
AuthorityRound = 0;
Raft = 1;
Tendermint = 2;
}

message Proof {
bytes content = 1;
ProofType type = 2;
}

message BlockHeader {
bytes prevhash = 1;
uint64 timestamp = 2;
uint64 height = 3;
bytes state_root = 4;
bytes transactions_root = 5;
bytes receipts_root = 6;
uint64 gas_used = 7;
uint64 gas_limit = 8;
Proof proof = 9;
bytes proposer = 10;
}

message Status {
bytes hash = 1;
uint64 height = 2;
}

message AccountGasLimit {
uint64 common_gas_limit = 1;
map<string,uint64> specific_gas_limit = 2;
}

message RichStatus {
bytes hash = 1;
uint64 height = 2;
repeated bytes nodes = 3;
uint64 interval = 4;
}

enum Crypto {
SECP = 0;
SM2 = 1;
}

message ProtoTransaction {
string to = 1;
string nonce = 2;
uint64 quota = 3;
uint64 valid_until_block = 4;
bytes data = 5;
bytes value = 6;
uint32 chain_id = 7;
uint32 version = 8;
}

message UnverifiedTransaction {
ProtoTransaction transaction = 1;
bytes signature = 2;
Crypto crypto = 3;
}

message SignedTransaction {
UnverifiedTransaction transaction_with_sig = 1;
// SignedTransaction hash
bytes tx_hash = 2;
// public key
bytes signer = 3;
}

// data precompile API

message BlockBody {
repeated SignedTransaction transactions = 1;
}

message Block {
uint32 version = 1;
BlockHeader header = 2;
BlockBody body = 3;
}

message BlockWithProof {
Block blk = 1;
Proof proof = 2;
}

message BlockTxs {
uint64 height = 1;
BlockBody body = 3;
}

message BlackList {
// black list of address, the account that sent the transaction does not have enough gas
repeated bytes black_list = 1;
// clear list of address
repeated bytes clear_list = 2;
}
102 changes: 102 additions & 0 deletions lib/blockchain_pb.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 4bcd15f

Please sign in to comment.