示例#1
0
        public async Task testBuildOnlyCreateTransaction()
        {
            HelloAsset assetData = new HelloAsset("Hello BigchainDB!");

            PublicKey edDSAPublicKey = BlockchainAccount.publicKeyFromHex(publicKey);
            FulFill   fulFill        = new FulFill();

            fulFill.OutputIndex   = 0;
            fulFill.TransactionId = "2d431073e1477f3073a4693ac7ff9be5634751de1b8abaa1f4e19548ef0b4b0e";

            Transaction <HelloAsset, object> transaction = BigchainDbTransactionBuilder <HelloAsset, object>
                                                           .init()
                                                           .addAssets(assetData)
                                                           .addInput("pGSAIDE5i63cn4X8T8N1sZ2mGkJD5lNRnBM4PZgI_zvzbr-cgUCy4BR6gKaYT-tdyAGPPpknIqI4JYQQ-p2nCg3_9BfOI-15vzldhyz-j_LZVpqAlRmbTzKS-Q5gs7ZIFaZCA_UD",
                                                                     fulFill, edDSAPublicKey)
                                                           .addOutput("1", edDSAPublicKey)
                                                           .operation(Operations.CREATE).buildOnly(edDSAPublicKey);

            transaction.Version.ShouldBe("2.0");
            transaction.Signed.ShouldBe(null);
            transaction.Operation.ShouldBe("CREATE");

            Input input = transaction.Inputs[0];

            input.OwnersBefore.ShouldNotBe(null);
            input.FulFillment.ShouldNotBe(null);
            input.FulFills.ShouldNotBe(null);
            input.FulFills.OutputIndex.ShouldBe(0);
            input.FulFills.TransactionId.ShouldBe("2d431073e1477f3073a4693ac7ff9be5634751de1b8abaa1f4e19548ef0b4b0e");

            Output output = transaction.Outputs[0];

            output.Amount.ShouldNotBe(null);
            output.Condition.Uri.ShouldNotBe(null);
            output.Condition.Details.PublicKey.ShouldNotBe(null);
            output.Condition.Details.Type.ShouldNotBe(null);
            output.PublicKeys.ShouldNotBe(null);
        }
        public async Task testTokensBuildAndCombineTransferPartingTransaction()
        {
            var publicKeyObj  = BlockchainAccount.publicKeyFromHex(publicKey);
            var privateKeyObj = BlockchainAccount.privateKeyFromHex(privateKey);

            // initial tokens amount
            int       tokens    = 10000;
            TestToken assetData = new TestToken();

            assetData.token         = "My Token on " + DateTime.Now.Ticks.ToString();
            assetData.number_tokens = tokens;

            TestMetadata metaData = new TestMetadata();

            metaData.msg = "My first transaction";

            // Set up, sign, and send your transaction
            var transaction = BigchainDbTransactionBuilder <TestToken, TestMetadata>
                              .init()
                              .addAssets(assetData)
                              .addMetaData(metaData)
                              .addOutput(tokens.ToString(), publicKeyObj)
                              .operation(Operations.CREATE)
                              .buildAndSignOnly(publicKeyObj, privateKeyObj);

            //.buildAndSign(account.PublicKey, account.PrivateKey);

            //var info = transaction.toHashInput();
            var createTransaction = await TransactionsApi <TestToken, TestMetadata> .sendTransactionAsync(transaction);

            Thread.Sleep(5000);
            createTransaction.Data.ShouldNotBe(null);
            // the asset's ID is equal to the ID of the transaction that created it
            if (createTransaction.Data != null)
            {
                string testId2   = createTransaction.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(testId2);

                testTran2.ShouldNotBe(null);
            }

            // Describe the output you are fulfilling on the previous transaction
            FulFill spendFrom = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            spendFrom.TransactionId = createTransaction.Data.Id;
            spendFrom.OutputIndex   = 0;


            // we want to transfer 200 tokens to my cat
            int amount = 200;
            BlockchainAccount catAccount   = new BlockchainAccount();
            Details           details      = null;
            TestToken         transferData = new TestToken();

            assetData.token         = "To my cat";
            assetData.number_tokens = amount;
            int amountLeft = tokens - amount;

            // Use the previous transaction's asset and TRANSFER it
            var build2 = BigchainDbTransactionBuilder <Asset <string>, TestToken> .
                         init().
                         addMetaData(transferData).
                         addInput(details, spendFrom, publicKeyObj).
                         addOutput(amountLeft.ToString(), publicKeyObj).
                         addOutput(amount.ToString(), catAccount.PublicKey).
                         addAssets(createTransaction.Data.Id).
                         operation(Operations.TRANSFER).
                         buildAndSignOnly(publicKeyObj, privateKeyObj);

            var transferTransaction = await TransactionsApi <Asset <string>, TestToken> .sendTransactionAsync(build2);

            Thread.Sleep(5000);
            transferTransaction.Data.ShouldNotBe(null);

            if (transferTransaction != null)
            {
                string tran2     = transferTransaction.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(tran2);

                testTran2.ShouldNotBe(null);
            }

            var useThisKey = transferTransaction.Data.Outputs[0].PublicKeys[0];

            var compKey = KeyPairUtils.encodePublicKeyInBase58(publicKeyObj);
            // get unspent outputs
            var list = await OutputsApi.getUnspentOutputsAsync(useThisKey);

            //list.Count.ShouldBe(1);

            // Describe the output you are fulfilling on spent outputs
            FulFill spendFrom2 = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            spendFrom2.TransactionId = transferTransaction.Data.Id; // list[0].TransactionId;
            spendFrom2.OutputIndex   = 0;

            // now we want to send 100 tokens to my dog
            BlockchainAccount dogAccount    = new BlockchainAccount();
            Details           details2      = null;
            TestToken         transferData2 = new TestToken();

            transferData2.token         = "To my dog";
            transferData2.number_tokens = amount;

            amountLeft = amountLeft - amount;
            // Use the previous transaction's asset and TRANSFER it
            var build3 = BigchainDbTransactionBuilder <Asset <string>, TestToken> .
                         init().
                         addMetaData(transferData2).
                         addInput(details2, spendFrom2, publicKeyObj).
                         addOutput(amountLeft.ToString(), publicKeyObj).
                         addOutput(amount.ToString(), dogAccount.PublicKey).
                         addAssets(createTransaction.Data.Id).
                         operation(Operations.TRANSFER).
                         buildAndSignOnly(publicKeyObj, privateKeyObj);

            var transferTransaction3 = await TransactionsApi <Asset <string>, TestToken> .sendTransactionAsync(build3);

            Thread.Sleep(5000);
            transferTransaction3.Data.ShouldNotBe(null);

            if (transferTransaction3 != null)
            {
                string tran2     = transferTransaction3.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(tran2);

                testTran2.ShouldNotBe(null);
            }

            // now dog wants to share with puppy 100 tokens
            BlockchainAccount puppyAccount  = new BlockchainAccount();
            Details           details3      = null;
            TestToken         transferData3 = new TestToken();

            transferData3.token = "To my puppy";
            int topuppy = 100;

            transferData3.number_tokens = topuppy;

            FulFill spendFrom3 = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            spendFrom3.TransactionId = transferTransaction3.Data.Id; // list[0].TransactionId;
            spendFrom3.OutputIndex   = 1;

            var dogAmountLeft = amount - topuppy;
            // Use the previous transaction's asset and TRANSFER it
            var build4 = BigchainDbTransactionBuilder <Asset <string>, TestToken> .
                         init().
                         addMetaData(transferData3).
                         addInput(details3, spendFrom3, dogAccount.PublicKey).
                         addOutput(dogAmountLeft.ToString(), dogAccount.PublicKey).
                         addOutput(topuppy.ToString(), puppyAccount.PublicKey).
                         addAssets(createTransaction.Data.Id).
                         operation(Operations.TRANSFER).
                         buildAndSignOnly(dogAccount.PublicKey, dogAccount.Key);



            var transferTransaction4 = await TransactionsApi <Asset <string>, TestToken> .sendTransactionAsync(build4);

            Thread.Sleep(5000);
            if (transferTransaction4.Messsage != null)
            {
                var msg = transferTransaction4.Messsage.Message;
            }

            transferTransaction4.Data.ShouldNotBe(null);

            if (transferTransaction4 != null)
            {
                string tran2     = transferTransaction4.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(tran2);

                testTran2.ShouldNotBe(null);
            }

            // now we feel bad for puppy and want to give puppy another 100

            // Describe the output you are fulfilling on the previous transaction
            FulFill spendFrom5 = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            // last transfer transaction id to dog
            spendFrom5.TransactionId = transferTransaction3.Data.Id;
            spendFrom5.OutputIndex   = 0;


            // we want to transfer 100 tokens.
            int       amount5       = 100;
            Details   details5      = null;
            TestToken transferData5 = new TestToken();

            transferData5.token         = "To my puppy extra 100";
            transferData5.number_tokens = amount5;
            amountLeft = amountLeft - amount5;
            // Use the previous transaction's asset and TRANSFER it
            var build5 = BigchainDbTransactionBuilder <Asset <string>, TestToken> .
                         init().
                         addMetaData(transferData5).
                         addInput(details5, spendFrom5, publicKeyObj).
                         addOutput(amountLeft.ToString(), publicKeyObj).
                         addOutput(amount5.ToString(), puppyAccount.PublicKey).
                         addAssets(createTransaction.Data.Id).
                         operation(Operations.TRANSFER).
                         buildAndSignOnly(publicKeyObj, privateKeyObj);

            var transferTransaction5 = await TransactionsApi <Asset <string>, TestToken> .sendTransactionAsync(build5);

            Thread.Sleep(5000);
            transferTransaction5.Data.ShouldNotBe(null);

            if (transferTransaction5 != null)
            {
                string tran5     = transferTransaction5.Data.Id;
                var    testTran5 = await TransactionsApi <object, object> .getTransactionByIdAsync(tran5);

                testTran5.ShouldNotBe(null);
            }

            // at this point, puppy has 2 transactions, with 100 tokens each. we want to combine those into
            Details   details6      = null;
            TestToken transferData6 = new TestToken();

            transferData5.token         = "Puppy combined account";
            transferData5.number_tokens = amount5 + topuppy;
            // we need to spend 2 previous transactions and create new one
            FulFill spendFromA = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            spendFromA.TransactionId = transferTransaction4.Data.Id; // list[0].TransactionId;
            spendFromA.OutputIndex   = 1;

            FulFill spendFromB = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            spendFromB.TransactionId = transferTransaction5.Data.Id; // list[0].TransactionId;
            spendFromB.OutputIndex   = 1;
            var combinedAmount = amount5 + topuppy;
            var build6         = BigchainDbTransactionBuilder <Asset <string>, TestToken> .
                                 init().
                                 addMetaData(transferData5).
                                 addInput(details6, spendFromA, puppyAccount.PublicKey).
                                 addInput(details6, spendFromB, puppyAccount.PublicKey).
                                 addOutput(combinedAmount.ToString(), puppyAccount.PublicKey).
                                 addAssets(createTransaction.Data.Id).
                                 operation(Operations.TRANSFER).
                                 buildAndSignOnly(puppyAccount.PublicKey, puppyAccount.Key);

            var transferTransaction6 = await TransactionsApi <Asset <string>, TestToken> .sendTransactionAsync(build6);

            Thread.Sleep(5000);
            transferTransaction6.Data.ShouldNotBe(null);
            transferTransaction6.Data.Outputs[0].Amount.ShouldBe("200");

            if (transferTransaction6 != null)
            {
                string tran6     = transferTransaction6.Data.Id;
                var    testTran6 = await TransactionsApi <object, object> .getTransactionByIdAsync(tran6);

                testTran6.ShouldNotBe(null);
            }
        }
        static void Main(string[] args)
        {
            // The code provided will print ‘Hello World’ to the console.
            // Press Ctrl+F5 (or go to Debug > Start Without Debugging) to run your app.
            Console.WriteLine("Hello Omnibasis!");

            var testTransfer = false;
            //define connections
            var conn1Config = new Dictionary <string, object>();

            //config connection 1
            conn1Config.Add("baseUrl", "https://test.ipdb.io");
            BlockchainConnection conn1 = new BlockchainConnection(conn1Config);

            var conn2Config = new Dictionary <string, object>();
            var headers2    = new Dictionary <string, string>();

            //config connection 2
            conn2Config.Add("baseUrl", "https://test.ipdb.io");
            BlockchainConnection conn2 = new BlockchainConnection(conn2Config);

            //add connections
            IList <BlockchainConnection> connections = new List <BlockchainConnection>();

            connections.Add(conn1);
            connections.Add(conn2);
            //...You can add as many nodes as you want

            //multiple connections
            var builderWithConnections = BigchainDbConfigBuilder
                                         .addConnections(connections)
                                         .setTimeout(60000); //override default timeout of 20000 milliseconds

            // single connection
            var builder = BigchainDbConfigBuilder
                          .baseUrl("https://test.ipdb.io");

            if (!AsyncContext.Run(() => builder.setup()))
            {
                Console.WriteLine("Failed to setup");
            }
            ;

            // prepare your key
            var algorithm  = SignatureAlgorithm.Ed25519;
            var privateKey = Key.Import(algorithm, Utils.StringToByteArray(privateKeyString), KeyBlobFormat.PkixPrivateKey);
            var publicKey  = PublicKey.Import(algorithm, Utils.StringToByteArray(publicKeyString), KeyBlobFormat.PkixPublicKey);
            //Account account = new Account();

            //Dictionary<string, string> assetData = new Dictionary<string, string>();
            //assetData.Add("msg", "Hello!");

            Random    random    = new Random();
            TestAsset assetData = new TestAsset();

            assetData.msg         = "Hello Omnibasis!";
            assetData.city        = "I was born in San Diego";
            assetData.temperature = random.Next(60, 80);
            assetData.datetime    = DateTime.Now;

            //MetaData metaData = new MetaData();
            //metaData.setMetaData("msg", "My first transaction");
            TestMetadata metaData = new TestMetadata();

            metaData.msg = "My first transaction";

            // Set up, sign, and send your transaction
            var transaction = BigchainDbTransactionBuilder <TestAsset, TestMetadata>
                              .init()
                              .addAssets(assetData)
                              .addMetaData(metaData)
                              .operation(Operations.CREATE)
                              .buildAndSignOnly(publicKey, privateKey);

            //.buildAndSign(account.PublicKey, account.PrivateKey);

            //var info = transaction.toHashInput();
            var    createTransaction = AsyncContext.Run(() => TransactionsApi <TestAsset, TestMetadata> .sendTransactionAsync(transaction));
            string assetId2          = "";

            // the asset's ID is equal to the ID of the transaction that created it
            if (createTransaction != null && createTransaction.Data != null)
            {
                assetId2 = createTransaction.Data.Id;
                //"2984ac294290ce6f15124140dad652fc8a306aca62c38237174988dfcf31a3e6"
                var testTran2 = AsyncContext.Run(() => TransactionsApi <object, object> .getTransactionByIdAsync(assetId2));
                if (testTran2 != null)
                {
                    Console.WriteLine("Hello assetId: " + assetId2);
                }
                else
                {
                    Console.WriteLine("Failed to find assetId: " + assetId2);
                }
            }
            else if (createTransaction != null)
            {
                Console.WriteLine("Failed to send transaction: " + createTransaction.Messsage.Message);
            }


            //}
            if (!string.IsNullOrEmpty(assetId2) && testTransfer)
            {
                // Describe the output you are fulfilling on the previous transaction
                FulFill spendFrom = new FulFill();
                spendFrom.TransactionId = assetId2;
                spendFrom.OutputIndex   = 0;

                // Change the metadata if you want
                //MetaData transferMetadata = new MetaData();
                //metaData.setMetaData("msg", "My second transaction");
                TestMetadata transferMetadata = new TestMetadata();
                transferMetadata.msg = "My second transaction";

                // the asset's ID is equal to the ID of the transaction that created it
                // By default, the 'amount' of a created digital asset == "1". So we spend "1" in our TRANSFER.
                string            amount  = "1";
                BlockchainAccount account = new BlockchainAccount();
                Details           details = null;
                // Use the previous transaction's asset and TRANSFER it
                var build2 = BigchainDbTransactionBuilder <Asset <string>, TestMetadata> .
                             init().
                             addMetaData(metaData).
                             addInput(details, spendFrom, publicKey).
                             addOutput("1", account.Key.PublicKey).
                             addAssets(assetId2).
                             operation(Operations.TRANSFER).
                             buildAndSignOnly(publicKey, privateKey);

                var transferTransaction = AsyncContext.Run(() => TransactionsApi <Asset <string>, TestMetadata> .sendTransactionAsync(build2));

                if (transferTransaction != null && transferTransaction.Data != null)
                {
                    string assetIdTransfer = transferTransaction.Data.Id;
                    var    testTran2       = AsyncContext.Run(() => TransactionsApi <object, object> .getTransactionByIdAsync(assetIdTransfer));
                    if (testTran2 != null)
                    {
                        Console.WriteLine("Hello transfer assetId: " + assetIdTransfer);
                    }
                    else
                    {
                        Console.WriteLine("Failed to find transfer assetId: " + assetIdTransfer);
                    }
                }
                else if (transferTransaction != null)
                {
                    Console.WriteLine("Failed to send transaction: " + createTransaction.Messsage.Message);
                }
            }


            Console.ReadKey(true);

            // Go to http://aka.ms/dotnet-get-started-console to continue learning how to build a console app!
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            //define connections
            var conn1Config = new Dictionary <string, object>();

            //define headers for connections
            var headers1 = new Dictionary <string, string>();

            //config connection 1
            conn1Config.Add("baseUrl", "https://test.ipdb.io/");
            conn1Config.Add("headers", headers1);
            BlockchainConnection conn1 = new BlockchainConnection(conn1Config);

            var conn2Config = new Dictionary <string, object>();
            var headers2    = new Dictionary <string, string>();

            //config connection 2
            conn2Config.Add("baseUrl", "https://test.ipdb.io/");
            conn2Config.Add("headers", headers2);
            BlockchainConnection conn2 = new BlockchainConnection(conn2Config);

            //add connections
            IList <BlockchainConnection> connections = new List <BlockchainConnection>();

            connections.Add(conn1);
            connections.Add(conn2);
            //...You can add as many nodes as you want

            //multiple connections
            var builder = BigchainDbConfigBuilder
                          .addConnections(connections)
                          .setTimeout(60000); //override default timeout of 20000 milliseconds

            // single connection
            //var builder = BigchainDbConfigBuilder
            //    .baseUrl("https://test.ipdb.io/")
            //    .addToken("app_id", "204d77e0")
            //    .addToken("app_key", "910c0943ce05e76b568395986d3b33d9");

            if (!AsyncContext.Run(() => builder.setup()))
            {
                Console.WriteLine("Failed to setup");
            }
            ;

            // prepare your key
            var algorithm  = SignatureAlgorithm.Ed25519;
            var privateKey = Key.Import(algorithm, Utils.StringToByteArray(privateKeyString), KeyBlobFormat.PkixPrivateKey);
            var publicKey  = PublicKey.Import(algorithm, Utils.StringToByteArray(publicKeyString), KeyBlobFormat.PkixPublicKey);
            //Account account = new Account();

            //Dictionary<string, string> assetData = new Dictionary<string, string>();
            //assetData.Add("msg", "Hello!");

            TestAsset assetData = new TestAsset();

            assetData.msg         = "Hello!";
            assetData.city        = "San Diego";
            assetData.temperature = "74";
            assetData.datetime    = DateTime.Now;

            //MetaData metaData = new MetaData();
            //metaData.setMetaData("msg", "My first transaction");
            TestMetadata metaData = new TestMetadata();

            metaData.msg = "My first transaction";

            var createTransaction2 = AsyncContext.Run(() => TransactionsApi <object, object>
                                                      .getTransactionByIdAsync("a30a6858185b9382fed0053e51a1e6faae490132c307a7cd488097c12a55b763"));

            //if(true)
            //{
            // Set up, sign, and send your transaction
            var transaction = BigchainDbTransactionBuilder <TestAsset, TestMetadata>
                              .init()
                              .addAssets(assetData)
                              .addMetaData(metaData)
                              .operation(Operations.CREATE)
                              .buildAndSignOnly(publicKey, privateKey);

            //.buildAndSign(account.PublicKey, account.PrivateKey);

            //var info = transaction.toHashInput();
            var createTransaction = AsyncContext.Run(() => TransactionsApi <TestAsset, TestMetadata> .sendTransactionAsync(transaction));

            // the asset's ID is equal to the ID of the transaction that created it
            if (createTransaction != null && createTransaction.Data != null)
            {
                string assetId2 = createTransaction.Data.Id;
                //"2984ac294290ce6f15124140dad652fc8a306aca62c38237174988dfcf31a3e6"
                var testTran2 = AsyncContext.Run(() => TransactionsApi <object, object> .getTransactionByIdAsync(assetId2));
                Console.WriteLine("Hello assetId: " + assetId2);
            }
            else
            {
                Console.WriteLine("Failed to send transaction");
            }


            //}

            // Describe the output you are fulfilling on the previous transaction
            FulFill spendFrom = new FulFill();

            spendFrom.TransactionId = createTransaction.Data.Id;
            spendFrom.OutputIndex   = 0;

            // Change the metadata if you want
            //MetaData transferMetadata = new MetaData();
            //metaData.setMetaData("msg", "My second transaction");
            TestMetadata transferMetadata = new TestMetadata();

            transferMetadata.msg = "My second transaction";

            // the asset's ID is equal to the ID of the transaction that created it
            // By default, the 'amount' of a created digital asset == "1". So we spend "1" in our TRANSFER.
            string            amount  = "1";
            BlockchainAccount account = new BlockchainAccount();
            Details           details = null;
            // Use the previous transaction's asset and TRANSFER it
            var build2 = BigchainDbTransactionBuilder <Asset <string>, TestMetadata> .
                         init().
                         addMetaData(metaData).
                         addInput(details, spendFrom, publicKey).
                         addOutput("1", account.Key.PublicKey).
                         addAssets(createTransaction.Data.Id).
                         operation(Operations.TRANSFER).
                         buildAndSignOnly(publicKey, privateKey);

            var transferTransaction = AsyncContext.Run(() => TransactionsApi <Asset <string>, TestMetadata> .sendTransactionAsync(build2));

            if (transferTransaction != null)
            {
                string assetId2 = transferTransaction.Data.Id;
                //"2984ac294290ce6f15124140dad652fc8a306aca62c38237174988dfcf31a3e6"
                var testTran2 = AsyncContext.Run(() => TransactionsApi <object, object> .getTransactionByIdAsync(assetId2));
                Console.WriteLine("Hello assetId: " + assetId2);
            }
            else
            {
                Console.WriteLine("Failed to send transaction");
            }


            Console.ReadKey(true);
        }
示例#5
0
        public async Task testTokensBuildAndTransferPartingTransaction()
        {
            var publicKeyObj  = BlockchainAccount.publicKeyFromHex(publicKey);
            var privateKeyObj = BlockchainAccount.privateKeyFromHex(privateKey);

            int       tokens    = 10000;
            TestToken assetData = new TestToken();

            assetData.token         = "My Token on" + DateTime.Now.Ticks.ToString();
            assetData.number_tokens = tokens;

            TestMetadata metaData = new TestMetadata();

            metaData.msg = "My first transaction";

            // Set up, sign, and send your transaction
            var transaction = BigchainDbTransactionBuilder <TestToken, TestMetadata>
                              .init()
                              .addAssets(assetData)
                              .addMetaData(metaData)
                              .addOutput(tokens.ToString(), publicKeyObj)
                              .operation(Operations.CREATE)
                              .buildAndSignOnly(publicKeyObj, privateKeyObj);

            //.buildAndSign(account.PublicKey, account.PrivateKey);

            //var info = transaction.toHashInput();
            var createTransaction = await TransactionsApi <TestToken, TestMetadata> .sendTransactionAsync(transaction);

            createTransaction.Data.ShouldNotBe(null);
            // the asset's ID is equal to the ID of the transaction that created it
            if (createTransaction.Data != null)
            {
                string testId2   = createTransaction.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(testId2);

                testTran2.ShouldNotBe(null);
            }

            // Describe the output you are fulfilling on the previous transaction
            FulFill spendFrom = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            spendFrom.TransactionId = createTransaction.Data.Id;
            spendFrom.OutputIndex   = 0;


            // we want to transfer 200 tokens.
            int amount = 200;
            //int amountFake = 20000;
            BlockchainAccount account      = new BlockchainAccount();
            Details           details      = null;
            TestToken         transferData = new TestToken();

            assetData.token         = "To my cat";
            assetData.number_tokens = amount;
            int amountLeft = tokens - amount;
            // Use the previous transaction's asset and TRANSFER it
            var build2 = BigchainDbTransactionBuilder <Asset <string>, TestToken> .
                         init().
                         addMetaData(transferData).
                         addInput(details, spendFrom, publicKeyObj).
                         addOutput(amountLeft.ToString(), publicKeyObj).
                         addOutput(amount.ToString(), account.PublicKey).
                         addAssets(createTransaction.Data.Id).
                         operation(Operations.TRANSFER).
                         buildAndSignOnly(publicKeyObj, privateKeyObj);

            var transferTransaction = await TransactionsApi <Asset <string>, TestToken> .sendTransactionAsync(build2);

            transferTransaction.Data.ShouldNotBe(null);

            if (transferTransaction != null)
            {
                string tran2     = transferTransaction.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(tran2);

                testTran2.ShouldNotBe(null);
            }
            var useThisKey = transferTransaction.Data.Outputs[0].PublicKeys[0];
            var compKey    = KeyPairUtils.encodePublicKeyInBase58(publicKeyObj);
            // get unspent outputs
            var list = await OutputsApi.getUnspentOutputsAsync(useThisKey);

            //list.Count.ShouldBe(1);
            // Describe the output you are fulfilling on spent outputs
            FulFill spendFrom2 = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            spendFrom2.TransactionId = transferTransaction.Data.Id; // list[0].TransactionId;
            spendFrom2.OutputIndex   = 0;

            BlockchainAccount dogAccount    = new BlockchainAccount();
            Details           details2      = null;
            TestToken         transferData2 = new TestToken();

            transferData2.token         = "To my dog";
            transferData2.number_tokens = amount;

            amountLeft = amountLeft - amount;
            // Use the previous transaction's asset and TRANSFER it
            var build3 = BigchainDbTransactionBuilder <Asset <string>, TestToken> .
                         init().
                         addMetaData(transferData2).
                         addInput(details2, spendFrom2, publicKeyObj).
                         addOutput(amountLeft.ToString(), publicKeyObj).
                         addOutput(amount.ToString(), dogAccount.PublicKey).
                         addAssets(createTransaction.Data.Id).
                         operation(Operations.TRANSFER).
                         buildAndSignOnly(publicKeyObj, privateKeyObj);

            var transferTransaction3 = await TransactionsApi <Asset <string>, TestToken> .sendTransactionAsync(build3);

            transferTransaction3.Data.ShouldNotBe(null);

            if (transferTransaction3 != null)
            {
                string tran2     = transferTransaction3.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(tran2);

                testTran2.ShouldNotBe(null);
            }

            //// Describe the output you are fulfilling on spent outputs
            //FulFill spendFrom2a = new FulFill();
            //// the asset's ID is equal to the ID of the transaction that created it
            //spendFrom2a.TransactionId = transferTransaction3.Data.Id; // list[0].TransactionId;
            //spendFrom2a.OutputIndex = 0;
            //Details details2a = null;
            //TestToken transferData2a = new TestToken();
            //transferData2a.token = "To my dog named Bingo";
            //transferData2a.number_tokens = amount;

            //// Use the previous transaction's asset and TRANSFER it
            //var build3a = BigchainDbTransactionBuilder<Asset<string>, TestToken>.
            //    init().
            //    addMetaData(transferData2a).
            //    addInput(details2a, spendFrom2a, dogAccount.PublicKey).
            //    addOutput(amountLeft.ToString(), publicKeyObj).
            //    addOutput(amount.ToString(), dogAccount.PublicKey).
            //    addAssets(createTransaction.Data.Id).
            //    operation(Operations.TRANSFER).
            //    buildAndSignOnly(dogAccount.PublicKey, dogAccount.Key);

            //var transferTransaction3a = await TransactionsApi<Asset<string>, TestToken>.sendTransactionAsync(build3a);
            //transferTransaction3.Data.ShouldNotBe(null);

            //if (transferTransaction3 != null)
            //{
            //    string tran2 = transferTransaction3.Data.Id;
            //    var testTran2 = await TransactionsApi<object, object>.getTransactionByIdAsync(tran2);
            //    testTran2.ShouldNotBe(null);

            //}

            // now dog wants to share with puppy
            BlockchainAccount puppyAccount  = new BlockchainAccount();
            Details           details3      = null;
            TestToken         transferData3 = new TestToken();

            transferData3.token = "To my puppy";
            int topuppy = 100;

            transferData3.number_tokens = topuppy;

            FulFill spendFrom3 = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            spendFrom3.TransactionId = transferTransaction3.Data.Id; // list[0].TransactionId;
            spendFrom3.OutputIndex   = 1;

            amountLeft = amount - topuppy;
            // Use the previous transaction's asset and TRANSFER it
            var build4 = BigchainDbTransactionBuilder <Asset <string>, TestToken> .
                         init().
                         addMetaData(transferData3).
                         addInput(details3, spendFrom3, dogAccount.PublicKey).
                         addOutput(amountLeft.ToString(), dogAccount.PublicKey).
                         addOutput(topuppy.ToString(), puppyAccount.PublicKey).
                         addAssets(createTransaction.Data.Id).
                         operation(Operations.TRANSFER).
                         buildAndSignOnly(dogAccount.PublicKey, dogAccount.Key);



            var transferTransaction4 = await TransactionsApi <Asset <string>, TestToken> .sendTransactionAsync(build4);

            if (transferTransaction4.Messsage != null)
            {
                var msg = transferTransaction4.Messsage.Message;
            }

            transferTransaction4.Data.ShouldNotBe(null);

            if (transferTransaction4 != null)
            {
                string tran2     = transferTransaction4.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(tran2);

                testTran2.ShouldNotBe(null);
            }
        }
示例#6
0
        public async Task testBuildAndTransferPartingTransaction()
        {
            var publicKeyObj  = BlockchainAccount.publicKeyFromHex(publicKey);
            var privateKeyObj = BlockchainAccount.privateKeyFromHex(privateKey);

            TestAsset assetData = new TestAsset();

            assetData.msg         = "Hello!";
            assetData.city        = "San Diego";
            assetData.temperature = "74";
            assetData.datetime    = DateTime.Now;

            TestMetadata metaData = new TestMetadata();

            metaData.msg = "My first transaction";

            // Set up, sign, and send your transaction
            var transaction = BigchainDbTransactionBuilder <TestAsset, TestMetadata>
                              .init()
                              .addAssets(assetData)
                              .addMetaData(metaData)
                              .operation(Operations.CREATE)
                              .buildAndSignOnly(publicKeyObj, privateKeyObj);

            //.buildAndSign(account.PublicKey, account.PrivateKey);

            //var info = transaction.toHashInput();
            var createTransaction = await TransactionsApi <TestAsset, TestMetadata> .sendTransactionAsync(transaction);

            createTransaction.Data.ShouldNotBe(null);
            // the asset's ID is equal to the ID of the transaction that created it
            if (createTransaction != null)
            {
                string testId2   = createTransaction.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(testId2);

                testTran2.ShouldNotBe(null);
            }

            // Describe the output you are fulfilling on the previous transaction
            FulFill spendFrom = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            spendFrom.TransactionId = createTransaction.Data.Id;
            spendFrom.OutputIndex   = 0;

            // Change the metadata if you want
            TestMetadata transferMetadata = new TestMetadata();

            transferMetadata.msg = "My second transaction";

            // By default, the 'amount' of a created digital asset == "1". So we spend "1" in our TRANSFER.
            string            amount  = "1";
            BlockchainAccount account = new BlockchainAccount();
            Details           details = null;
            // Use the previous transaction's asset and TRANSFER it
            var build2 = BigchainDbTransactionBuilder <Asset <string>, TestMetadata> .
                         init().
                         addMetaData(transferMetadata).
                         addInput(details, spendFrom, publicKeyObj).
                         addOutput(amount, account.Key.PublicKey).
                         addAssets(createTransaction.Data.Id).
                         operation(Operations.TRANSFER).
                         buildAndSignOnly(publicKeyObj, privateKeyObj);

            var transferTransaction = await TransactionsApi <Asset <string>, TestMetadata> .sendTransactionAsync(build2);

            transferTransaction.Data.ShouldNotBe(null);

            if (transferTransaction != null)
            {
                string tran2     = transferTransaction.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(tran2);

                testTran2.ShouldNotBe(null);
            }
        }
示例#7
0
        public async Task testBuildAndTransferPartingTransaction()
        {
            var publicKeyObj  = BlockchainAccount.publicKeyFromHex(publicKey);
            var privateKeyObj = BlockchainAccount.privateKeyFromHex(privateKey);

            Vehicle car = new Vehicle();

            car.id          = "92832938203903" + DateTime.Now.ToLongDateString();
            car.consumption = "20.9";

            // Set up, sign, and send your transaction
            var transaction = BigchainDbTransactionBuilder <Vehicle, object>
                              .init()
                              .addAssets(car)
                              .operation(Operations.CREATE)
                              .buildAndSignOnly(publicKeyObj, privateKeyObj);

            //.buildAndSign(account.PublicKey, account.PrivateKey);

            //var info = transaction.toHashInput();
            var createTransaction = await TransactionsApi <Vehicle, object> .sendTransactionAsync(transaction);

            createTransaction.Data.ShouldNotBe(null);
            // the asset's ID is equal to the ID of the transaction that created it
            if (createTransaction != null)
            {
                string testId2   = createTransaction.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(testId2);

                testTran2.ShouldNotBe(null);
            }

            // Describe the output you are fulfilling on the previous transaction
            FulFill spendFrom = new FulFill();

            // the asset's ID is equal to the ID of the transaction that created it
            spendFrom.TransactionId = createTransaction.Data.Id;
            spendFrom.OutputIndex   = 0;

            Mileage m = new Mileage();

            m.Amount = "2000";

            // By default, the 'amount' of a created digital asset == "1". So we spend "1" in our TRANSFER.
            string  amount  = "1";
            Details details = null;
            // Use the previous transaction's asset and TRANSFER it
            var build2 = BigchainDbTransactionBuilder <Mileage, object> .
                         init().
                         addInput(details, spendFrom, publicKeyObj).
                         addOutput(amount, publicKeyObj).
                         addAssets(createTransaction.Data.Id).
                         operation(Operations.TRANSFER).
                         buildAndSignOnly(publicKeyObj, privateKeyObj);

            var transferTransaction = await TransactionsApi <Mileage, object> .sendTransactionAsync(build2);

            transferTransaction.Data.ShouldNotBe(null);

            if (transferTransaction != null)
            {
                string tran2     = transferTransaction.Data.Id;
                var    testTran2 = await TransactionsApi <object, object> .getTransactionByIdAsync(tran2);

                testTran2.ShouldNotBe(null);
            }
        }