Skip to content

Instantly share code, notes, and snippets.

@theblockstalk
Created October 26, 2017 13:19
Show Gist options
  • Select an option

  • Save theblockstalk/9fa3cce017ff8122b53e85c07c60258b to your computer and use it in GitHub Desktop.

Select an option

Save theblockstalk/9fa3cce017ff8122b53e85c07c60258b to your computer and use it in GitHub Desktop.

Revisions

  1. theblockstalk created this gist Oct 26, 2017.
    84 changes: 84 additions & 0 deletions bigchain-threshold-output.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,84 @@
    const bigchain = require('bigchaindb-driver')

    const API_PATH = 'http://localhost:9984/api/v1/'
    const bigchainConnection = new bigchain.Connection(API_PATH)

    var aliceKey = new bigchain.Ed25519Keypair()
    var bobKey = new bigchain.Ed25519Keypair()

    // Condition that BOTH Alice AND Bob are needed to fulfill this output
    var subConditionUser = bigchain.Transaction.makeEd25519Condition(aliceKey.publicKey, false)
    var subConditionIndorse = bigchain.Transaction.makeEd25519Condition(bobKey.publicKey, false)
    var condition = bigchain.Transaction.makeThresholdCondition(2, [subConditionUser, subConditionIndorse])
    var outputs = [ bigchain.Transaction.makeOutput(condition), ]

    var issuers = aliceKey.publicKey

    var txCreateAssetThreshold = bigchain.Transaction.makeCreateTransaction(
    { myAsset: 'some asset' },
    { message: 'This create transaction can only be transfered if both Alice and Bob allow it' },
    outputs,
    issuers
    )

    var txCreateAssetThresholdSigned = bigchain.Transaction.signTransaction(
    txCreateAssetThreshold,
    aliceKey.privateKey
    )
    console.log('========================txCreateAssetThresholdSigned')
    console.log(txCreateAssetThresholdSigned)

    bigchainConnection.postTransaction(txCreateAssetThresholdSigned)
    .then(() => bigchainConnection.pollStatusAndFetchTransaction(txCreateAssetThresholdSigned.id))
    .then(() => bigchainConnection.getStatus(txCreateAssetThresholdSigned.id))
    .then((status) => {
    if (status.status == 'valid') {
    return
    }
    }).then(() => {
    // We can successfully get to this point in the program

    // Create a transfer transaction referrencing the Threshold condition asset
    var txTransferAssetSimple = bigchain.Transaction.makeTransferTransaction(
    txCreateAssetThresholdSigned,
    { message: 'This should create a transaction that can only be transfered by Bob'},
    [bigchain.Transaction.makeEd25519Condition(bobKey.publicKey), ],
    0
    )

    // Fullfil the output conditions by signing it as Bob and Alice (both are required)
    console.log('========================txTransferAssetSimple')
    console.log(txTransferAssetSimple)
    var txTransferAssetSimpleSignedByAlice = bigchain.Transaction.signTransaction(
    txTransferAssetSimple,
    aliceKey.privateKey
    )
    console.log('========================txTransferAssetSimpleSignedByAlice')
    console.log(txTransferAssetSimpleSignedByAlice)

    var txTransferAssetSimpleSignedByAliceAndBob = bigchain.Transaction.signTransaction(
    txTransferAssetSimpleSignedByAlice,
    bobKey.privateKey
    )
    console.log('========================txTransferAssetSimpleSignedByAliceAndBob')
    console.log(txTransferAssetSimpleSignedByAliceAndBob)

    // NOTE: the following will not work...
    // var txTransferAssetSimpleSignedDouble = bigchain.Transaction.signTransaction(
    // txTransferAssetSimple,
    // [aliceKey.privateKey, bobKey.privateKey]
    // )
    // console.log('========================txTransferAssetSimpleSignedDouble')
    // console.log(txTransferAssetSimpleSignedDouble)

    // NOTE: This call will fail.
    // Server responds with code 400 'BAD REQUEST'
    bigchainConnection.postTransaction(txTransferAssetSimpleSigned)
    .then(() => bigchainConnection.pollStatusAndFetchTransaction(txTransferAssetSimpleSigned.id))
    .then(() => bigchainConnection.getStatus(txTransferAssetSimpleSigned.id))
    .then((status) => {
    if (status.status == 'valid') {
    console.log('Transaction successfully posted to bigchain')
    }
    })
    }).catch((err) => console.log(err))