Skip to content

dolcalmi/stellar-thresh-sig-js

Repository files navigation

Stellar Two-Party Threshold Signature Library

Version Build Status Coverage Status David David Try on RunKit

Stellar Javascript two party threshold signature SDK

Installation

  1. If on Linux, install needed packages:
$ sudo apt-get update
$ sudo apt-get install libgmp3-dev pkg-config libssl-dev clang libclang-dev
  1. Install Node.js
    (tested on Node 10)
  2. Install nightly Rust
    (tested on rustc 1.38.0-nightly (0b680cfce 2019-07-09))
$ rustup toolchain install nightly-2019-07-10
$ rustup default nightly-2019-07-10-x86_64-unknown-linux-gnu # or value from `rustup show` command
$ rustc --version
# rustc 1.38.0-nightly (0b680cfce 2019-07-09)
  1. Install the package:
$ npm i stellar-thresh-sig-js

Alternatively, clone it:

$ git clone https://github.com/dolcalmi/stellar-thresh-sig-js
$ cd stellar-thresh-sig-js
$ npm install

if you have problems getting a keypair please check this issue or run the next command after npm install:

$ OPENSSL_STATIC=yes OPENSSL_LIB_DIR=<openssl path> npm explore @kzen-networks/thresh-sig -- npm run build-rust
# you can get openssl path with: openssl version -d

Usage

This library extends Keypair, Transaction and TransactionBuilder from Stellar SDK. You can use it in the same way that you use the Stellar SDK.

Initialization

import { Keypair, Transaction, TransactionBuilder } from 'stellar-thresh-sig-js';

Server Party1 Initialization

Before use threshold signatures with this library you must initialize server (party 1)

import { ThresholdSigServer } from 'stellar-thresh-sig-js';
new ThresholdSigServer().start();

from examples:

$ node ./examples/thresh-sig-server.js

with specific port and log mode:

# log options (off, debug, normal, critical)
$ ROCKET_PORT=8001 ROCKET_LOG=normal node ./examples/thresh-sig-server.js

If you want to know more information about ENV variables go to Rocket ENV variables

Keypair

Create a new random key pair with two-party threshold signature:

const keypair = await Keypair.randomLocalPartyThreshSig();
// or
const keypair = await Keypair.randomLocalPartyThreshSig('http://your-server.com:8000');

Export key pair:

const keypairJSON = keypair.toJSON();
await saveToFileOrDB(keypairJSON);

Restore from json:

const keypairJSON = await loadFromFileOrDB();
const keypair = Keypair.fromJSON(keypairJSON);

Sign data:

const signature = await keypair.sign(data);

Full example in ./examples/keypair.js

$ node ./examples/keypair.js

Transaction and TransactionBuilder

Use it in the same way as StellarSdk

import { TransactionBuilder } from 'stellar-thresh-sig-js';

const transaction = new TransactionBuilder(sender, {
  fee,
  networkPassphrase: StellarSdk.Networks.TESTNET,
})
  .addOperation(...)
  .setTimeout(30)
  .build();

  // the only difference is that sign is an async function.
  await transaction.sign(senderKeypair);

Full example in ./examples/send-payment.js

$ node ./examples/send-payment.js

Development

Run all tests:

$ npm i
$ npm test

Run a single test suite:

$ npm run mocha -- test/lib/keypair.spec.js

Run a single test (case sensitive):

$ npm run mocha -- test/lib/keypair.spec.js --grep 'sign'

Library based on Two Party signatures JS SDK