8000 GitHub - sgessa/dpos-ex: DPoS offline tools
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

sgessa/dpos-ex

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

57 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DPoS

An Elixir port of vekexasia's dpos-offline typescript library.

Installation

Add DPoS to your mix.exs

def deps do
  [
    {:dpos, "~> 0.4.0"}
  ]
end

Usage

Wallet utilities

secret = "my secret"

# For Lisk
lisk_wallet = Wallet.generate_lisk(secret)

# For Shift
shift_wallet = Wallet.generate_shift(secret)

# For any lisk-like wallet
wallet = Wallet.generate(secret, "XYZ")

# Wallet struct
%Wallet{
  address: "2340651171948227443XYZ",
  priv_key: <<185, 209, 208, 19, 246, 0, 236, 27, 241, 107, 174, 106, 54, 52,
    202, 209, 93, 204, 73, 12, 159, 40, 53, 118, 66, 1, 164, 26, 29, 112, 222,
    68>>,
  pub_key: <<249, 101, 174, 176, 6, 137, 118, 4, 103, 241, 92, 60, 161, 68, 190,
    100, 196, 154, 35, 122, 177, 234, 113, 116, 109, 35, 81, 173, 215, 138, 11,
    101>>
}

# Sign a message
iex> {:ok, signature} = Wallet.sign_message(wallet, "My Signed Message")

# Verify a message
iex> :ok = Wallet.verify_message(wallet, "My Signed Message", signature)

Transaction utilities

tx =
  Tx.Send
  |> Tx.build(%{amount: 10_000_000_000, fee: 10_000_000, recipient: "2340651171948227443XYZ"})
  |> Tx.sign(wallet)

# Optional: signing the tx using a second private key
Tx.sign(tx, wallet, second_priv_key)

# It is possible to pass a secret/suffix tuple as second argument to Tx.sign/3:
Tx.sign(tx, {"my secret", "L"})

# Finally we can broadcast our transaction to a remote node (or a local node)
network = [
  nethash: "ed14889723f24ecc54871d058d98ce91ff2f973192075c0155ba2b7b70ad2511",
  version: "1.5.0",
  uri: "http://127.0.0.1:8000"
]

tx
|> Tx.normalize()
|> Net.broadcast(network)

# The transaction can be normalized to be easier to read and to be broadcasted to a remote node
Tx.normalize(tx)

# Normalized Tx struct
%Tx.Normalized{
  id: "14577272354830356516",
  recipientId: "2340651171948227443XYZ",
  senderPublicKey: "f965aeb00689760467f15c3ca144be64c49a237ab1ea71746d2351add78a0b65",
  signature: "271d56c46e49d9b01707ba7ec90ea69a59a9e6f606abf532315e5e2fa327b465e9d9f4ef6c37d11ca84aec61f8b138881b9afa92ba39123dc6622057ea53f50f",
  signSignature: nil,
  timestamp: 252848803,
  type: 0,
  amount: 10000000000,
  asset: %{},
  fee: 10000000
}

Custom Transactions

You can implement the Dpos.Tx behaviour in order to create your own transaction types.

The behaviour requires you to implement 2 functions, type_id/0 and get_child_bytes/1.

Example:

defmodule MyApp.Transaction do
  @behaviour Dpos.Tx

  @impl Dpos.Tx
  def type_id do
    # The integer value that will be used in the `type` field.
    3333
  end

  @impl Dpos.Tx
  def get_child_bytes(%Tx{}) do
    # This function must return a binary.
    #
    # If your transaction uses custom fields you'd need to implement a logic to compute these fields,
    # otherwise return an empty binary.
    #
    # See `Dpos.Tx.Vote` for your reference.
  end
end

Contributing

Clone the repository and run $ mix test to make sure everything is working.

Authors

License

DPoS is released under the MIT license. See the license file.

About

DPoS offline tools

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

0