{"id":2700,"date":"2018-12-17T23:10:19","date_gmt":"2018-12-17T17:40:19","guid":{"rendered":"http:\/\/navveenbalani.dev\/?p=2700"},"modified":"2019-12-18T17:34:07","modified_gmt":"2019-12-18T12:04:07","slug":"building-crowdsourcing-application-using-an-ethereum-platform","status":"publish","type":"post","link":"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/","title":{"rendered":"Building crowdsourcing application using an Ethereum platform"},"content":{"rendered":"\n<p>In this section, we will build a crowdsourcing application using an\nEthereum platform. Our crowdsourcing application has the following\nrequirements;<\/p>\n\n\n\n<ul><li>Register a project that needs funding. The\nminimum funding amount for a project can\u2019t be changed after the initial setup.<\/li><li>Multiple funders should be able to fund the\nproject.<\/li><li>View the status of the funding at any interval.<\/li><li>Update the status of project as it goes through\nthe process of funding.<\/li><li>Funding of the project can be closed explicitly.\nIf the funding is closed explicitly, the funders should get their respective\namount automatically.<\/li><\/ul>\n\n\n\n<p>We will create a smart contract that will implement the above use case\nrequirement. To realize our use case, we will create a local private instance\nof Ethereum, where all functions of the use case will be executed locally.<\/p>\n\n\n\n<h2><a>Setting Ethereum on Local\nEnvironment<\/a><\/h2>\n\n\n\n<p>To set up an Ethereum network on a local environment, you will need to\ndownload one of its implementation. We would go with Go Ethereum.<\/p>\n\n\n\n<p>Go Ethereum is an implementation of Ethereum in Go programming&nbsp; language.&nbsp;\nTo get started, download Go Ethereum a.k.a. Geth for your operating\nsystem from <a href=\"https:\/\/geth.ethereum.org\/downloads\/\">https:\/\/geth.ethereum.org\/downloads\/<\/a>. The current\nversion of Geth at the time of writing this book is 1.7.1. <\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><em>Tip \u2013 If you are\non a MAC, use the following details to quickly install Ethereum using brew.<\/em><\/p>\n\n\n\n<p><em>$ brew tap\nethereum\/ethereum<\/em><\/p>\n\n\n\n<p><em>$ brew install\nethereum <\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>To bootstrap your private Ethereum network, we need to create a\nstarting block or the first block termed as genesis block. A genesis block is\nthe block that contains configuration details of the Ethereum network. The\nfollowing JSON file is a sample custom genesis configuration that you will use\nto bootstrap the Ethereum private network.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"config\": {\n        \"chainId\": 1,\n        \"homesteadBlock\": 0,\n        \"eip155Block\": 0,\n        \"eip158Block\": 0\n    },\n  \"alloc\"      : {},\n  \"coinbase\"   : \"0x0000000000000000000000000000000000000000\",\n  \"difficulty\" : \"0x20000\",\n  \"extraData\"  : \"\",\n  \"gasLimit\"   : \"0x2fefd8\",\n  \"nonce\"      : \"0x0000000000000050\",\n  \"mixhash\"    : \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n  \"parentHash\" : \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n  \"timestamp\"  : \"0x00\"\n}\n<\/code><\/pre>\n\n\n\n<p>The above configuration file named start.json specifies the fields in\nJSON format that sets up the Ethereum network. Some of the significant fields\nare <em>difficulty level<\/em>, <em>gas limit<\/em>, <em>nonce<\/em>, <em>mixhash<\/em> hash\nvalues (used for applying PoW), starting block number (i.e., <em>chainId<\/em>) and so on. You can also\nbootstrap the network with predefined wallet accounts and ether by specifying\nit in the <em>alloc<\/em> field. We will leave\nthe <em>alloc<\/em> field blank for now, as we\nwill focus on creating accounts and mining ethers locally as part of our\napplication. <\/p>\n\n\n\n<p>In the next section we will create the above genesis block and set up\na local Ethereum network. To get started, download the project from the GitHub\nrepository \u2013 https:\/\/github.com\/enterprise-blockchain-book\/first-edition.git.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><em>Note &#8211; <\/em>For more details\non genesis block, refer to https:\/\/github.com\/ethereum\/go-ethereum\/wiki\/Private-network<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3><a>Creating\nGenesis Block<\/a><\/h3>\n\n\n\n<p>As a first step, we will bootstrap a local Ethereum network by\ncreating the genesis block using the above described start.json file. You can\nfollow the below steps:<\/p>\n\n\n\n<ul><li>Open a terminal or command prompt and navigate to\nethereum\/setup folder from the downloaded git project. Run the following\ncommand:<\/li><\/ul>\n\n\n\n<p>geth&nbsp; &#8211;datadir=.\/data init start.json<\/p>\n\n\n\n<p>It will create\nthe genesis block in the data folder. You should see a message at the end\n\u2013\u201cSuccessfully wrote genesis state\u201d<\/p>\n\n\n\n<ul><li>Next execute the following command to start a\nlocal instance of Ethereum using the data folder created in earlier step.<\/li><\/ul>\n\n\n\n<p>geth\n&#8211;networkid 999 &#8211;ipcpath ~\/Library\/Ethereum\/geth.ipc &#8211;rpc &#8211;rpcaddr\n&#8220;127.0.0.1&#8221; &#8211;rpcapi=&#8221;db,eth,net,web3,personal,web3&#8243;\n&#8211;rpcport &#8220;8545&#8221; &#8211;datadir=.\/data&nbsp;\n&#8211;rpccorsdomain &#8220;*&#8221; console<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Note &#8211; For\nwindows, use the same command without the ipcpath.&nbsp; &#8211;<\/p>\n\n\n\n<p>geth\n&#8211;networkid 999 &#8211;rpc &#8211;rpcaddr &#8220;127.0.0.1&#8221;\n&#8211;rpcapi=&#8221;db,eth,net,web3,personal,web3&#8243; &#8211;rpcport &#8220;8545&#8221;\n&#8211;datadir=.\/data&nbsp; &#8211;rpccorsdomain\n&#8220;*&#8221; console<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>The following provides the\ndetails of the above command line options:<\/p>\n\n\n\n<ul><li>networkid \u2013 The\nnetworkid value of 999 signifies a local environment. There are standard\npredefined networkid values from 1 to 5, like 1 for Frontier which connects to\nan actual Etherum network, 3 is for Ropsten which is a Test Ethereum\nnetwork.&nbsp; Any value other than these\npredefined values implies a local instance.<ul><li><em>ipcpath<\/em> \u2013 This is the\nIPC endpoint file. IPC or interprocess communication allows local processes to\ncommunicate with geth using the IPC endpoint.<\/li><\/ul><ul><li><em>rpc<\/em> &#8211; Enable remote procedure call of Geth\nAPIs over HTTP JSON-RPC protocol.<\/li><\/ul><ul><li><em>rpcaddr<\/em> and <em>rpcport<\/em> &#8211;&nbsp; Specify RPC address and RPC port<\/li><\/ul><ul><li><em>rpcapi<\/em> \u2013 List of Geth\nAPIs that would be enabled over RPC port<\/li><\/ul><ul><li><em>datadir<\/em> \u2013 The data\ndirectory for the databases. <\/li><\/ul><ul><li><em>rpccorsdomain &#8211; <\/em>Comma-separated\nlist of domains from which to accept cross-origin requests from the browser. A\nvalue of \u201c*\u201d implies accept a request from all domains. Our web application\nwill use XMLHttpRequest to interact with Ethereum node using RPC protocol.<\/li><\/ul><ul><li>o&nbsp;&nbsp;\n<em>console \u2013<\/em> This would start\nthe geth node instance and open the console.<\/li><\/ul><\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><em>Note &#8211; To view all command line options, kindly\nvisit https:\/\/github.com\/ethereum\/go-ethereum\/wiki\/Command-Line-Options.<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>After you execute\nthe command, you would see the below set of messages being printed on the\nconsole, denoting IPC endpoint and RPC-HTTP location of the Ethereum node,\nalong with the Geth JavaScript console welcome message. Let\u2019s refer to the said\nconsole as \u2018geth console\u2019, and we would reference this later in this chapter.\nYou can also see some modules loaded at the end. We will use one of the module\nweb3 API to invoke certain useful functions.<\/p>\n\n\n\n<p>\u201cINFO\n[08-15|17:55:27] IPC endpoint opened: \/Users\/Navveen\/Library\/Ethereum\/geth.ipc <\/p>\n\n\n\n<p>INFO\n[08-15|17:55:27] HTTP endpoint opened: http:\/\/127.0.0.1:8545 <\/p>\n\n\n\n<p>Welcome to\nthe Geth JavaScript console!<\/p>\n\n\n\n<p>instance:\nGeth\/v1.6.1-stable-021c3c28\/darwin-amd64\/go1.8.3 modules: admin:1.0 debug:1.0\neth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0\u201d<\/p>\n\n\n\n<h3><a>Creating\nMain Account<\/a><\/h3>\n\n\n\n<p>In this section, we would create our first account using geth console.\nFollow the steps below:<\/p>\n\n\n\n<ul><li>On the geth console prompt, let&#8217;s create an\naccount by invoking the web3 API <em>personal.newAccount()\n<\/em>method. You can replace \u2018password\u2019 by the password of your choice..<\/li><\/ul>\n\n\n\n<p>&gt;\nweb3.personal.newAccount(&#8220;password&#8221;)<\/p>\n\n\n\n<p>You will see the following public address and keystore location of the\naccount. The first account is designated as the main account (a.k.a. etherbase)\nby default. This is the default address where the mining reward (i.e., ether)\nwould be credited.<\/p>\n\n\n\n<p>&#8220;0x42d187a0fce3392e853770d360e850f2ea1681bc&#8221;<\/p>\n\n\n\n<p>&gt; INFO\n[08-15|18:00:47] New wallet appeared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url=keystore:\/\/\/Users\/Navveen\/Downlo\u2026\nstatus=Locked<\/p>\n\n\n\n<ul><li>You can view the list of accounts, by using the\nweb3 API method <em>personal.listAccounts()<\/em>\nas shown below<\/li><\/ul>\n\n\n\n<p>&gt;\nweb3.personal.listAccounts<\/p>\n\n\n\n<p>The above method\nwill display the public address of the main account.<\/p>\n\n\n\n<p>[&#8220;0x42d187a0fce3392e853770d360e850f2ea1681bc&#8221;]<\/p>\n\n\n\n<ul><li>Next, you would get the balance associated with\nthe main account as<\/li><\/ul>\n\n\n\n<p>&gt;\nweb3.fromWei(eth.getBalance(eth.coinbase)); <\/p>\n\n\n\n<p>0<\/p>\n\n\n\n<p>The <em>getBalance()<\/em> method returns 0, which is\nas expected as we do yet have any ethers in the account.<\/p>\n\n\n\n<h3><a>Creating\nMiners<\/a><\/h3>\n\n\n\n<p>In this section, we would start mining locally to add ethers to the\nmain account. Follow the steps below:<\/p>\n\n\n\n<ul><li>Open a new terminal or command prompt and type in\nthe following command to connect to existing Ethereum geth node instance over\nIPC port that we had set up earlier. We will provide the path to the existing\nIPC endpoint location to the \u2018geth attach\u2019 command. Upon running the command it\nwill open up the console. Let\u2019s refer to this console as \u2018geth sub-console\u2019; we\nwould reference this later in the chapter.<\/li><\/ul>\n\n\n\n<p>geth\nattach ~\/Library\/Ethereum\/geth.ipc<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Note &#8211; For\nwindows, use the same command without specifying the ipc path as shown below.\nIf you recall earlier while starting the geth instance we did not specify ipc\npath for windows.<\/p>\n\n\n\n<p><strong>geth attach<\/strong><strong><\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>You should see\nthe following message \u2013<\/p>\n\n\n\n<p>instance:\nGeth\/v1.6.1-stable-021c3c28\/darwin-amd64\/go1.8.3<\/p>\n\n\n\n<p>coinbase:\n0x42d187a0fce3392e853770d360e850f2ea1681bc<\/p>\n\n\n\n<p>at block:\n0 (Thu, 01 Jan 1970 05:30:00 IST)<\/p>\n\n\n\n<p>datadir:\n\/Users\/Navveen\/Downloads\/ethereum\/setup\/data<\/p>\n\n\n\n<p>modules:\nadmin:1.0 debug:1.0 eth:1.0 miner:1.0&nbsp;&nbsp;&nbsp;&nbsp;\nnet:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0<\/p>\n\n\n\n<ul><li>On the prompt, enter the following command<\/li><\/ul>\n\n\n\n<p>&gt;\nminer.start(2)<\/p>\n\n\n\n<p>This will start mining on the geth console. On the geth console, you\nshould see the messages \u201ccommitted new block\u201d being printed.&nbsp; The value of 2 signifies the number of\nthreads. It means the command will spawn two threads to perform mining in\nparallel. You can specify any number of threads. Please note that threads are\nexpensive resources and therefore specifying large number of threads will take\nup more system memory.<\/p>\n\n\n\n<p>You can stop the mining after 30 minutes, and you should have enough\nethers in the main account. To stop mining, execute the following command<\/p>\n\n\n\n<p>&gt;\nminer.stop()<\/p>\n\n\n\n<ul><li>Go back to the geth console and type in the\nfollowing to get the balance of the main account.<\/li><\/ul>\n\n\n\n<p>&gt;\nweb3.fromWei(eth.getBalance(eth.coinbase));<\/p>\n\n\n\n<p>You would see\nethers in your account. For the crowdfunding application, we would need around\n2000 ethers. So, make sure you have enough ethers; else you can start the\nmining process again by issuing commands in geth sub-console as described\nearlier.<\/p>\n\n\n\n<p>With the main\naccount setup with enough ether balance, next we will create additional\naccounts using the Ethereum Wallet application. We will also deploy and execute\nour smart contract using the said application.<\/p>\n\n\n\n<h2><a>Installing Ethereum Wallet<\/a><\/h2>\n\n\n\n<p>Ethereum Wallet provides a graphical interface to create and manage\naccounts and execute smart contracts. You can download the Ethereum Wallet for\nyour operating system from the Download section at <a href=\"https:\/\/github.com\/ethereum\/mist\/releases\">https:\/\/github.com\/ethereum\/mist\/releases<\/a><\/p>\n\n\n\n<p>Next, open the Ethereum Wallet, and this should connect to your running local Ethereum instance. You should see a message \u2013 <em>Private NET <\/em>on the application window as shown below. It effectively means the wallet is connected to the running local instance. Click on <em>Launch Application<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"192\" height=\"120\" src=\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2019\/12\/image-47.png\" alt=\"\" class=\"wp-image-2701\"\/><\/figure>\n\n\n\n<p>You should see an <em>Account\nOverview<\/em> screen as shown in the figure below. The Accounts section contains\nthe <em>Main Account<\/em> (<em>etherbase<\/em>) that we created earlier,\nalong with the ether balance that was mined locally. <\/p>\n\n\n\n<h3><a>Creating\nAccounts<\/a><\/h3>\n\n\n\n<p>Next, we would create sample accounts for our crowdsourcing\napplication. We will create total of three accounts, two funder accounts and\none beneficiary account for which the money is being raised. <\/p>\n\n\n\n<p>Earlier we created the main account using the Web3 APIs; this option\nprovides an alternate way to create accounts using the wallet interface.<\/p>\n\n\n\n<p>For creating accounts, click on the <em>Add Account<\/em> link. Enter the password for the account and confirm\nit. Next screen would display the password key files for your account and its\npath. If you plan to use your account on other machines or phones, you can\nsimply import this key files to get access to your account.&nbsp; <\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Note \u2013 A pair of keys, a private key, and a public address defines every account in Ethereum. If you lose the key file, you will lose access to your account. So make sure to backup this key file when running in a production environment. The key file is available in Ethereum node\u2019s data directory. For Mac, this is located at ~\/Library\/Ethereum, for Linux &#8211; ~\/.ethereum and for windows at C:\\Users\\%username%\\%appdata%\\Roaming\\Ethereum.<\/p>\n\n\n\n<p>The key file is a hidden file; so make sure you have enabled the\nappropriate option to view the hidden files.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Click on the newly created account. On the account details page, click on <em>Account 2<\/em> and rename it as <em>Funder1<\/em>. The following figure shows the details of <em>Funder1<\/em> account.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"333\" height=\"222\" src=\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2019\/12\/image-49.png\" alt=\"\" class=\"wp-image-2703\" srcset=\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2019\/12\/image-49.png 333w, https:\/\/navveenbalani.dev\/wp-content\/uploads\/2019\/12\/image-49-300x200.png 300w\" sizes=\"(max-width: 333px) 100vw, 333px\" \/><\/figure>\n\n\n\n<p>Now, click on the <em>copy address<\/em>\nlink located on the right side. A warning window will be displayed as the\naccount is on private network, click <em>copy\nanyway<\/em>.<\/p>\n\n\n\n<p>Next, click on <em>Transfer Ether and Tokens<\/em>. On the <em>Send<\/em> tab, select <em>From<\/em> as the Main Account (Etherbase), and the <em>To<\/em> field should be populated with the address of the <em>Funder1<\/em> account. If not, paste the address that you copied in the earlier step.&nbsp; Enter amount as 1000.&nbsp; If you click on <em>Show More Options, <\/em>you can specify the fee you are willing to pay for executing this transaction in the blockchain network. You can also select a higher fee for faster processing of the transaction. Since this is a private network, drag the fee slider to Faster. The following figure shows the <em>Send<\/em> tab with these details. Click <em>Send.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"216\" height=\"192\" src=\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2019\/12\/image-50.png\" alt=\"\" class=\"wp-image-2704\"\/><\/figure>\n\n\n\n<p>On the <em>Send transaction<\/em> window, specify the account password to confirm the transaction. In this page, you would see the gas price, the estimated consumption fee in ethers from earlier selected option and the maximum fee, which you are willing to pay for the transaction. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"192\" height=\"168\" src=\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2019\/12\/image-53.png\" alt=\"\" class=\"wp-image-2707\"\/><\/figure>\n\n\n\n<p>If you go to <em>Wallets<\/em> tab and scroll down to <em>Latest Transactions <\/em>section, you would see a transaction entry for the above record and confirmation block counts (0 of 12.). To invoke this transaction, the miner needs to be started, as they would execute the transaction and commit the block. Start the miner again in the <em>geth sub-console<\/em> using the command <em>miner.start(2) <\/em>as described earlier&nbsp; and you would see the confirmation block count progressively increasing as shown in the figure below.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"288\" height=\"115\" src=\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2019\/12\/image-52.png\" alt=\"\" class=\"wp-image-2706\"\/><\/figure>\n\n\n\n<p>Once the confirmation count reaches 12 of 12, the block would be added\nto the blockchain. If you click on it, you can view the transaction details and\nblock number mined for this transaction.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><em>Note \u2013 The number\nof confirmations is the number of new blocks (in a sequence) that is appended\nto a block of transaction. The 12 number implies, 12 new blocks were appended\nto the block that contains your transaction. Once the confirmation is reached,\nthe transaction block is committed. The confirmation is required to ensure a\nsecure block is being committed to the blockchain and avoid orphaned blocks.\nThe orphaned block occurs when two miners produce blocks at the same time.\nHowever, some public Ethereum network might require many blocks for\nconfirmation based on their use cases, which implies it might even take hour(s)\nfor a single block to be committed. For more details, refer to this excellent\narticle from <\/em><a href=\"https:\/\/blog.ethereum.org\/author\/vitalik-buterin\/\"><em>Vitalik Buterin<\/em><\/a><em>&nbsp;at\nhttps:\/\/blog.ethereum.org\/2015\/09\/14\/on-slow-and-fast-block-times<\/em><em>\/<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Similarly, create another account called <em>Funder2<\/em> and transfer 500 ethers from <em>Main Account<\/em>. For the beneficiary account, create an account and call it as <em>ProjectAI<\/em>. We will transfer the funds to <em>ProjectAI<\/em> account now using smart contract. Copy the address of <em>ProjectAI<\/em> account, as we would need this later once we deploy the contract. The following image shows the snapshot of all the accounts created so far along with its balance in ethers.<\/p>\n\n\n\n<p>In the <a href=\"https:\/\/navveenbalani.dev\/index.php\/articles\/creating-and-deploying-ethereum-smart-contract\/\">next article<\/a>, we would create the smart contract,<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this section, we will build a crowdsourcing application using an Ethereum platform. Our crowdsourcing application has the following requirements; Register a project that needs funding. The minimum funding amount for a project can\u2019t be changed after the initial setup. Multiple funders should be able to fund the project. View the status of the funding [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2128,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[3,174],"tags":[286],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.0.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building crowdsourcing application using an Ethereum platform - Current and Future Technology Trends by Navveen Balani<\/title>\n<meta name=\"description\" content=\"Building crowdsourcing application using an Ethereum platform - Articles\" \/>\n<link rel=\"canonical\" href=\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building crowdsourcing application using an Ethereum platform - Current and Future Technology Trends by Navveen Balani\" \/>\n<meta property=\"og:description\" content=\"Building crowdsourcing application using an Ethereum platform - Articles\" \/>\n<meta property=\"og:url\" content=\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/\" \/>\n<meta property=\"og:site_name\" content=\"Current and Future Technology Trends by Navveen Balani\" \/>\n<meta property=\"article:published_time\" content=\"2018-12-17T17:40:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-12-18T12:04:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2016\/09\/bk6.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"450\" \/>\n\t<meta property=\"og:image:height\" content=\"374\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\">\n\t<meta name=\"twitter:data1\" content=\"12 minutes\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/navveenbalani.dev\/#website\",\"url\":\"https:\/\/navveenbalani.dev\/\",\"name\":\"Current and Future Technology Trends by Navveen Balani\",\"description\":\"Current and Future Technology Trends by Navveen Balani\",\"publisher\":{\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/navveenbalani.dev\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2016\/09\/bk6.jpg\",\"width\":450,\"height\":374},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/#webpage\",\"url\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/\",\"name\":\"Building crowdsourcing application using an Ethereum platform - Current and Future Technology Trends by Navveen Balani\",\"isPartOf\":{\"@id\":\"https:\/\/navveenbalani.dev\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/#primaryimage\"},\"datePublished\":\"2018-12-17T17:40:19+00:00\",\"dateModified\":\"2019-12-18T12:04:07+00:00\",\"description\":\"Building crowdsourcing application using an Ethereum platform - Articles\",\"breadcrumb\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/navveenbalani.dev\/\",\"url\":\"https:\/\/navveenbalani.dev\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/\",\"url\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/\",\"name\":\"Building crowdsourcing application using an Ethereum platform\"}}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/#webpage\"},\"author\":{\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\"},\"headline\":\"Building crowdsourcing application using an Ethereum platform\",\"datePublished\":\"2018-12-17T17:40:19+00:00\",\"dateModified\":\"2019-12-18T12:04:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/#webpage\"},\"publisher\":{\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\"},\"image\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/building-crowdsourcing-application-using-an-ethereum-platform\/#primaryimage\"},\"keywords\":\"blockchain-guide\",\"articleSection\":\"Articles,Blockchain\",\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\",\"name\":\"Navveen\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/navveenbalani.dev\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2019\/07\/navveen_balani.jpeg\",\"width\":200,\"height\":200,\"caption\":\"Navveen\"},\"logo\":{\"@id\":\"https:\/\/navveenbalani.dev\/#personlogo\"},\"sameAs\":[\"http:\/\/naveenbalani.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts\/2700"}],"collection":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/comments?post=2700"}],"version-history":[{"count":2,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts\/2700\/revisions"}],"predecessor-version":[{"id":2776,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts\/2700\/revisions\/2776"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/media\/2128"}],"wp:attachment":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/media?parent=2700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/categories?post=2700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/tags?post=2700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}