VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS73.32%
Net Worth
13.783USD
STEEM
2.092STEEM
SBD
9.053SBD
Own SP
170.093SP
Detailed Balance
| STEEM | ||
| balance | 2.092STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 170.093SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 0.000SP | SP |
| Effective Power | 170.093SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 9.053SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"balance": "2.092 STEEM",
"savings_balance": "0.000 STEEM",
"reward_steem_balance": "0.000 STEEM",
"vesting_shares": "276978.691793 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "0.000000 VESTS",
"sbd_balance": "9.053 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.000 SBD",
"conversions": []
}Account Info
| name | bornswift |
| id | 159467 |
| rank | 12,319 |
| reputation | 559932099426 |
| created | 2017-05-15T02:15:03 |
| recovery_account | steem |
| proxy | None |
| post_count | 73 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 30 |
| last_post | 2018-07-01T20:46:42 |
| last_root_post | 2018-07-01T20:46:42 |
| last_vote_time | 2018-07-02T23:56:54 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 2.092 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 9.053 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 276978.691793 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 0.000000 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 2017-05-27T21:12:18 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 2020-02-14T08:17:30 |
| savings_sbd_last_interest_payment | 1970-01-01T00:00:00 |
{
"id": 159467,
"name": "bornswift",
"owner": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM6TPLNTM6pzky3aRxJvQEByn6VHxdJzp62jQ6AkPe8wdqz3EAPd",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8GzY2ZZVaND2Fvw9NtzYvh2U2Z5GdpKxuf3hNBmqrVWdAhaPr2",
1
]
]
},
"posting": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM5jY8oq6EBvoHV8A4jwoQnyL9LHpWc2jCBErukRYqJzt3yi9zkS",
1
]
]
},
"memo_key": "STM7BrBFaepFgaLJBY8VSAkSapWAUV6EGh293TDZuqvUQSes3AmW6",
"json_metadata": "{\"profile\":{\"profile_image\":\"http://i.imgur.com/KOJZqsF.jpg\",\"name\":\"Cody\",\"about\":\"computer scientist - traveler - food lover - crypto enthusiast \",\"location\":\"Seattle, WA\"}}",
"posting_json_metadata": "{\"profile\":{\"profile_image\":\"http://i.imgur.com/KOJZqsF.jpg\",\"name\":\"Cody\",\"about\":\"computer scientist - traveler - food lover - crypto enthusiast \",\"location\":\"Seattle, WA\"}}",
"proxy": "",
"last_owner_update": "1970-01-01T00:00:00",
"last_account_update": "2017-05-27T21:12:18",
"created": "2017-05-15T02:15:03",
"mined": false,
"recovery_account": "steem",
"last_account_recovery": "1970-01-01T00:00:00",
"reset_account": "null",
"comment_count": 0,
"lifetime_vote_count": 0,
"post_count": 73,
"can_vote": true,
"voting_manabar": {
"current_mana": "276978691793",
"last_update_time": 1581668250
},
"downvote_manabar": {
"current_mana": "69244672947",
"last_update_time": 1581668250
},
"voting_power": 0,
"balance": "2.092 STEEM",
"savings_balance": "0.000 STEEM",
"sbd_balance": "9.053 SBD",
"sbd_seconds": "0",
"sbd_seconds_last_update": "2020-02-14T08:17:30",
"sbd_last_interest_payment": "2020-02-14T08:17:30",
"savings_sbd_balance": "0.000 SBD",
"savings_sbd_seconds": "0",
"savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
"savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_withdraw_requests": 0,
"reward_sbd_balance": "0.000 SBD",
"reward_steem_balance": "0.000 STEEM",
"reward_vesting_balance": "0.000000 VESTS",
"reward_vesting_steem": "0.000 STEEM",
"vesting_shares": "276978.691793 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "0.000000 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"withdrawn": 0,
"to_withdraw": 0,
"withdraw_routes": 0,
"curation_rewards": 143,
"posting_rewards": 141902,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"witnesses_voted_for": 30,
"last_post": "2018-07-01T20:46:42",
"last_root_post": "2018-07-01T20:46:42",
"last_vote_time": "2018-07-02T23:56:54",
"post_bandwidth": 0,
"pending_claimed_accounts": 0,
"vesting_balance": "0.000 STEEM",
"reputation": "559932099426",
"transfer_history": [],
"market_history": [],
"post_history": [],
"vote_history": [],
"other_history": [],
"witness_votes": [
"actifit",
"aggroed",
"anyx",
"ausbitbank",
"blockbrothers",
"blocktrades",
"cervantes",
"clayop",
"curie",
"drakos",
"emrebeyler",
"good-karma",
"gtg",
"holger80",
"jesta",
"kevinwong",
"lukestokes.mhth",
"ocd-witness",
"riverhead",
"roelandp",
"smooth.witness",
"someguy123",
"steempeak",
"thecryptodrive",
"themarkymark",
"therealwolf",
"timcliff",
"utopian-io",
"wise-team",
"yabapmatt"
],
"tags_usage": [],
"guest_bloggers": [],
"rank": 12319
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
2020/03/05 19:54:03
2020/03/05 19:54:03
| parent author | bornswift |
| parent permlink | data-privacy-and-the-tragedy-of-the-commons |
| author | steemitboard |
| permlink | steemitboard-notify-bornswift-20200305t195403000z |
| title | |
| body | Congratulations @bornswift! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@bornswift/community.png</td><td>Thank you for the witness votes you made to support your Steem community and for keeping the Steem blockchain decentralized</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@bornswift) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=bornswift)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/steemitboard/@steemitboard/use-your-witness-votes-and-get-the-community-badge"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmTugCUsoXX762vg1CuHRrpnPbfnjPogp8iCGv7F2kSVuj/image.png"></a></td><td><a href="https://steemit.com/steemitboard/@steemitboard/use-your-witness-votes-and-get-the-community-badge">Use your witness votes and get the Community Badge</a></td></tr></table> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| Transaction Info | Block #41394653/Trx 5d333f098b82d3f8443350e9e341bfc11b2d742f |
View Raw JSON Data
{
"trx_id": "5d333f098b82d3f8443350e9e341bfc11b2d742f",
"block": 41394653,
"trx_in_block": 7,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-03-05T19:54:03",
"op": [
"comment",
{
"parent_author": "bornswift",
"parent_permlink": "data-privacy-and-the-tragedy-of-the-commons",
"author": "steemitboard",
"permlink": "steemitboard-notify-bornswift-20200305t195403000z",
"title": "",
"body": "Congratulations @bornswift! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@bornswift/community.png</td><td>Thank you for the witness votes you made to support your Steem community and for keeping the Steem blockchain decentralized</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@bornswift) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=bornswift)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/steemitboard/@steemitboard/use-your-witness-votes-and-get-the-community-badge\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmTugCUsoXX762vg1CuHRrpnPbfnjPogp8iCGv7F2kSVuj/image.png\"></a></td><td><a href=\"https://steemit.com/steemitboard/@steemitboard/use-your-witness-votes-and-get-the-community-badge\">Use your witness votes and get the Community Badge</a></td></tr></table>\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
}
]
}2020/02/14 08:21:00
2020/02/14 08:21:00
| account | bornswift |
| witness | drakos |
| approve | true |
| Transaction Info | Block #40806984/Trx 73f08b0ea914ff2dcb2e3699e9d0257c7b3880c5 |
View Raw JSON Data
{
"trx_id": "73f08b0ea914ff2dcb2e3699e9d0257c7b3880c5",
"block": 40806984,
"trx_in_block": 33,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:21:00",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "drakos",
"approve": true
}
]
}bornswiftvoted for witness @cervantes2020/02/14 08:20:48
bornswiftvoted for witness @cervantes
2020/02/14 08:20:48
| account | bornswift |
| witness | cervantes |
| approve | true |
| Transaction Info | Block #40806980/Trx 5eed2a5ebfb2437780e09b119a301f76efa2c366 |
View Raw JSON Data
{
"trx_id": "5eed2a5ebfb2437780e09b119a301f76efa2c366",
"block": 40806980,
"trx_in_block": 16,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:20:48",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "cervantes",
"approve": true
}
]
}bornswiftvoted for witness @lukestokes.mhth2020/02/14 08:20:45
bornswiftvoted for witness @lukestokes.mhth
2020/02/14 08:20:45
| account | bornswift |
| witness | lukestokes.mhth |
| approve | true |
| Transaction Info | Block #40806979/Trx 80bf939b345faac4a3c3c3b05a9786270e2038a5 |
View Raw JSON Data
{
"trx_id": "80bf939b345faac4a3c3c3b05a9786270e2038a5",
"block": 40806979,
"trx_in_block": 13,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:20:45",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "lukestokes.mhth",
"approve": true
}
]
}2020/02/14 08:20:45
2020/02/14 08:20:45
| account | bornswift |
| witness | timcliff |
| approve | true |
| Transaction Info | Block #40806979/Trx 9ea33874e79548158c53387b5ab443cc555bb32a |
View Raw JSON Data
{
"trx_id": "9ea33874e79548158c53387b5ab443cc555bb32a",
"block": 40806979,
"trx_in_block": 4,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:20:45",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "timcliff",
"approve": true
}
]
}2020/02/14 08:20:42
2020/02/14 08:20:42
| account | bornswift |
| witness | jesta |
| approve | true |
| Transaction Info | Block #40806978/Trx a35f557b53c810c174cac74e885b5c6a1724a75e |
View Raw JSON Data
{
"trx_id": "a35f557b53c810c174cac74e885b5c6a1724a75e",
"block": 40806978,
"trx_in_block": 21,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:20:42",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "jesta",
"approve": true
}
]
}2020/02/14 08:20:42
2020/02/14 08:20:42
| account | bornswift |
| witness | actifit |
| approve | true |
| Transaction Info | Block #40806978/Trx 6bc2e444b049a14f7f7a83ac7ec8220965818d09 |
View Raw JSON Data
{
"trx_id": "6bc2e444b049a14f7f7a83ac7ec8220965818d09",
"block": 40806978,
"trx_in_block": 8,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:20:42",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "actifit",
"approve": true
}
]
}2020/02/14 08:20:39
2020/02/14 08:20:39
| account | bornswift |
| witness | curie |
| approve | true |
| Transaction Info | Block #40806977/Trx 890e1d836f3a01dd01c26ac880e4a966c78a1dab |
View Raw JSON Data
{
"trx_id": "890e1d836f3a01dd01c26ac880e4a966c78a1dab",
"block": 40806977,
"trx_in_block": 19,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:20:39",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "curie",
"approve": true
}
]
}bornswiftvoted for witness @therealwolf2020/02/14 08:20:36
bornswiftvoted for witness @therealwolf
2020/02/14 08:20:36
| account | bornswift |
| witness | therealwolf |
| approve | true |
| Transaction Info | Block #40806976/Trx e74cfe3ec9344bb48184ddb9ec0a207b79b175cb |
View Raw JSON Data
{
"trx_id": "e74cfe3ec9344bb48184ddb9ec0a207b79b175cb",
"block": 40806976,
"trx_in_block": 16,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:20:36",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "therealwolf",
"approve": true
}
]
}bornswiftvoted for witness @ocd-witness2020/02/14 08:20:36
bornswiftvoted for witness @ocd-witness
2020/02/14 08:20:36
| account | bornswift |
| witness | ocd-witness |
| approve | true |
| Transaction Info | Block #40806976/Trx 589e02df5084cd743c0d345e0d07c0931cf9d666 |
View Raw JSON Data
{
"trx_id": "589e02df5084cd743c0d345e0d07c0931cf9d666",
"block": 40806976,
"trx_in_block": 8,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:20:36",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "ocd-witness",
"approve": true
}
]
}2020/02/14 08:20:33
2020/02/14 08:20:33
| account | bornswift |
| witness | anyx |
| approve | true |
| Transaction Info | Block #40806975/Trx 02969404d722f9cc83edaeaed34c9b11f6907dba |
View Raw JSON Data
{
"trx_id": "02969404d722f9cc83edaeaed34c9b11f6907dba",
"block": 40806975,
"trx_in_block": 20,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:20:33",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "anyx",
"approve": true
}
]
}bornswiftvoted for witness @emrebeyler2020/02/14 08:20:33
bornswiftvoted for witness @emrebeyler
2020/02/14 08:20:33
| account | bornswift |
| witness | emrebeyler |
| approve | true |
| Transaction Info | Block #40806975/Trx 9bfe30541df1fa7f8c942b871842a9a1eae595e1 |
View Raw JSON Data
{
"trx_id": "9bfe30541df1fa7f8c942b871842a9a1eae595e1",
"block": 40806975,
"trx_in_block": 6,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:20:33",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "emrebeyler",
"approve": true
}
]
}bornswiftvoted for witness @riverhead2020/02/14 08:19:03
bornswiftvoted for witness @riverhead
2020/02/14 08:19:03
| account | bornswift |
| witness | riverhead |
| approve | true |
| Transaction Info | Block #40806945/Trx 37b1d9d22bfeaaa587e498a533559fe4310eebd2 |
View Raw JSON Data
{
"trx_id": "37b1d9d22bfeaaa587e498a533559fe4310eebd2",
"block": 40806945,
"trx_in_block": 5,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:19:03",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "riverhead",
"approve": true
}
]
}bornswiftvoted for witness @blockbrothers2020/02/14 08:19:00
bornswiftvoted for witness @blockbrothers
2020/02/14 08:19:00
| account | bornswift |
| witness | blockbrothers |
| approve | true |
| Transaction Info | Block #40806944/Trx f5a305800cb77e8a6ebb4e500bcdbd9918862163 |
View Raw JSON Data
{
"trx_id": "f5a305800cb77e8a6ebb4e500bcdbd9918862163",
"block": 40806944,
"trx_in_block": 13,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:19:00",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "blockbrothers",
"approve": true
}
]
}bornswiftvoted for witness @wise-team2020/02/14 08:19:00
bornswiftvoted for witness @wise-team
2020/02/14 08:19:00
| account | bornswift |
| witness | wise-team |
| approve | true |
| Transaction Info | Block #40806944/Trx 4352438d04ba865a008794376b51e8ff67e15e26 |
View Raw JSON Data
{
"trx_id": "4352438d04ba865a008794376b51e8ff67e15e26",
"block": 40806944,
"trx_in_block": 2,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:19:00",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "wise-team",
"approve": true
}
]
}bornswiftvoted for witness @kevinwong2020/02/14 08:18:57
bornswiftvoted for witness @kevinwong
2020/02/14 08:18:57
| account | bornswift |
| witness | kevinwong |
| approve | true |
| Transaction Info | Block #40806943/Trx dbaa88b87d65152405c60894776819850bb38e7d |
View Raw JSON Data
{
"trx_id": "dbaa88b87d65152405c60894776819850bb38e7d",
"block": 40806943,
"trx_in_block": 14,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:57",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "kevinwong",
"approve": true
}
]
}bornswiftvoted for witness @utopian-io2020/02/14 08:18:57
bornswiftvoted for witness @utopian-io
2020/02/14 08:18:57
| account | bornswift |
| witness | utopian-io |
| approve | true |
| Transaction Info | Block #40806943/Trx 225cc8ecb5e6c49ff90dfec1b77ef5035cc2baf5 |
View Raw JSON Data
{
"trx_id": "225cc8ecb5e6c49ff90dfec1b77ef5035cc2baf5",
"block": 40806943,
"trx_in_block": 1,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:57",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "utopian-io",
"approve": true
}
]
}2020/02/14 08:18:54
2020/02/14 08:18:54
| account | bornswift |
| witness | holger80 |
| approve | true |
| Transaction Info | Block #40806942/Trx 44742872d324aa333b38190079692cd8bc489c97 |
View Raw JSON Data
{
"trx_id": "44742872d324aa333b38190079692cd8bc489c97",
"block": 40806942,
"trx_in_block": 2,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:54",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "holger80",
"approve": true
}
]
}bornswiftvoted for witness @ausbitbank2020/02/14 08:18:48
bornswiftvoted for witness @ausbitbank
2020/02/14 08:18:48
| account | bornswift |
| witness | ausbitbank |
| approve | true |
| Transaction Info | Block #40806940/Trx 4b6b298481c7172e1309554033cbdef93fc1c0ca |
View Raw JSON Data
{
"trx_id": "4b6b298481c7172e1309554033cbdef93fc1c0ca",
"block": 40806940,
"trx_in_block": 20,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:48",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "ausbitbank",
"approve": true
}
]
}bornswiftvoted for witness @thecryptodrive2020/02/14 08:18:48
bornswiftvoted for witness @thecryptodrive
2020/02/14 08:18:48
| account | bornswift |
| witness | thecryptodrive |
| approve | true |
| Transaction Info | Block #40806940/Trx 812e07c25bfe7c8dea57c88b67177a89477dca0b |
View Raw JSON Data
{
"trx_id": "812e07c25bfe7c8dea57c88b67177a89477dca0b",
"block": 40806940,
"trx_in_block": 1,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:48",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "thecryptodrive",
"approve": true
}
]
}bornswiftvoted for witness @good-karma2020/02/14 08:18:45
bornswiftvoted for witness @good-karma
2020/02/14 08:18:45
| account | bornswift |
| witness | good-karma |
| approve | true |
| Transaction Info | Block #40806939/Trx 218ac40440900d95ccbcbce8b3ddd0fcb79cd73f |
View Raw JSON Data
{
"trx_id": "218ac40440900d95ccbcbce8b3ddd0fcb79cd73f",
"block": 40806939,
"trx_in_block": 6,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:45",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "good-karma",
"approve": true
}
]
}bornswiftvoted for witness @steempeak2020/02/14 08:18:42
bornswiftvoted for witness @steempeak
2020/02/14 08:18:42
| account | bornswift |
| witness | steempeak |
| approve | true |
| Transaction Info | Block #40806938/Trx 631aac0dfc7cfd254477b90b22d91180bb0a123e |
View Raw JSON Data
{
"trx_id": "631aac0dfc7cfd254477b90b22d91180bb0a123e",
"block": 40806938,
"trx_in_block": 11,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:42",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "steempeak",
"approve": true
}
]
}bornswiftvoted for witness @smooth.witness2020/02/14 08:18:42
bornswiftvoted for witness @smooth.witness
2020/02/14 08:18:42
| account | bornswift |
| witness | smooth.witness |
| approve | true |
| Transaction Info | Block #40806938/Trx b0f40429623020cfe5f69d4962b257517a4bc7b4 |
View Raw JSON Data
{
"trx_id": "b0f40429623020cfe5f69d4962b257517a4bc7b4",
"block": 40806938,
"trx_in_block": 4,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:42",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "smooth.witness",
"approve": true
}
]
}2020/02/14 08:18:39
2020/02/14 08:18:39
| account | bornswift |
| witness | clayop |
| approve | true |
| Transaction Info | Block #40806937/Trx 3f3260f9dcb979c7cc325735d9e0e327e0cfe653 |
View Raw JSON Data
{
"trx_id": "3f3260f9dcb979c7cc325735d9e0e327e0cfe653",
"block": 40806937,
"trx_in_block": 1,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:39",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "clayop",
"approve": true
}
]
}2020/02/14 08:18:36
2020/02/14 08:18:36
| account | bornswift |
| witness | aggroed |
| approve | true |
| Transaction Info | Block #40806936/Trx 931c1e91631660175979f68e9e5287d3e058454b |
View Raw JSON Data
{
"trx_id": "931c1e91631660175979f68e9e5287d3e058454b",
"block": 40806936,
"trx_in_block": 1,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:36",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "aggroed",
"approve": true
}
]
}2020/02/14 08:18:33
2020/02/14 08:18:33
| account | bornswift |
| witness | roelandp |
| approve | true |
| Transaction Info | Block #40806935/Trx 4f4c1f579945887e5ca003a3717850a90e252d8f |
View Raw JSON Data
{
"trx_id": "4f4c1f579945887e5ca003a3717850a90e252d8f",
"block": 40806935,
"trx_in_block": 7,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:33",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "roelandp",
"approve": true
}
]
}bornswiftvoted for witness @blocktrades2020/02/14 08:18:30
bornswiftvoted for witness @blocktrades
2020/02/14 08:18:30
| account | bornswift |
| witness | blocktrades |
| approve | true |
| Transaction Info | Block #40806934/Trx 83f2659884c68ba1cc948d506aabbc55682a5b70 |
View Raw JSON Data
{
"trx_id": "83f2659884c68ba1cc948d506aabbc55682a5b70",
"block": 40806934,
"trx_in_block": 16,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:30",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "blocktrades",
"approve": true
}
]
}2020/02/14 08:18:27
2020/02/14 08:18:27
| account | bornswift |
| witness | gtg |
| approve | true |
| Transaction Info | Block #40806933/Trx 597875623d0136b92fa96dc42ad5938f7c1c0759 |
View Raw JSON Data
{
"trx_id": "597875623d0136b92fa96dc42ad5938f7c1c0759",
"block": 40806933,
"trx_in_block": 17,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:27",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "gtg",
"approve": true
}
]
}bornswiftvoted for witness @themarkymark2020/02/14 08:18:24
bornswiftvoted for witness @themarkymark
2020/02/14 08:18:24
| account | bornswift |
| witness | themarkymark |
| approve | true |
| Transaction Info | Block #40806932/Trx 455747ff5391036d5bea71538efaaf5ce6319004 |
View Raw JSON Data
{
"trx_id": "455747ff5391036d5bea71538efaaf5ce6319004",
"block": 40806932,
"trx_in_block": 23,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:24",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "themarkymark",
"approve": true
}
]
}bornswiftvoted for witness @someguy1232020/02/14 08:18:24
bornswiftvoted for witness @someguy123
2020/02/14 08:18:24
| account | bornswift |
| witness | someguy123 |
| approve | true |
| Transaction Info | Block #40806932/Trx 76f4dae36373de809f25a008e02385371208ea5c |
View Raw JSON Data
{
"trx_id": "76f4dae36373de809f25a008e02385371208ea5c",
"block": 40806932,
"trx_in_block": 6,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:24",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "someguy123",
"approve": true
}
]
}bornswiftvoted for witness @yabapmatt2020/02/14 08:18:18
bornswiftvoted for witness @yabapmatt
2020/02/14 08:18:18
| account | bornswift |
| witness | yabapmatt |
| approve | true |
| Transaction Info | Block #40806930/Trx 1b6dae8de95fa6b23f8ee1b75946564cada9ae99 |
View Raw JSON Data
{
"trx_id": "1b6dae8de95fa6b23f8ee1b75946564cada9ae99",
"block": 40806930,
"trx_in_block": 19,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:18:18",
"op": [
"account_witness_vote",
{
"account": "bornswift",
"witness": "yabapmatt",
"approve": true
}
]
}bornswiftclaimed reward balance: 0.010 STEEM, 0.012 SBD, 0.080 SP2020/02/14 08:17:30
bornswiftclaimed reward balance: 0.010 STEEM, 0.012 SBD, 0.080 SP
2020/02/14 08:17:30
| account | bornswift |
| reward steem | 0.010 STEEM |
| reward sbd | 0.012 SBD |
| reward vests | 130.550938 VESTS |
| Transaction Info | Block #40806915/Trx 6a6cfc3daa3f41e6e2eafcb99df1a5fde3bf9cce |
View Raw JSON Data
{
"trx_id": "6a6cfc3daa3f41e6e2eafcb99df1a5fde3bf9cce",
"block": 40806915,
"trx_in_block": 25,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-02-14T08:17:30",
"op": [
"claim_reward_balance",
{
"account": "bornswift",
"reward_steem": "0.010 STEEM",
"reward_sbd": "0.012 SBD",
"reward_vests": "130.550938 VESTS"
}
]
}2019/05/15 03:06:27
2019/05/15 03:06:27
| parent author | bornswift |
| parent permlink | data-privacy-and-the-tragedy-of-the-commons |
| author | steemitboard |
| permlink | steemitboard-notify-bornswift-20190515t030626000z |
| title | |
| body | Congratulations @bornswift! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@bornswift/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@bornswift) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=bornswift)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/japanese/@steemitboard/new-japanese-speaking-community-steem-meetup-badge"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmRWbAjbeETEaqSPLcpwYX1JN5pZhdPffv4q6DaBs6xvZm/image.png"></a></td><td><a href="https://steemit.com/japanese/@steemitboard/new-japanese-speaking-community-steem-meetup-badge">New japanese speaking community Steem Meetup badge</a></td></tr></table> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| Transaction Info | Block #32917690/Trx 9a8e5cf512cea815c14d69a91025c828cd85dcb4 |
View Raw JSON Data
{
"trx_id": "9a8e5cf512cea815c14d69a91025c828cd85dcb4",
"block": 32917690,
"trx_in_block": 3,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2019-05-15T03:06:27",
"op": [
"comment",
{
"parent_author": "bornswift",
"parent_permlink": "data-privacy-and-the-tragedy-of-the-commons",
"author": "steemitboard",
"permlink": "steemitboard-notify-bornswift-20190515t030626000z",
"title": "",
"body": "Congratulations @bornswift! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@bornswift/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@bornswift) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=bornswift)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/japanese/@steemitboard/new-japanese-speaking-community-steem-meetup-badge\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmRWbAjbeETEaqSPLcpwYX1JN5pZhdPffv4q6DaBs6xvZm/image.png\"></a></td><td><a href=\"https://steemit.com/japanese/@steemitboard/new-japanese-speaking-community-steem-meetup-badge\">New japanese speaking community Steem Meetup badge</a></td></tr></table>\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
}
]
}smitopblockchain operation: transfer from savings2018/08/31 18:19:33
smitopblockchain operation: transfer from savings
2018/08/31 18:19:33
| from | smitop |
| request id | 18297 |
| to | bornswift |
| amount | 3.333 SBD |
| memo | Hi, it looks like you're not voting for any witnesses. Witnesses help secure the Steem network. You should vote for some, at https://steemit.com/~witnesses, or by pressing 'Vote for witnesses' in the Steemit sidebar (top right corner). I'm a bot. |
| Transaction Info | Block #25556694/Trx 13d3c85bc3bdeaa4542f3b1a0fb1b2ac5a570a75 |
View Raw JSON Data
{
"trx_id": "13d3c85bc3bdeaa4542f3b1a0fb1b2ac5a570a75",
"block": 25556694,
"trx_in_block": 0,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-08-31T18:19:33",
"op": [
"transfer_from_savings",
{
"from": "smitop",
"request_id": 18297,
"to": "bornswift",
"amount": "3.333 SBD",
"memo": "Hi, it looks like you're not voting for any witnesses. Witnesses help secure the Steem network. You should vote for some, at https://steemit.com/~witnesses, or by pressing 'Vote for witnesses' in the Steemit sidebar (top right corner). I'm a bot."
}
]
}cobramovinupvoted (100.00%) @bornswift / data-privacy-and-the-tragedy-of-the-commons2018/07/08 21:28:57
cobramovinupvoted (100.00%) @bornswift / data-privacy-and-the-tragedy-of-the-commons
2018/07/08 21:28:57
| voter | cobramovin |
| author | bornswift |
| permlink | data-privacy-and-the-tragedy-of-the-commons |
| weight | 10000 (100.00%) |
| Transaction Info | Block #24006466/Trx 33886df5588fe7928292d03490bb7bd8586692d8 |
View Raw JSON Data
{
"trx_id": "33886df5588fe7928292d03490bb7bd8586692d8",
"block": 24006466,
"trx_in_block": 28,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-07-08T21:28:57",
"op": [
"vote",
{
"voter": "cobramovin",
"author": "bornswift",
"permlink": "data-privacy-and-the-tragedy-of-the-commons",
"weight": 10000
}
]
}bornswiftreceived 0.010 STEEM, 0.012 SBD, 0.022 SP author reward for @bornswift / data-privacy-and-the-tragedy-of-the-commons2018/07/08 20:46:42
bornswiftreceived 0.010 STEEM, 0.012 SBD, 0.022 SP author reward for @bornswift / data-privacy-and-the-tragedy-of-the-commons
2018/07/08 20:46:42
| author | bornswift |
| permlink | data-privacy-and-the-tragedy-of-the-commons |
| sbd payout | 0.012 SBD |
| steem payout | 0.010 STEEM |
| vesting payout | 36.526288 VESTS |
| Transaction Info | Block #24005620/Virtual Operation #8 |
View Raw JSON Data
{
"trx_id": "0000000000000000000000000000000000000000",
"block": 24005620,
"trx_in_block": 4294967295,
"op_in_trx": 0,
"virtual_op": 8,
"timestamp": "2018-07-08T20:46:42",
"op": [
"author_reward",
{
"author": "bornswift",
"permlink": "data-privacy-and-the-tragedy-of-the-commons",
"sbd_payout": "0.012 SBD",
"steem_payout": "0.010 STEEM",
"vesting_payout": "36.526288 VESTS"
}
]
}bornswiftreceived 0.001 SP curation reward for @bornswift / data-privacy-and-the-tragedy-of-the-commons2018/07/08 20:46:42
bornswiftreceived 0.001 SP curation reward for @bornswift / data-privacy-and-the-tragedy-of-the-commons
2018/07/08 20:46:42
| curator | bornswift |
| reward | 2.029238 VESTS |
| comment author | bornswift |
| comment permlink | data-privacy-and-the-tragedy-of-the-commons |
| Transaction Info | Block #24005620/Virtual Operation #7 |
View Raw JSON Data
{
"trx_id": "0000000000000000000000000000000000000000",
"block": 24005620,
"trx_in_block": 4294967295,
"op_in_trx": 0,
"virtual_op": 7,
"timestamp": "2018-07-08T20:46:42",
"op": [
"curation_reward",
{
"curator": "bornswift",
"reward": "2.029238 VESTS",
"comment_author": "bornswift",
"comment_permlink": "data-privacy-and-the-tragedy-of-the-commons"
}
]
}bornswiftupvoted (100.00%) @bornswift / data-privacy-and-the-tragedy-of-the-commons2018/07/02 23:56:54
bornswiftupvoted (100.00%) @bornswift / data-privacy-and-the-tragedy-of-the-commons
2018/07/02 23:56:54
| voter | bornswift |
| author | bornswift |
| permlink | data-privacy-and-the-tragedy-of-the-commons |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23846547/Trx 193d00aa7ae153b09ba70801e5b91eaf321a379a |
View Raw JSON Data
{
"trx_id": "193d00aa7ae153b09ba70801e5b91eaf321a379a",
"block": 23846547,
"trx_in_block": 11,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-07-02T23:56:54",
"op": [
"vote",
{
"voter": "bornswift",
"author": "bornswift",
"permlink": "data-privacy-and-the-tragedy-of-the-commons",
"weight": 10000
}
]
}anomalyupvoted (1.00%) @bornswift / data-privacy-and-the-tragedy-of-the-commons2018/07/01 21:18:48
anomalyupvoted (1.00%) @bornswift / data-privacy-and-the-tragedy-of-the-commons
2018/07/01 21:18:48
| voter | anomaly |
| author | bornswift |
| permlink | data-privacy-and-the-tragedy-of-the-commons |
| weight | 100 (1.00%) |
| Transaction Info | Block #23814592/Trx 50844cc6a27bcf7c5ddd3eb34eb297e8f96f6505 |
View Raw JSON Data
{
"trx_id": "50844cc6a27bcf7c5ddd3eb34eb297e8f96f6505",
"block": 23814592,
"trx_in_block": 0,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-07-01T21:18:48",
"op": [
"vote",
{
"voter": "anomaly",
"author": "bornswift",
"permlink": "data-privacy-and-the-tragedy-of-the-commons",
"weight": 100
}
]
}marketstackupvoted (1.49%) @bornswift / data-privacy-and-the-tragedy-of-the-commons2018/07/01 21:15:39
marketstackupvoted (1.49%) @bornswift / data-privacy-and-the-tragedy-of-the-commons
2018/07/01 21:15:39
| voter | marketstack |
| author | bornswift |
| permlink | data-privacy-and-the-tragedy-of-the-commons |
| weight | 149 (1.49%) |
| Transaction Info | Block #23814529/Trx e39f5745fa4ddeda7dbf54bf6179a798c316d3b5 |
View Raw JSON Data
{
"trx_id": "e39f5745fa4ddeda7dbf54bf6179a798c316d3b5",
"block": 23814529,
"trx_in_block": 32,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-07-01T21:15:39",
"op": [
"vote",
{
"voter": "marketstack",
"author": "bornswift",
"permlink": "data-privacy-and-the-tragedy-of-the-commons",
"weight": 149
}
]
}lionindayardupvoted (1.49%) @bornswift / data-privacy-and-the-tragedy-of-the-commons2018/07/01 21:15:39
lionindayardupvoted (1.49%) @bornswift / data-privacy-and-the-tragedy-of-the-commons
2018/07/01 21:15:39
| voter | lionindayard |
| author | bornswift |
| permlink | data-privacy-and-the-tragedy-of-the-commons |
| weight | 149 (1.49%) |
| Transaction Info | Block #23814529/Trx 2fe3f117b704a5d7a44edee47019069d98242d29 |
View Raw JSON Data
{
"trx_id": "2fe3f117b704a5d7a44edee47019069d98242d29",
"block": 23814529,
"trx_in_block": 27,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-07-01T21:15:39",
"op": [
"vote",
{
"voter": "lionindayard",
"author": "bornswift",
"permlink": "data-privacy-and-the-tragedy-of-the-commons",
"weight": 149
}
]
}dick.sledgeupvoted (1.49%) @bornswift / data-privacy-and-the-tragedy-of-the-commons2018/07/01 21:15:36
dick.sledgeupvoted (1.49%) @bornswift / data-privacy-and-the-tragedy-of-the-commons
2018/07/01 21:15:36
| voter | dick.sledge |
| author | bornswift |
| permlink | data-privacy-and-the-tragedy-of-the-commons |
| weight | 149 (1.49%) |
| Transaction Info | Block #23814528/Trx a6070f55891def2460e50ec99e596dc841dff15a |
View Raw JSON Data
{
"trx_id": "a6070f55891def2460e50ec99e596dc841dff15a",
"block": 23814528,
"trx_in_block": 37,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-07-01T21:15:36",
"op": [
"vote",
{
"voter": "dick.sledge",
"author": "bornswift",
"permlink": "data-privacy-and-the-tragedy-of-the-commons",
"weight": 149
}
]
}owlrangeupvoted (100.00%) @bornswift / data-privacy-and-the-tragedy-of-the-commons2018/07/01 21:06:48
owlrangeupvoted (100.00%) @bornswift / data-privacy-and-the-tragedy-of-the-commons
2018/07/01 21:06:48
| voter | owlrange |
| author | bornswift |
| permlink | data-privacy-and-the-tragedy-of-the-commons |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23814352/Trx cbf2654e003488ab23b027f2ba994a83c63cd631 |
View Raw JSON Data
{
"trx_id": "cbf2654e003488ab23b027f2ba994a83c63cd631",
"block": 23814352,
"trx_in_block": 47,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-07-01T21:06:48",
"op": [
"vote",
{
"voter": "owlrange",
"author": "bornswift",
"permlink": "data-privacy-and-the-tragedy-of-the-commons",
"weight": 10000
}
]
}2018/07/01 20:47:24
2018/07/01 20:47:24
| parent author | bornswift |
| parent permlink | data-privacy-and-the-tragedy-of-the-commons |
| author | a-0-0 |
| permlink | re-bornswift-data-privacy-and-the-tragedy-of-the-commons-20180701t204721180z |
| title | |
| body | # # upvote for me please? https://steemit.com/news/@bible.com/6h36cq # |
| json metadata | {"tags":["blockchain"],"links":["https://steemit.com/news/@bible.com/6h36cq"],"app":"steemit/0.1"} |
| Transaction Info | Block #23813964/Trx b2fa906d9afced0b6e6ee63c475117e02debda43 |
View Raw JSON Data
{
"trx_id": "b2fa906d9afced0b6e6ee63c475117e02debda43",
"block": 23813964,
"trx_in_block": 1,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-07-01T20:47:24",
"op": [
"comment",
{
"parent_author": "bornswift",
"parent_permlink": "data-privacy-and-the-tragedy-of-the-commons",
"author": "a-0-0",
"permlink": "re-bornswift-data-privacy-and-the-tragedy-of-the-commons-20180701t204721180z",
"title": "",
"body": "#\n# upvote for me please? https://steemit.com/news/@bible.com/6h36cq\n#",
"json_metadata": "{\"tags\":[\"blockchain\"],\"links\":[\"https://steemit.com/news/@bible.com/6h36cq\"],\"app\":\"steemit/0.1\"}"
}
]
}bornswiftpublished a new post: data-privacy-and-the-tragedy-of-the-commons2018/07/01 20:46:42
bornswiftpublished a new post: data-privacy-and-the-tragedy-of-the-commons
2018/07/01 20:46:42
| parent author | |
| parent permlink | blockchain |
| author | bornswift |
| permlink | data-privacy-and-the-tragedy-of-the-commons |
| title | Data Privacy and the Tragedy of the Commons |
| body |  ### Forced data hygiene GDPR is a recent form of European regulation requiring that companies which collect data from European citizens provide the means for their customers to both view and remove the data that is associated with them. This is a major change for companies and the penalties for non-compliance are harsh: 4% of annual global revenue. Customer data is incredibly valuable for companies as it allows for efficient monetization. However, as we've seen too frequently companies cannot be trusted to safely protect their customers' data (see Home Depot <sup>2014</sup>, Facebook <sup>2014</sup>, Equifax <sup>2017</sup>). ### Something is broken In a free market economy, customer demand will shape the market. This means that if consumers really prefer GDPR-level control over their data, companies would be incentivized to build this into their product and we'd see this feature arise naturally. So why haven't companies provided better data control if consumers really care about their data? The sad truth is that a majority of people don't value their data privacy enough to shape the products we use. If both consumers and corporations aren't interested in protecting data privacy, who exactly is GDPR for? ### Tragedy of the Commons Yesterday, the city of Seattle enacted a ban on plastic straws to help protect the environment. As I sat there drinking my smoothie through a half-soggy paper straw, I realized that GDPR is a similar solution to the _tragedy of the commons_ problem. A _tragedy of the commons_ scenario occurs when a shared resource is exploited for profit to the detriment of all. Certain economic systems have hidden costs that affect more than just the immediate parties involved. In economics, this is called a negative externality. For this reason we see taxes and regulation on consumption of fossil fuels, fishing, and cigarettes as a way to recoup some of those costs and "internalize the externality". The pollution of plastic straws is just another example of the tragedy of the commons. Plastic straws are heavily used because the alternative environmentally-friendly paper straws cost three times more for corporations and plastic straws are preferred by consumers. As a result our oceans have become more polluted; an externality cost that all of us are forced to pay. Consumer privacy is also a scarce resource that suffers from the tragedy of the commons. Driven by advertisement revenue, corporations became increasingly efficient at collecting and using consumer data to shape consumer behavior. In 2016, we saw this data used to manipulate individuals with the goal of influencing political decisions. Cambridge Analytica leveraged the Facebook data of millions of citizens to affect the result of Brexit vote and US presidential election. This lack of data privacy has now begun to impact all of us.  Results of tragedy of the commons ### Possible Solutions Taxation and regulations are the best known solution to the tragedy of the commons problem. These mechanisms work by forcing the parties who are exploiting _the commons_ to compensate the public for the gains they receive through the exploitation. GDPR is a step in this direction. Further regulation may include taxes or penalties for businesses who accept any form of customer privacy data. Critics of this approach state that the impact of externalities are often difficult to quantify and the taxes/penalties don't always go to benefit those who are affected (in some cases those who will be most affected haven't yet been born). The [Decentralized Identity Foundation](http://identity.foundation/) is an effort to help consumers own their identity and private data. With a decentralized identity each individual creates a collection of their personal data that can be shared to businesses on a per-need basis. Businesses in turn can contribute to the identity of their users. This doesn't solve the externality problem, but it provides a viable way for companies to provide meaningful services that doesn't involve collecting and housing consumer data. With this technology, regulators can enact stricter data-custody laws as companies will now have the means to abide by them. Additionally, since the data of each individual is not located in a centralized store, it becomes exponentially more difficult to compromise. As cryptocurrency and blockchain systems experiment with new forms of economics, we've seen the emergence of elegant solutions to the tragedy of the commons. Bitcoin has empirically proven that through carefully balanced incentives a common, open ledger can be shared across the world without abuse or top-down regulation. There's hope that this same technology may hold the key to solving a wide range of externality problems, including data privacy. |
| json metadata | {"tags":["blockchain","privacy","economics","politics","philosophy"],"image":["https://cdn.steemitimages.com/DQmYq2R5hTnRy2f5BCf2JUWtuFC2Fp6sLcLh9kXRTCbiCyv/graphic.png","https://cdn.steemitimages.com/DQmPcbZ7VAq5xBDrnL6HbPsCgvSQaBgp5NxG74PmQPkhP3d/toc.PNG"],"links":["http://identity.foundation/"],"app":"steemit/0.1","format":"markdown"} |
| Transaction Info | Block #23813950/Trx 40bf87337cf7d395c2bb66422530ff7d72b5ee7e |
View Raw JSON Data
{
"trx_id": "40bf87337cf7d395c2bb66422530ff7d72b5ee7e",
"block": 23813950,
"trx_in_block": 9,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-07-01T20:46:42",
"op": [
"comment",
{
"parent_author": "",
"parent_permlink": "blockchain",
"author": "bornswift",
"permlink": "data-privacy-and-the-tragedy-of-the-commons",
"title": "Data Privacy and the Tragedy of the Commons",
"body": "\n### Forced data hygiene \nGDPR is a recent form of European regulation requiring that companies which collect data from European citizens provide the means for their customers to both view and remove the data that is associated with them. This is a major change for companies and the penalties for non-compliance are harsh: 4% of annual global revenue. Customer data is incredibly valuable for companies as it allows for efficient monetization. However, as we've seen too frequently companies cannot be trusted to safely protect their customers' data (see Home Depot <sup>2014</sup>, Facebook <sup>2014</sup>, Equifax <sup>2017</sup>).\n\n### Something is broken\nIn a free market economy, customer demand will shape the market. This means that if consumers really prefer GDPR-level control over their data, companies would be incentivized to build this into their product and we'd see this feature arise naturally. So why haven't companies provided better data control if consumers really care about their data? The sad truth is that a majority of people don't value their data privacy enough to shape the products we use. If both consumers and corporations aren't interested in protecting data privacy, who exactly is GDPR for?\n\n### Tragedy of the Commons\nYesterday, the city of Seattle enacted a ban on plastic straws to help protect the environment. As I sat there drinking my smoothie through a half-soggy paper straw, I realized that GDPR is a similar solution to the _tragedy of the commons_ problem. A _tragedy of the commons_ scenario occurs when a shared resource is exploited for profit to the detriment of all. Certain economic systems have hidden costs that affect more than just the immediate parties involved. In economics, this is called a negative externality. For this reason we see taxes and regulation on consumption of fossil fuels, fishing, and cigarettes as a way to recoup some of those costs and \"internalize the externality\". The pollution of plastic straws is just another example of the tragedy of the commons. Plastic straws are heavily used because the alternative environmentally-friendly paper straws cost three times more for corporations and plastic straws are preferred by consumers. As a result our oceans have become more polluted; an externality cost that all of us are forced to pay. \n\nConsumer privacy is also a scarce resource that suffers from the tragedy of the commons. Driven by advertisement revenue, corporations became increasingly efficient at collecting and using consumer data to shape consumer behavior. In 2016, we saw this data used to manipulate individuals with the goal of influencing political decisions. Cambridge Analytica leveraged the Facebook data of millions of citizens to affect the result of Brexit vote and US presidential election. This lack of data privacy has now begun to impact all of us.\n\n\nResults of tragedy of the commons\n\n### Possible Solutions\nTaxation and regulations are the best known solution to the tragedy of the commons problem. These mechanisms work by forcing the parties who are exploiting _the commons_ to compensate the public for the gains they receive through the exploitation. GDPR is a step in this direction. Further regulation may include taxes or penalties for businesses who accept any form of customer privacy data. Critics of this approach state that the impact of externalities are often difficult to quantify and the taxes/penalties don't always go to benefit those who are affected (in some cases those who will be most affected haven't yet been born).\n\nThe [Decentralized Identity Foundation](http://identity.foundation/) is an effort to help consumers own their identity and private data. With a decentralized identity each individual creates a collection of their personal data that can be shared to businesses on a per-need basis. Businesses in turn can contribute to the identity of their users. This doesn't solve the externality problem, but it provides a viable way for companies to provide meaningful services that doesn't involve collecting and housing consumer data. With this technology, regulators can enact stricter data-custody laws as companies will now have the means to abide by them. Additionally, since the data of each individual is not located in a centralized store, it becomes exponentially more difficult to compromise.\n\nAs cryptocurrency and blockchain systems experiment with new forms of economics, we've seen the emergence of elegant solutions to the tragedy of the commons. Bitcoin has empirically proven that through carefully balanced incentives a common, open ledger can be shared across the world without abuse or top-down regulation. There's hope that this same technology may hold the key to solving a wide range of externality problems, including data privacy.",
"json_metadata": "{\"tags\":[\"blockchain\",\"privacy\",\"economics\",\"politics\",\"philosophy\"],\"image\":[\"https://cdn.steemitimages.com/DQmYq2R5hTnRy2f5BCf2JUWtuFC2Fp6sLcLh9kXRTCbiCyv/graphic.png\",\"https://cdn.steemitimages.com/DQmPcbZ7VAq5xBDrnL6HbPsCgvSQaBgp5NxG74PmQPkhP3d/toc.PNG\"],\"links\":[\"http://identity.foundation/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
}
]
}nathanedgeupvoted (100.00%) @bornswift / using-azure-functions-to-call-ethereum-smart-contract2018/04/17 05:03:03
nathanedgeupvoted (100.00%) @bornswift / using-azure-functions-to-call-ethereum-smart-contract
2018/04/17 05:03:03
| voter | nathanedge |
| author | bornswift |
| permlink | using-azure-functions-to-call-ethereum-smart-contract |
| weight | 10000 (100.00%) |
| Transaction Info | Block #21637170/Trx 18a97dbb00aa69160212541c4791a5735c4af864 |
View Raw JSON Data
{
"trx_id": "18a97dbb00aa69160212541c4791a5735c4af864",
"block": 21637170,
"trx_in_block": 38,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-04-17T05:03:03",
"op": [
"vote",
{
"voter": "nathanedge",
"author": "bornswift",
"permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"weight": 10000
}
]
}bornswiftreceived 0.001 SP curation reward for @cobramovin / re-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z2018/03/04 21:51:21
bornswiftreceived 0.001 SP curation reward for @cobramovin / re-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z
2018/03/04 21:51:21
| curator | bornswift |
| reward | 2.042631 VESTS |
| comment author | cobramovin |
| comment permlink | re-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z |
| Transaction Info | Block #20391603/Virtual Operation #3 |
View Raw JSON Data
{
"trx_id": "0000000000000000000000000000000000000000",
"block": 20391603,
"trx_in_block": 4294967295,
"op_in_trx": 0,
"virtual_op": 3,
"timestamp": "2018-03-04T21:51:21",
"op": [
"curation_reward",
{
"curator": "bornswift",
"reward": "2.042631 VESTS",
"comment_author": "cobramovin",
"comment_permlink": "re-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z"
}
]
}bornswiftreceived 0.014 SP author reward for @bornswift / using-azure-functions-to-call-ethereum-smart-contract2018/03/04 21:47:45
bornswiftreceived 0.014 SP author reward for @bornswift / using-azure-functions-to-call-ethereum-smart-contract
2018/03/04 21:47:45
| author | bornswift |
| permlink | using-azure-functions-to-call-ethereum-smart-contract |
| sbd payout | 0.000 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 22.468946 VESTS |
| Transaction Info | Block #20391531/Virtual Operation #3 |
View Raw JSON Data
{
"trx_id": "0000000000000000000000000000000000000000",
"block": 20391531,
"trx_in_block": 4294967295,
"op_in_trx": 0,
"virtual_op": 3,
"timestamp": "2018-03-04T21:47:45",
"op": [
"author_reward",
{
"author": "bornswift",
"permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"sbd_payout": "0.000 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "22.468946 VESTS"
}
]
}mex-powerupvoted (100.00%) @bornswift / using-azure-functions-to-call-ethereum-smart-contract2018/02/26 08:16:15
mex-powerupvoted (100.00%) @bornswift / using-azure-functions-to-call-ethereum-smart-contract
2018/02/26 08:16:15
| voter | mex-power |
| author | bornswift |
| permlink | using-azure-functions-to-call-ethereum-smart-contract |
| weight | 10000 (100.00%) |
| Transaction Info | Block #20202727/Trx d5d92e21a3c42d020c508a921709d1b12246474d |
View Raw JSON Data
{
"trx_id": "d5d92e21a3c42d020c508a921709d1b12246474d",
"block": 20202727,
"trx_in_block": 43,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-26T08:16:15",
"op": [
"vote",
{
"voter": "mex-power",
"author": "bornswift",
"permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"weight": 10000
}
]
}bornswiftpublished a new post: using-azure-functions-to-call-ethereum-smart-contract2018/02/26 05:41:30
bornswiftpublished a new post: using-azure-functions-to-call-ethereum-smart-contract
2018/02/26 05:41:30
| parent author | |
| parent permlink | blockchain |
| author | bornswift |
| permlink | using-azure-functions-to-call-ethereum-smart-contract |
| title | Using Azure Functions to Call an Ethereum Smart Contract |
| body | @@ -12497,20 +12497,25 @@ aluable -wi th +anks to the abi |
| json metadata | {"tags":["blockchain","azure","mining","ethereum","cryptocurrency"],"image":["https://steemitimages.com/DQmXy51oZxCJKJ1ta1DbSYX4ARbAV2JViXPTfYGnhDBnPWE/image.png","https://steemitimages.com/DQmUGSP2dKFymrK4wWRDy9ZnR2U712rpVb5dUVprWAmJ6g9/infura.PNG","https://steemitimages.com/DQmfCoQ5aKbqR3xqwS9rUXL4njKC4pKophNYcpwihpJnQtC/image.png","https://steemitimages.com/DQmZtDbnDJTFUTEPrY7FSDGiTMGbVkHspEgPQXr7L8yoSS3/image.png"],"links":["https://cryptomonitor.azurewebsites.net/Signup.html","https://azure.microsoft.com/en-us/services/functions","https://steemit.com/bitcoin/@bornswift/coin-watch-bitcoin-arbitrage-tool","https://azure.microsoft.com/en-us/services/functions/","https://infura.io/signup","https://remix.ethereum.org","https://YOUR_AZURE_FUNCTION_NAME.scm.azurewebsites.net/DebugConsole","https://azure.microsoft.com/en-us/services/machine-learning-studio/","https://azure.microsoft.com/en-us/services/iot-hub/","https://azure.microsoft.com/en-us/services/event-hubs/","https://azure.microsoft.com/en-us/services/service-bus/"],"app":"steemit/0.1","format":"markdown"} |
| Transaction Info | Block #20199632/Trx 8b39b55b08056ba7df7dacc7ee504822f41713a1 |
View Raw JSON Data
{
"trx_id": "8b39b55b08056ba7df7dacc7ee504822f41713a1",
"block": 20199632,
"trx_in_block": 5,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-26T05:41:30",
"op": [
"comment",
{
"parent_author": "",
"parent_permlink": "blockchain",
"author": "bornswift",
"permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"title": "Using Azure Functions to Call an Ethereum Smart Contract",
"body": "@@ -12497,20 +12497,25 @@\n aluable \n-wi\n th\n+anks to\n the abi\n",
"json_metadata": "{\"tags\":[\"blockchain\",\"azure\",\"mining\",\"ethereum\",\"cryptocurrency\"],\"image\":[\"https://steemitimages.com/DQmXy51oZxCJKJ1ta1DbSYX4ARbAV2JViXPTfYGnhDBnPWE/image.png\",\"https://steemitimages.com/DQmUGSP2dKFymrK4wWRDy9ZnR2U712rpVb5dUVprWAmJ6g9/infura.PNG\",\"https://steemitimages.com/DQmfCoQ5aKbqR3xqwS9rUXL4njKC4pKophNYcpwihpJnQtC/image.png\",\"https://steemitimages.com/DQmZtDbnDJTFUTEPrY7FSDGiTMGbVkHspEgPQXr7L8yoSS3/image.png\"],\"links\":[\"https://cryptomonitor.azurewebsites.net/Signup.html\",\"https://azure.microsoft.com/en-us/services/functions\",\"https://steemit.com/bitcoin/@bornswift/coin-watch-bitcoin-arbitrage-tool\",\"https://azure.microsoft.com/en-us/services/functions/\",\"https://infura.io/signup\",\"https://remix.ethereum.org\",\"https://YOUR_AZURE_FUNCTION_NAME.scm.azurewebsites.net/DebugConsole\",\"https://azure.microsoft.com/en-us/services/machine-learning-studio/\",\"https://azure.microsoft.com/en-us/services/iot-hub/\",\"https://azure.microsoft.com/en-us/services/event-hubs/\",\"https://azure.microsoft.com/en-us/services/service-bus/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
}
]
}2018/02/26 05:40:39
2018/02/26 05:40:39
| voter | bornswift |
| author | cobramovin |
| permlink | re-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z |
| weight | 10000 (100.00%) |
| Transaction Info | Block #20199615/Trx ee0b160c59617c1c6d45d417699a06ac7ee322aa |
View Raw JSON Data
{
"trx_id": "ee0b160c59617c1c6d45d417699a06ac7ee322aa",
"block": 20199615,
"trx_in_block": 27,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-26T05:40:39",
"op": [
"vote",
{
"voter": "bornswift",
"author": "cobramovin",
"permlink": "re-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z",
"weight": 10000
}
]
}rbornupvoted (100.00%) @bornswift / using-azure-functions-to-call-ethereum-smart-contract2018/02/25 22:15:33
rbornupvoted (100.00%) @bornswift / using-azure-functions-to-call-ethereum-smart-contract
2018/02/25 22:15:33
| voter | rborn |
| author | bornswift |
| permlink | using-azure-functions-to-call-ethereum-smart-contract |
| weight | 10000 (100.00%) |
| Transaction Info | Block #20190720/Trx b990c4997fd435abb83621ee4062c00d3362c40d |
View Raw JSON Data
{
"trx_id": "b990c4997fd435abb83621ee4062c00d3362c40d",
"block": 20190720,
"trx_in_block": 2,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-25T22:15:33",
"op": [
"vote",
{
"voter": "rborn",
"author": "bornswift",
"permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"weight": 10000
}
]
}2018/02/25 21:51:21
2018/02/25 21:51:21
| parent author | bornswift |
| parent permlink | using-azure-functions-to-call-ethereum-smart-contract |
| author | cobramovin |
| permlink | re-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z |
| title | |
| body | Great work!! |
| json metadata | {"tags":["blockchain"],"app":"steemit/0.1"} |
| Transaction Info | Block #20190236/Trx 18ec4917479c27518abe643d269acf1c198438e2 |
View Raw JSON Data
{
"trx_id": "18ec4917479c27518abe643d269acf1c198438e2",
"block": 20190236,
"trx_in_block": 10,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-25T21:51:21",
"op": [
"comment",
{
"parent_author": "bornswift",
"parent_permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"author": "cobramovin",
"permlink": "re-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z",
"title": "",
"body": "Great work!!",
"json_metadata": "{\"tags\":[\"blockchain\"],\"app\":\"steemit/0.1\"}"
}
]
}cobramovinupvoted (100.00%) @bornswift / using-azure-functions-to-call-ethereum-smart-contract2018/02/25 21:50:57
cobramovinupvoted (100.00%) @bornswift / using-azure-functions-to-call-ethereum-smart-contract
2018/02/25 21:50:57
| voter | cobramovin |
| author | bornswift |
| permlink | using-azure-functions-to-call-ethereum-smart-contract |
| weight | 10000 (100.00%) |
| Transaction Info | Block #20190228/Trx 3b67a0be4f081ffa781a8273c539d8631a5bdd23 |
View Raw JSON Data
{
"trx_id": "3b67a0be4f081ffa781a8273c539d8631a5bdd23",
"block": 20190228,
"trx_in_block": 2,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-25T21:50:57",
"op": [
"vote",
{
"voter": "cobramovin",
"author": "bornswift",
"permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"weight": 10000
}
]
}bornswiftpublished a new post: using-azure-functions-to-call-ethereum-smart-contract2018/02/25 21:48:39
bornswiftpublished a new post: using-azure-functions-to-call-ethereum-smart-contract
2018/02/25 21:48:39
| parent author | |
| parent permlink | blockchain |
| author | bornswift |
| permlink | using-azure-functions-to-call-ethereum-smart-contract |
| title | Using Azure Functions to Call an Ethereum Smart Contract |
| body | _A guide to ingest Blockchain data using Azure's serverless infrastructure_ I recently started mining Ether with a friend as a hobby. Occasionally our mining rig would go down for miscellaneous reasons (power outage, network failure, Windows Defender targeting our mining client). While the miner is down, we're losing potential profit. To solve this, I built a miner monitor that will alert me in the case that the hashrate of the rig drops below a certain threshold. This is a common problem for all miners, so I opened it up to the public. To help fund the costs of the monitor, I incorporated a fuel token which gets burnt every time you get alerted. You can replenish your fuel tokens using a smart contract with Ether. ### <center>[Create your own miner monitor here](https://cryptomonitor.azurewebsites.net/Signup.html)</center>  I had a particular problem where I wanted to use Azure Functions to create a cron job to query data from Ethereum and store it in a database. Unfortunately, Azure Functions does not support Ethereum event triggers (yet!) so I had to setup an Azure Function job using a timer. If you're not familiar with [Azure Functions](https://azure.microsoft.com/en-us/services/functions), check out my [previous post to learn more](https://steemit.com/bitcoin/@bornswift/coin-watch-bitcoin-arbitrage-tool). My goal was to update a user's balance if they've made a deposit to a smart contract. Let's walk through how it's done. I'll assume that you've already setup your smart contract and have a basic understanding of [Azure Functions](https://azure.microsoft.com/en-us/services/functions/). ## 1. Create an Account on Infura The first thing we'll want to do is go Infura and create an account:  #### https://infura.io/signup Since we don't want to run a light client in Azure, we'll rely upon an endpoint hosted by Infura to reach the Ethereum network. ## 2. Deploy Smart Contract Collect the Smart Contract deployment address and ABI. [Remix](https://remix.ethereum.org) is a great tool for deploying your smart contract and collecting this information. ## 3. Create Azure Function Create a new Javascript Azure Function with a Storage Output.  This is where we will be storing the results from our blockchain function calls. By creating this output object, we will get the storage connection string passed in as an environment variable. The variable will be named the same as your storage account. Try adding the following snippet to ensure this is setup correctly: ~~~~ module.exports = function (context, myTimer) { context.log(process.env.YOUR_STORAGE_NAME); context.done(); } ~~~~ ## 4. Add NPM Modules We'll need to manually install the `npm` modules to use them within the Azure Functions. - Navigate to the backend of your Azure Function app: https://YOUR_AZURE_FUNCTION_NAME.scm.azurewebsites.net/DebugConsole - Select _Debug Console_ -> _CMD_ - Create a file named _package.json_ in `D:\home\site\wwwroot` directory - Add the following contents to install`azure-storage` and `web3`: ~~~~ { "name": "tableupdatedelete", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "azure-storage": "^2.8.0", "web3": "0.20.5" } } ~~~~ ##### - Run `npm install` in the `D:\home\site\wwwroot` directory  ##### - Verify that the install worked by adding `require` statements at the top of your script and try running it ~~~~ var azure = require('azure-storage'); var Web3 = require("web3") ~~~~ ## 5. Add Your JavaScript The full JavaScript can be found below. I'll break down the various sections. #### Setup Your Smart Contact Test this code snippet by writing out the results to the `context.log`. This code will create your contract JavaScript object and call a function in our smart contract titled `balanceOf`. ~~~~ web3 = new Web3(new Web3.providers.HttpProvider("https://kovan.infura.io/YOUR_INFURA_KEY")) // ABI from Remix var abi = [{ "constant": true, "inputs": [{ "name": "weiAmount", "type": "uint256" }], "name": "weiToToken", "outputs": [{ "name": "tokenAmount", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [{ "name": "tokenAmount", "type": "uint256" }], "name": "tokenToWei", "outputs": [{ "name": "weiAmount", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [{ "name": "_owner", "type": "string" }], "name": "balanceOf", "outputs": [{ "name": "balance", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "TotalFunds", "outputs": [{ "name": "balance", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [{ "name": "priceInWei", "type": "uint256" }], "name": "ChangePrice", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "anonymous": false, "inputs": [{ "indexed": false, "name": "_managementKey", "type": "string" }], "name": "Deposit", "type": "event" }, { "constant": false, "inputs": [], "name": "Withdrawal", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [{ "name": "managementKey", "type": "string" }], "name": "addFuel", "outputs": [], "payable": true, "stateMutability": "payable", "type": "function" }, { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }]; // Replace with your Kovan address contractAddress = "0x3b9...5f4"; var ClientReceipt = web3.eth.contract(abi); contract = ClientReceipt.at(contractAddress); // Call "balanceOf" function in smart contract // pass in string param: managementKey // interpret int256 result using contract.balanceOf(managementKey, function (scError, result) { context.log(result.toNumber()); } ~~~~ #### Query Your Table This snippet will query your table for all entities in a given partition and output some property. In this example, I'm querying the _users_ partition, and writing out the _managementKey_ property. ~~~~ let connectionString = process.env.YOUR_STORAGE_NAME; let tableService = azure.createTableService(connectionString); // I'm querying all rows from the 'users' partition var query = new azure.TableQuery() .where('PartitionKey eq ?', 'users'); tableService.queryEntities('YOUR_TABLE_NAME', query, null, function(queryError, queryResult, response) { if(!queryError) { for (var i = 0; i < queryResult.entries.length; i++) { var user = queryResult.entries[i]; // Log row property "managementKey" context.log(user.managementKey._); } } }); ~~~~ #### Update Your Table Often you'll want to modify some record in the table based on the result from the smart contract function. Here, I'm updating the user's balance and replacing the entity in the table. Since the user object is the same object that we read from the table, it will contain appropriate RowKey, PartitionKey, and ETag. ~~~~ user.accountBalance._ = balance; user.disabled._ = false; // Async call to update record tableService.replaceEntity('YOUR_TABLE_NAME', user, (error, result, response) => { if (!error) { resolve("Successfully updated user balance"); } else { reject("Update record error: " + error); } }); ~~~~ #### Putting it All Together ~~~~ var azure = require('azure-storage'); var Web3 = require("web3") module.exports = function (context, myTimer) { var timeStamp = new Date().toISOString(); if(myTimer.isPastDue) { context.log('JavaScript is running late!'); } context.log('JavaScript timer trigger function ran!', timeStamp); // Setup smart contract web3 = new Web3(new Web3.providers.HttpProvider("https://kovan.infura.io/YOUR_INFURA_KEY")) var abi = [{ "constant": true, "inputs": [{ "name": "weiAmount", "type": "uint256" }], "name": "weiToToken", "outputs": [{ "name": "tokenAmount", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [{ "name": "tokenAmount", "type": "uint256" }], "name": "tokenToWei", "outputs": [{ "name": "weiAmount", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [{ "name": "_owner", "type": "string" }], "name": "balanceOf", "outputs": [{ "name": "balance", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "TotalFunds", "outputs": [{ "name": "balance", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [{ "name": "priceInWei", "type": "uint256" }], "name": "ChangePrice", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "anonymous": false, "inputs": [{ "indexed": false, "name": "_managementKey", "type": "string" }], "name": "Deposit", "type": "event" }, { "constant": false, "inputs": [], "name": "Withdrawal", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [{ "name": "managementKey", "type": "string" }], "name": "addFuel", "outputs": [], "payable": true, "stateMutability": "payable", "type": "function" }, { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }]; // Your Kovan address contractAddress = "0x3b9...05f4"; var ClientReceipt = web3.eth.contract(abi); contract = ClientReceipt.at(contractAddress); let connectionString = process.env.YOUR_STORAGE_NAME; let tableService = azure.createTableService(connectionString); var query = new azure.TableQuery() .where('PartitionKey eq ?', 'users'); tableService.queryEntities('YOUR_TABLE_NAME', query, null, function(queryError, queryResult, response) { if(!queryError) { var blockchainRequests = []; for (var i = 0; i < queryResult.entries.length; i++) { var user = queryResult.entries[i]; blockchainRequests.push(new Promise(function(resolve, reject) { resolve(checkBlockchainForUpdate(context, tableService, user, contract)) })); } // Resolve only once all requests have completed Promise.all(blockchainRequests).then(function(values) { context.log("blockchainRequests: " + values); context.done(); }); } else { context.log("Query error: " + queryError); context.done(); } }); }; function checkBlockchainForUpdate(context, tableService, user, contract){ var managementKey = user.managementKey._; // Async request to Ethereum contract return new Promise(function(resolve, reject) { contract.balanceOf(managementKey, function (scError, result) { if (scError){ reject("BalanceOf error: " + scError); } else { // return the user balance resolve(result.toNumber()); } }); }).then(function(balance) { if (user.accountBalance._ != balance){ return new Promise(function(resolve, reject) { context.log("Updating user's balance\n user:"+managementKey+", old balance:"+user.accountBalance._+", new balance:"+balance); user.accountBalance._ = balance; user.disabled._ = false; // Async call to update record tableService.replaceEntity('YOUR_TABLE_NAME', user, (error, result, response) => { if (!error) { resolve("Successfully updated user balance"); } else { reject("Update record error: " + error); } }); }) } return Promise.resolve(managementKey+": Balance up to date"); }) .then(function(message) { return message; }) .catch((err) => { return 'checkBlockchainForUpdate failed: ' + err; }) } ~~~~ ## Conclusion Although this application is not decentralized, the application is more valuable with the ability to sync state with the blockchain. 100% of my users will have Ether (as miners), thus Ethereum provides a convenient and anonymous way to make small payments. Pulling blockchain data into an Azure Table opens up some really cool integration options: - Anonymous payments (see above example) - [Machine learning and analytics](https://azure.microsoft.com/en-us/services/machine-learning-studio/) on Blockchain data - [IOT integration](https://azure.microsoft.com/en-us/services/iot-hub/) - Event ingestion using [Event Hub](https://azure.microsoft.com/en-us/services/event-hubs/) or [Service Bus](https://azure.microsoft.com/en-us/services/service-bus/) |
| json metadata | {"tags":["blockchain","azure","mining","ethereum","cryptocurrency"],"image":["https://steemitimages.com/DQmXy51oZxCJKJ1ta1DbSYX4ARbAV2JViXPTfYGnhDBnPWE/image.png","https://steemitimages.com/DQmUGSP2dKFymrK4wWRDy9ZnR2U712rpVb5dUVprWAmJ6g9/infura.PNG","https://steemitimages.com/DQmfCoQ5aKbqR3xqwS9rUXL4njKC4pKophNYcpwihpJnQtC/image.png","https://steemitimages.com/DQmZtDbnDJTFUTEPrY7FSDGiTMGbVkHspEgPQXr7L8yoSS3/image.png"],"links":["https://cryptomonitor.azurewebsites.net/Signup.html","https://azure.microsoft.com/en-us/services/functions","https://steemit.com/bitcoin/@bornswift/coin-watch-bitcoin-arbitrage-tool","https://azure.microsoft.com/en-us/services/functions/","https://infura.io/signup","https://remix.ethereum.org","https://YOUR_AZURE_FUNCTION_NAME.scm.azurewebsites.net/DebugConsole","https://azure.microsoft.com/en-us/services/machine-learning-studio/","https://azure.microsoft.com/en-us/services/iot-hub/","https://azure.microsoft.com/en-us/services/event-hubs/","https://azure.microsoft.com/en-us/services/service-bus/"],"app":"steemit/0.1","format":"markdown"} |
| Transaction Info | Block #20190182/Trx 30e12f1387f900b4f38540594b1f63df47beb66a |
View Raw JSON Data
{
"trx_id": "30e12f1387f900b4f38540594b1f63df47beb66a",
"block": 20190182,
"trx_in_block": 16,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-25T21:48:39",
"op": [
"comment",
{
"parent_author": "",
"parent_permlink": "blockchain",
"author": "bornswift",
"permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"title": "Using Azure Functions to Call an Ethereum Smart Contract",
"body": "_A guide to ingest Blockchain data using Azure's serverless infrastructure_\n\nI recently started mining Ether with a friend as a hobby. Occasionally our mining rig would go down for miscellaneous reasons (power outage, network failure, Windows Defender targeting our mining client). While the miner is down, we're losing potential profit. To solve this, I built a miner monitor that will alert me in the case that the hashrate of the rig drops below a certain threshold. This is a common problem for all miners, so I opened it up to the public. To help fund the costs of the monitor, I incorporated a fuel token which gets burnt every time you get alerted. You can replenish your fuel tokens using a smart contract with Ether.\n\n### <center>[Create your own miner monitor here](https://cryptomonitor.azurewebsites.net/Signup.html)</center>\n\n\nI had a particular problem where I wanted to use Azure Functions to create a cron job to query data from Ethereum and store it in a database. Unfortunately, Azure Functions does not support Ethereum event triggers (yet!) so I had to setup an Azure Function job using a timer. If you're not familiar with [Azure Functions](https://azure.microsoft.com/en-us/services/functions), check out my [previous post to learn more](https://steemit.com/bitcoin/@bornswift/coin-watch-bitcoin-arbitrage-tool).\n\nMy goal was to update a user's balance if they've made a deposit to a smart contract. Let's walk through how it's done. I'll assume that you've already setup your smart contract and have a basic understanding of [Azure Functions](https://azure.microsoft.com/en-us/services/functions/). \n\n## 1. Create an Account on Infura\nThe first thing we'll want to do is go Infura and create an account: \n\n#### https://infura.io/signup\nSince we don't want to run a light client in Azure, we'll rely upon an endpoint hosted by Infura to reach the Ethereum network.\n\n## 2. Deploy Smart Contract\nCollect the Smart Contract deployment address and ABI. [Remix](https://remix.ethereum.org) is a great tool for deploying your smart contract and collecting this information.\n\n## 3. Create Azure Function\nCreate a new Javascript Azure Function with a Storage Output. \nThis is where we will be storing the results from our blockchain function calls. By creating this output object, we will get the storage connection string passed in as an environment variable. The variable will be named the same as your storage account. Try adding the following snippet to ensure this is setup correctly:\n~~~~\nmodule.exports = function (context, myTimer) {\n context.log(process.env.YOUR_STORAGE_NAME);\n context.done();\n}\n~~~~\n\n## 4. Add NPM Modules\nWe'll need to manually install the `npm` modules to use them within the Azure Functions. \n- Navigate to the backend of your Azure Function app:\nhttps://YOUR_AZURE_FUNCTION_NAME.scm.azurewebsites.net/DebugConsole\n- Select _Debug Console_ -> _CMD_\n- Create a file named _package.json_ in `D:\\home\\site\\wwwroot` directory\n- Add the following contents to install`azure-storage` and `web3`:\n~~~~\n{\n \"name\": \"tableupdatedelete\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n },\n \"author\": \"\",\n \"license\": \"ISC\",\n \"dependencies\": {\n \"azure-storage\": \"^2.8.0\",\n \"web3\": \"0.20.5\"\n }\n}\n~~~~\n##### \n- Run `npm install` in the `D:\\home\\site\\wwwroot` directory\n\n##### \n- Verify that the install worked by adding `require` statements at the top of your script and try running it\n~~~~\nvar azure = require('azure-storage');\nvar Web3 = require(\"web3\")\n~~~~\n\n## 5. Add Your JavaScript\nThe full JavaScript can be found below. I'll break down the various sections.\n#### Setup Your Smart Contact\nTest this code snippet by writing out the results to the `context.log`. This code will create your contract JavaScript object and call a function in our smart contract titled `balanceOf`.\n~~~~\n web3 = new Web3(new Web3.providers.HttpProvider(\"https://kovan.infura.io/YOUR_INFURA_KEY\"))\n // ABI from Remix\n var abi = [{ \"constant\": true, \"inputs\": [{ \"name\": \"weiAmount\", \"type\": \"uint256\" }], \"name\": \"weiToToken\", \"outputs\": [{ \"name\": \"tokenAmount\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [{ \"name\": \"tokenAmount\", \"type\": \"uint256\" }], \"name\": \"tokenToWei\", \"outputs\": [{ \"name\": \"weiAmount\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [{ \"name\": \"_owner\", \"type\": \"string\" }], \"name\": \"balanceOf\", \"outputs\": [{ \"name\": \"balance\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [], \"name\": \"TotalFunds\", \"outputs\": [{ \"name\": \"balance\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"priceInWei\", \"type\": \"uint256\" }], \"name\": \"ChangePrice\", \"outputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"anonymous\": false, \"inputs\": [{ \"indexed\": false, \"name\": \"_managementKey\", \"type\": \"string\" }], \"name\": \"Deposit\", \"type\": \"event\" }, { \"constant\": false, \"inputs\": [], \"name\": \"Withdrawal\", \"outputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"managementKey\", \"type\": \"string\" }], \"name\": \"addFuel\", \"outputs\": [], \"payable\": true, \"stateMutability\": \"payable\", \"type\": \"function\" }, { \"inputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"constructor\" }];\n // Replace with your Kovan address\n contractAddress = \"0x3b9...5f4\";\n var ClientReceipt = web3.eth.contract(abi);\n contract = ClientReceipt.at(contractAddress);\n // Call \"balanceOf\" function in smart contract\n // pass in string param: managementKey\n // interpret int256 result using\n contract.balanceOf(managementKey, function (scError, result) {\n context.log(result.toNumber());\n } \n~~~~\n#### Query Your Table\nThis snippet will query your table for all entities in a given partition and output some property. In this example, I'm querying the _users_ partition, and writing out the _managementKey_ property.\n~~~~\nlet connectionString = process.env.YOUR_STORAGE_NAME;\nlet tableService = azure.createTableService(connectionString);\n// I'm querying all rows from the 'users' partition\nvar query = new azure.TableQuery()\n.where('PartitionKey eq ?', 'users');\ntableService.queryEntities('YOUR_TABLE_NAME', query, null, function(queryError, queryResult, response) {\n\tif(!queryError) {\n\t\tfor (var i = 0; i < queryResult.entries.length; i++) {\n\t\t\tvar user = queryResult.entries[i];\n\t\t\t// Log row property \"managementKey\"\n\t\t\tcontext.log(user.managementKey._);\n\t\t}\n\t}\n});\n~~~~\n#### Update Your Table\nOften you'll want to modify some record in the table based on the result from the smart contract function. Here, I'm updating the user's balance and replacing the entity in the table. Since the user object is the same object that we read from the table, it will contain appropriate RowKey, PartitionKey, and ETag.\n~~~~\nuser.accountBalance._ = balance;\nuser.disabled._ = false;\n// Async call to update record\ntableService.replaceEntity('YOUR_TABLE_NAME', user, (error, result, response) => {\n\tif (!error) {\n\t\tresolve(\"Successfully updated user balance\");\n\t} \n\telse {\n\t\treject(\"Update record error: \" + error);\n\t}\n});\n~~~~\n\n#### Putting it All Together\n~~~~\nvar azure = require('azure-storage');\nvar Web3 = require(\"web3\")\n\nmodule.exports = function (context, myTimer) {\n var timeStamp = new Date().toISOString();\n \n if(myTimer.isPastDue)\n {\n context.log('JavaScript is running late!');\n }\n context.log('JavaScript timer trigger function ran!', timeStamp); \n \n\t// Setup smart contract\n\tweb3 = new Web3(new Web3.providers.HttpProvider(\"https://kovan.infura.io/YOUR_INFURA_KEY\"))\n\tvar abi = [{ \"constant\": true, \"inputs\": [{ \"name\": \"weiAmount\", \"type\": \"uint256\" }], \"name\": \"weiToToken\", \"outputs\": [{ \"name\": \"tokenAmount\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [{ \"name\": \"tokenAmount\", \"type\": \"uint256\" }], \"name\": \"tokenToWei\", \"outputs\": [{ \"name\": \"weiAmount\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [{ \"name\": \"_owner\", \"type\": \"string\" }], \"name\": \"balanceOf\", \"outputs\": [{ \"name\": \"balance\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [], \"name\": \"TotalFunds\", \"outputs\": [{ \"name\": \"balance\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"priceInWei\", \"type\": \"uint256\" }], \"name\": \"ChangePrice\", \"outputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"anonymous\": false, \"inputs\": [{ \"indexed\": false, \"name\": \"_managementKey\", \"type\": \"string\" }], \"name\": \"Deposit\", \"type\": \"event\" }, { \"constant\": false, \"inputs\": [], \"name\": \"Withdrawal\", \"outputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"managementKey\", \"type\": \"string\" }], \"name\": \"addFuel\", \"outputs\": [], \"payable\": true, \"stateMutability\": \"payable\", \"type\": \"function\" }, { \"inputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"constructor\" }];\n\t// Your Kovan address\n\tcontractAddress = \"0x3b9...05f4\";\n\tvar ClientReceipt = web3.eth.contract(abi);\n\tcontract = ClientReceipt.at(contractAddress);\n\n\tlet connectionString = process.env.YOUR_STORAGE_NAME;\n\tlet tableService = azure.createTableService(connectionString);\n\tvar query = new azure.TableQuery()\n\t.where('PartitionKey eq ?', 'users');\n\ttableService.queryEntities('YOUR_TABLE_NAME', query, null, function(queryError, queryResult, response) {\n\t\tif(!queryError) {\n\t\t\tvar blockchainRequests = [];\n\t\t\tfor (var i = 0; i < queryResult.entries.length; i++) {\n\t\t\t\tvar user = queryResult.entries[i];\n\t\t\t\tblockchainRequests.push(new Promise(function(resolve, reject) { \n\t\t\t\t\tresolve(checkBlockchainForUpdate(context, tableService, user, contract))\n\t\t\t\t}));\n\t\t\t}\n\t\t\t// Resolve only once all requests have completed\n\t\t\tPromise.all(blockchainRequests).then(function(values) {\n\t\t\t context.log(\"blockchainRequests: \" + values);\n\t\t\t context.done();\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tcontext.log(\"Query error: \" + queryError);\n\t\t\tcontext.done();\n\t\t}\n\t});\n};\n\nfunction checkBlockchainForUpdate(context, tableService, user, contract){\n\tvar managementKey = user.managementKey._;\n\t// Async request to Ethereum contract\n\treturn new Promise(function(resolve, reject) {\n\t\tcontract.balanceOf(managementKey, function (scError, result) \n\t\t{ \n\t\t\tif (scError){\n\t\t\t\treject(\"BalanceOf error: \" + scError);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// return the user balance\n\t\t\t\tresolve(result.toNumber());\n\t\t\t}\n\t\t});\n\t}).then(function(balance) {\n\t\tif (user.accountBalance._ != balance){\n\t\t\treturn new Promise(function(resolve, reject) {\n\t\t\t\tcontext.log(\"Updating user's balance\\n user:\"+managementKey+\", old balance:\"+user.accountBalance._+\", new balance:\"+balance);\n\t\t\t\tuser.accountBalance._ = balance;\n\t\t\t\tuser.disabled._ = false;\n\t\t\t\t// Async call to update record\n\t\t\t\ttableService.replaceEntity('YOUR_TABLE_NAME', user, (error, result, response) => {\n\t\t\t\t\tif (!error) {\n\t\t\t\t\t\tresolve(\"Successfully updated user balance\");\n\t\t\t\t\t} \n\t\t\t\t\telse {\n\t\t\t\t\t\treject(\"Update record error: \" + error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t})\n\t\t}\n\t\treturn Promise.resolve(managementKey+\": Balance up to date\");\n\t})\n\t.then(function(message) {\n\t\treturn message;\n\t})\n\t.catch((err) => {\n\t\treturn 'checkBlockchainForUpdate failed: ' + err;\n\t})\n}\n~~~~\n\n## Conclusion\nAlthough this application is not decentralized, the application is more valuable with the ability to sync state with the blockchain. 100% of my users will have Ether (as miners), thus Ethereum provides a convenient and anonymous way to make small payments. Pulling blockchain data into an Azure Table opens up some really cool integration options:\n - Anonymous payments (see above example)\n - [Machine learning and analytics](https://azure.microsoft.com/en-us/services/machine-learning-studio/) on Blockchain data\n - [IOT integration](https://azure.microsoft.com/en-us/services/iot-hub/)\n - Event ingestion using [Event Hub](https://azure.microsoft.com/en-us/services/event-hubs/) or [Service Bus](https://azure.microsoft.com/en-us/services/service-bus/)",
"json_metadata": "{\"tags\":[\"blockchain\",\"azure\",\"mining\",\"ethereum\",\"cryptocurrency\"],\"image\":[\"https://steemitimages.com/DQmXy51oZxCJKJ1ta1DbSYX4ARbAV2JViXPTfYGnhDBnPWE/image.png\",\"https://steemitimages.com/DQmUGSP2dKFymrK4wWRDy9ZnR2U712rpVb5dUVprWAmJ6g9/infura.PNG\",\"https://steemitimages.com/DQmfCoQ5aKbqR3xqwS9rUXL4njKC4pKophNYcpwihpJnQtC/image.png\",\"https://steemitimages.com/DQmZtDbnDJTFUTEPrY7FSDGiTMGbVkHspEgPQXr7L8yoSS3/image.png\"],\"links\":[\"https://cryptomonitor.azurewebsites.net/Signup.html\",\"https://azure.microsoft.com/en-us/services/functions\",\"https://steemit.com/bitcoin/@bornswift/coin-watch-bitcoin-arbitrage-tool\",\"https://azure.microsoft.com/en-us/services/functions/\",\"https://infura.io/signup\",\"https://remix.ethereum.org\",\"https://YOUR_AZURE_FUNCTION_NAME.scm.azurewebsites.net/DebugConsole\",\"https://azure.microsoft.com/en-us/services/machine-learning-studio/\",\"https://azure.microsoft.com/en-us/services/iot-hub/\",\"https://azure.microsoft.com/en-us/services/event-hubs/\",\"https://azure.microsoft.com/en-us/services/service-bus/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
}
]
}bornswiftupvoted (100.00%) @bornswift / using-azure-functions-to-call-ethereum-smart-contract2018/02/25 21:47:45
bornswiftupvoted (100.00%) @bornswift / using-azure-functions-to-call-ethereum-smart-contract
2018/02/25 21:47:45
| voter | bornswift |
| author | bornswift |
| permlink | using-azure-functions-to-call-ethereum-smart-contract |
| weight | 10000 (100.00%) |
| Transaction Info | Block #20190164/Trx 4f58262d13750cdb9bb894e45f2a2b59ca3d5e3a |
View Raw JSON Data
{
"trx_id": "4f58262d13750cdb9bb894e45f2a2b59ca3d5e3a",
"block": 20190164,
"trx_in_block": 8,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-25T21:47:45",
"op": [
"vote",
{
"voter": "bornswift",
"author": "bornswift",
"permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"weight": 10000
}
]
}bornswiftupdated options for using-azure-functions-to-call-ethereum-smart-contract2018/02/25 21:47:45
bornswiftupdated options for using-azure-functions-to-call-ethereum-smart-contract
2018/02/25 21:47:45
| author | bornswift |
| permlink | using-azure-functions-to-call-ethereum-smart-contract |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| allow votes | true |
| allow curation rewards | true |
| extensions | [] |
| Transaction Info | Block #20190164/Trx 4f58262d13750cdb9bb894e45f2a2b59ca3d5e3a |
View Raw JSON Data
{
"trx_id": "4f58262d13750cdb9bb894e45f2a2b59ca3d5e3a",
"block": 20190164,
"trx_in_block": 8,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-25T21:47:45",
"op": [
"comment_options",
{
"author": "bornswift",
"permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"allow_votes": true,
"allow_curation_rewards": true,
"extensions": []
}
]
}bornswiftpublished a new post: using-azure-functions-to-call-ethereum-smart-contract2018/02/25 21:47:45
bornswiftpublished a new post: using-azure-functions-to-call-ethereum-smart-contract
2018/02/25 21:47:45
| parent author | |
| parent permlink | blockchain |
| author | bornswift |
| permlink | using-azure-functions-to-call-ethereum-smart-contract |
| title | Using Azure Functions to Call Ethereum Smart Contract |
| body | _A guide to ingest Blockchain data using Azure's serverless infrastructure_ I recently started mining Ether with a friend as a hobby. Occasionally our mining rig would go down for miscellaneous reasons (power outage, network failure, Windows Defender targeting our mining client). While the miner is down, we're losing potential profit. To solve this, I built a miner monitor that will alert me in the case that the hashrate of the rig drops below a certain threshold. This is a common problem for all miners, so I opened it up to the public. To help fund the costs of the monitor, I incorporated a fuel token which gets burnt every time you get alerted. You can replenish your fuel tokens using a smart contract with Ether. ### <center>[Create your own miner monitor here](https://cryptomonitor.azurewebsites.net/Signup.html)</center>  I had a particular problem where I wanted to use Azure Functions to create a cron job to query data from Ethereum and store it in a database. Unfortunately, Azure Functions does not support Ethereum event triggers (yet!) so I had to setup an Azure Function job using a timer. If you're not familiar with [Azure Functions](https://azure.microsoft.com/en-us/services/functions), check out my [previous post to learn more](https://steemit.com/bitcoin/@bornswift/coin-watch-bitcoin-arbitrage-tool). My goal was to update a user's balance if they've made a deposit to a smart contract. Let's walk through how it's done. I'll assume that you've already setup your smart contract and have a basic understanding of [Azure Functions](https://azure.microsoft.com/en-us/services/functions/). ## 1. Create an Account on Infura The first thing we'll want to do is go Infura and create an account:  #### https://infura.io/signup Since we don't want to run a light client in Azure, we'll rely upon an endpoint hosted by Infura to reach the Ethereum network. ## 2. Deploy Smart Contract Collect the Smart Contract deployment address and ABI. [Remix](https://remix.ethereum.org) is a great tool for deploying your smart contract and collecting this information. ## 3. Create Azure Function Create a new Javascript Azure Function with a Storage Output.  This is where we will be storing the results from our blockchain function calls. By creating this output object, we will get the storage connection string passed in as an environment variable. The variable will be named the same as your storage account. Try adding the following snippet to ensure this is setup correctly: ~~~~ module.exports = function (context, myTimer) { context.log(process.env.YOUR_STORAGE_NAME); context.done(); } ~~~~ ## 4. Add NPM Modules We'll need to manually install the `npm` modules to use them within the Azure Functions. - Navigate to the backend of your Azure Function app: https://YOUR_AZURE_FUNCTION_NAME.scm.azurewebsites.net/DebugConsole - Select _Debug Console_ -> _CMD_ - Create a file named _package.json_ in `D:\home\site\wwwroot` directory - Add the following contents to install`azure-storage` and `web3`: ~~~~ { "name": "tableupdatedelete", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "azure-storage": "^2.8.0", "web3": "0.20.5" } } ~~~~ ##### - Run `npm install` in the `D:\home\site\wwwroot` directory  ##### - Verify that the install worked by adding `require` statements at the top of your script and try running it ~~~~ var azure = require('azure-storage'); var Web3 = require("web3") ~~~~ ## 5. Add Your JavaScript The full JavaScript can be found below. I'll break down the various sections. #### Setup Your Smart Contact Test this code snippet by writing out the results to the `context.log`. This code will create your contract JavaScript object and call a function in our smart contract titled `balanceOf`. ~~~~ web3 = new Web3(new Web3.providers.HttpProvider("https://kovan.infura.io/YOUR_INFURA_KEY")) // ABI from Remix var abi = [{ "constant": true, "inputs": [{ "name": "weiAmount", "type": "uint256" }], "name": "weiToToken", "outputs": [{ "name": "tokenAmount", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [{ "name": "tokenAmount", "type": "uint256" }], "name": "tokenToWei", "outputs": [{ "name": "weiAmount", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [{ "name": "_owner", "type": "string" }], "name": "balanceOf", "outputs": [{ "name": "balance", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "TotalFunds", "outputs": [{ "name": "balance", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [{ "name": "priceInWei", "type": "uint256" }], "name": "ChangePrice", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "anonymous": false, "inputs": [{ "indexed": false, "name": "_managementKey", "type": "string" }], "name": "Deposit", "type": "event" }, { "constant": false, "inputs": [], "name": "Withdrawal", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [{ "name": "managementKey", "type": "string" }], "name": "addFuel", "outputs": [], "payable": true, "stateMutability": "payable", "type": "function" }, { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }]; // Replace with your Kovan address contractAddress = "0x3b9...5f4"; var ClientReceipt = web3.eth.contract(abi); contract = ClientReceipt.at(contractAddress); // Call "balanceOf" function in smart contract // pass in string param: managementKey // interpret int256 result using contract.balanceOf(managementKey, function (scError, result) { context.log(result.toNumber()); } ~~~~ #### Query Your Table This snippet will query your table for all entities in a given partition and output some property. In this example, I'm querying the _users_ partition, and writing out the _managementKey_ property. ~~~~ let connectionString = process.env.YOUR_STORAGE_NAME; let tableService = azure.createTableService(connectionString); // I'm querying all rows from the 'users' partition var query = new azure.TableQuery() .where('PartitionKey eq ?', 'users'); tableService.queryEntities('YOUR_TABLE_NAME', query, null, function(queryError, queryResult, response) { if(!queryError) { for (var i = 0; i < queryResult.entries.length; i++) { var user = queryResult.entries[i]; // Log row property "managementKey" context.log(user.managementKey._); } } }); ~~~~ #### Update Your Table Often you'll want to modify some record in the table based on the result from the smart contract function. Here, I'm updating the user's balance and replacing the entity in the table. Since the user object is the same object that we read from the table, it will contain appropriate RowKey, PartitionKey, and ETag. ~~~~ user.accountBalance._ = balance; user.disabled._ = false; // Async call to update record tableService.replaceEntity('YOUR_TABLE_NAME', user, (error, result, response) => { if (!error) { resolve("Successfully updated user balance"); } else { reject("Update record error: " + error); } }); ~~~~ #### Putting it All Together ~~~~ var azure = require('azure-storage'); var Web3 = require("web3") module.exports = function (context, myTimer) { var timeStamp = new Date().toISOString(); if(myTimer.isPastDue) { context.log('JavaScript is running late!'); } context.log('JavaScript timer trigger function ran!', timeStamp); // Setup smart contract web3 = new Web3(new Web3.providers.HttpProvider("https://kovan.infura.io/YOUR_INFURA_KEY")) var abi = [{ "constant": true, "inputs": [{ "name": "weiAmount", "type": "uint256" }], "name": "weiToToken", "outputs": [{ "name": "tokenAmount", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [{ "name": "tokenAmount", "type": "uint256" }], "name": "tokenToWei", "outputs": [{ "name": "weiAmount", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [{ "name": "_owner", "type": "string" }], "name": "balanceOf", "outputs": [{ "name": "balance", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "TotalFunds", "outputs": [{ "name": "balance", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [{ "name": "priceInWei", "type": "uint256" }], "name": "ChangePrice", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "anonymous": false, "inputs": [{ "indexed": false, "name": "_managementKey", "type": "string" }], "name": "Deposit", "type": "event" }, { "constant": false, "inputs": [], "name": "Withdrawal", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [{ "name": "managementKey", "type": "string" }], "name": "addFuel", "outputs": [], "payable": true, "stateMutability": "payable", "type": "function" }, { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }]; // Your Kovan address contractAddress = "0x3b9...05f4"; var ClientReceipt = web3.eth.contract(abi); contract = ClientReceipt.at(contractAddress); let connectionString = process.env.YOUR_STORAGE_NAME; let tableService = azure.createTableService(connectionString); var query = new azure.TableQuery() .where('PartitionKey eq ?', 'users'); tableService.queryEntities('YOUR_TABLE_NAME', query, null, function(queryError, queryResult, response) { if(!queryError) { var blockchainRequests = []; for (var i = 0; i < queryResult.entries.length; i++) { var user = queryResult.entries[i]; blockchainRequests.push(new Promise(function(resolve, reject) { resolve(checkBlockchainForUpdate(context, tableService, user, contract)) })); } // Resolve only once all requests have completed Promise.all(blockchainRequests).then(function(values) { context.log("blockchainRequests: " + values); context.done(); }); } else { context.log("Query error: " + queryError); context.done(); } }); }; function checkBlockchainForUpdate(context, tableService, user, contract){ var managementKey = user.managementKey._; // Async request to Ethereum contract return new Promise(function(resolve, reject) { contract.balanceOf(managementKey, function (scError, result) { if (scError){ reject("BalanceOf error: " + scError); } else { // return the user balance resolve(result.toNumber()); } }); }).then(function(balance) { if (user.accountBalance._ != balance){ return new Promise(function(resolve, reject) { context.log("Updating user's balance\n user:"+managementKey+", old balance:"+user.accountBalance._+", new balance:"+balance); user.accountBalance._ = balance; user.disabled._ = false; // Async call to update record tableService.replaceEntity('YOUR_TABLE_NAME', user, (error, result, response) => { if (!error) { resolve("Successfully updated user balance"); } else { reject("Update record error: " + error); } }); }) } return Promise.resolve(managementKey+": Balance up to date"); }) .then(function(message) { return message; }) .catch((err) => { return 'checkBlockchainForUpdate failed: ' + err; }) } ~~~~ ## Conclusion Although this application is not decentralized, the application is more valuable with the ability to sync state with the blockchain. 100% of my users will have Ether (as miners), thus Ethereum provides a convenient and anonymous way to make small payments. Pulling blockchain data into an Azure Table opens up some really cool integration options: - Anonymous payments (see above example) - [Machine learning and analytics](https://azure.microsoft.com/en-us/services/machine-learning-studio/) on Blockchain data - [IOT integration](https://azure.microsoft.com/en-us/services/iot-hub/) - Event ingestion using [Event Hub](https://azure.microsoft.com/en-us/services/event-hubs/) or [Service Bus](https://azure.microsoft.com/en-us/services/service-bus/) |
| json metadata | {"tags":["blockchain","azure","mining","ethereum","cryptocurrency"],"image":["https://steemitimages.com/DQmXy51oZxCJKJ1ta1DbSYX4ARbAV2JViXPTfYGnhDBnPWE/image.png","https://steemitimages.com/DQmUGSP2dKFymrK4wWRDy9ZnR2U712rpVb5dUVprWAmJ6g9/infura.PNG","https://steemitimages.com/DQmfCoQ5aKbqR3xqwS9rUXL4njKC4pKophNYcpwihpJnQtC/image.png","https://steemitimages.com/DQmZtDbnDJTFUTEPrY7FSDGiTMGbVkHspEgPQXr7L8yoSS3/image.png"],"links":["https://cryptomonitor.azurewebsites.net/Signup.html","https://azure.microsoft.com/en-us/services/functions","https://steemit.com/bitcoin/@bornswift/coin-watch-bitcoin-arbitrage-tool","https://azure.microsoft.com/en-us/services/functions/","https://infura.io/signup","https://remix.ethereum.org","https://YOUR_AZURE_FUNCTION_NAME.scm.azurewebsites.net/DebugConsole","https://azure.microsoft.com/en-us/services/machine-learning-studio/","https://azure.microsoft.com/en-us/services/iot-hub/","https://azure.microsoft.com/en-us/services/event-hubs/","https://azure.microsoft.com/en-us/services/service-bus/"],"app":"steemit/0.1","format":"markdown"} |
| Transaction Info | Block #20190164/Trx 4f58262d13750cdb9bb894e45f2a2b59ca3d5e3a |
View Raw JSON Data
{
"trx_id": "4f58262d13750cdb9bb894e45f2a2b59ca3d5e3a",
"block": 20190164,
"trx_in_block": 8,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-25T21:47:45",
"op": [
"comment",
{
"parent_author": "",
"parent_permlink": "blockchain",
"author": "bornswift",
"permlink": "using-azure-functions-to-call-ethereum-smart-contract",
"title": "Using Azure Functions to Call Ethereum Smart Contract",
"body": "_A guide to ingest Blockchain data using Azure's serverless infrastructure_\n\nI recently started mining Ether with a friend as a hobby. Occasionally our mining rig would go down for miscellaneous reasons (power outage, network failure, Windows Defender targeting our mining client). While the miner is down, we're losing potential profit. To solve this, I built a miner monitor that will alert me in the case that the hashrate of the rig drops below a certain threshold. This is a common problem for all miners, so I opened it up to the public. To help fund the costs of the monitor, I incorporated a fuel token which gets burnt every time you get alerted. You can replenish your fuel tokens using a smart contract with Ether.\n\n### <center>[Create your own miner monitor here](https://cryptomonitor.azurewebsites.net/Signup.html)</center>\n\n\nI had a particular problem where I wanted to use Azure Functions to create a cron job to query data from Ethereum and store it in a database. Unfortunately, Azure Functions does not support Ethereum event triggers (yet!) so I had to setup an Azure Function job using a timer. If you're not familiar with [Azure Functions](https://azure.microsoft.com/en-us/services/functions), check out my [previous post to learn more](https://steemit.com/bitcoin/@bornswift/coin-watch-bitcoin-arbitrage-tool).\n\nMy goal was to update a user's balance if they've made a deposit to a smart contract. Let's walk through how it's done. I'll assume that you've already setup your smart contract and have a basic understanding of [Azure Functions](https://azure.microsoft.com/en-us/services/functions/). \n\n## 1. Create an Account on Infura\nThe first thing we'll want to do is go Infura and create an account: \n\n#### https://infura.io/signup\nSince we don't want to run a light client in Azure, we'll rely upon an endpoint hosted by Infura to reach the Ethereum network.\n\n## 2. Deploy Smart Contract\nCollect the Smart Contract deployment address and ABI. [Remix](https://remix.ethereum.org) is a great tool for deploying your smart contract and collecting this information.\n\n## 3. Create Azure Function\nCreate a new Javascript Azure Function with a Storage Output. \nThis is where we will be storing the results from our blockchain function calls. By creating this output object, we will get the storage connection string passed in as an environment variable. The variable will be named the same as your storage account. Try adding the following snippet to ensure this is setup correctly:\n~~~~\nmodule.exports = function (context, myTimer) {\n context.log(process.env.YOUR_STORAGE_NAME);\n context.done();\n}\n~~~~\n\n## 4. Add NPM Modules\nWe'll need to manually install the `npm` modules to use them within the Azure Functions. \n- Navigate to the backend of your Azure Function app:\nhttps://YOUR_AZURE_FUNCTION_NAME.scm.azurewebsites.net/DebugConsole\n- Select _Debug Console_ -> _CMD_\n- Create a file named _package.json_ in `D:\\home\\site\\wwwroot` directory\n- Add the following contents to install`azure-storage` and `web3`:\n~~~~\n{\n \"name\": \"tableupdatedelete\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n },\n \"author\": \"\",\n \"license\": \"ISC\",\n \"dependencies\": {\n \"azure-storage\": \"^2.8.0\",\n \"web3\": \"0.20.5\"\n }\n}\n~~~~\n##### \n- Run `npm install` in the `D:\\home\\site\\wwwroot` directory\n\n##### \n- Verify that the install worked by adding `require` statements at the top of your script and try running it\n~~~~\nvar azure = require('azure-storage');\nvar Web3 = require(\"web3\")\n~~~~\n\n## 5. Add Your JavaScript\nThe full JavaScript can be found below. I'll break down the various sections.\n#### Setup Your Smart Contact\nTest this code snippet by writing out the results to the `context.log`. This code will create your contract JavaScript object and call a function in our smart contract titled `balanceOf`.\n~~~~\n web3 = new Web3(new Web3.providers.HttpProvider(\"https://kovan.infura.io/YOUR_INFURA_KEY\"))\n // ABI from Remix\n var abi = [{ \"constant\": true, \"inputs\": [{ \"name\": \"weiAmount\", \"type\": \"uint256\" }], \"name\": \"weiToToken\", \"outputs\": [{ \"name\": \"tokenAmount\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [{ \"name\": \"tokenAmount\", \"type\": \"uint256\" }], \"name\": \"tokenToWei\", \"outputs\": [{ \"name\": \"weiAmount\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [{ \"name\": \"_owner\", \"type\": \"string\" }], \"name\": \"balanceOf\", \"outputs\": [{ \"name\": \"balance\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [], \"name\": \"TotalFunds\", \"outputs\": [{ \"name\": \"balance\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"priceInWei\", \"type\": \"uint256\" }], \"name\": \"ChangePrice\", \"outputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"anonymous\": false, \"inputs\": [{ \"indexed\": false, \"name\": \"_managementKey\", \"type\": \"string\" }], \"name\": \"Deposit\", \"type\": \"event\" }, { \"constant\": false, \"inputs\": [], \"name\": \"Withdrawal\", \"outputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"managementKey\", \"type\": \"string\" }], \"name\": \"addFuel\", \"outputs\": [], \"payable\": true, \"stateMutability\": \"payable\", \"type\": \"function\" }, { \"inputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"constructor\" }];\n // Replace with your Kovan address\n contractAddress = \"0x3b9...5f4\";\n var ClientReceipt = web3.eth.contract(abi);\n contract = ClientReceipt.at(contractAddress);\n // Call \"balanceOf\" function in smart contract\n // pass in string param: managementKey\n // interpret int256 result using\n contract.balanceOf(managementKey, function (scError, result) {\n context.log(result.toNumber());\n } \n~~~~\n#### Query Your Table\nThis snippet will query your table for all entities in a given partition and output some property. In this example, I'm querying the _users_ partition, and writing out the _managementKey_ property.\n~~~~\nlet connectionString = process.env.YOUR_STORAGE_NAME;\nlet tableService = azure.createTableService(connectionString);\n// I'm querying all rows from the 'users' partition\nvar query = new azure.TableQuery()\n.where('PartitionKey eq ?', 'users');\ntableService.queryEntities('YOUR_TABLE_NAME', query, null, function(queryError, queryResult, response) {\n\tif(!queryError) {\n\t\tfor (var i = 0; i < queryResult.entries.length; i++) {\n\t\t\tvar user = queryResult.entries[i];\n\t\t\t// Log row property \"managementKey\"\n\t\t\tcontext.log(user.managementKey._);\n\t\t}\n\t}\n});\n~~~~\n#### Update Your Table\nOften you'll want to modify some record in the table based on the result from the smart contract function. Here, I'm updating the user's balance and replacing the entity in the table. Since the user object is the same object that we read from the table, it will contain appropriate RowKey, PartitionKey, and ETag.\n~~~~\nuser.accountBalance._ = balance;\nuser.disabled._ = false;\n// Async call to update record\ntableService.replaceEntity('YOUR_TABLE_NAME', user, (error, result, response) => {\n\tif (!error) {\n\t\tresolve(\"Successfully updated user balance\");\n\t} \n\telse {\n\t\treject(\"Update record error: \" + error);\n\t}\n});\n~~~~\n\n#### Putting it All Together\n~~~~\nvar azure = require('azure-storage');\nvar Web3 = require(\"web3\")\n\nmodule.exports = function (context, myTimer) {\n var timeStamp = new Date().toISOString();\n \n if(myTimer.isPastDue)\n {\n context.log('JavaScript is running late!');\n }\n context.log('JavaScript timer trigger function ran!', timeStamp); \n \n\t// Setup smart contract\n\tweb3 = new Web3(new Web3.providers.HttpProvider(\"https://kovan.infura.io/YOUR_INFURA_KEY\"))\n\tvar abi = [{ \"constant\": true, \"inputs\": [{ \"name\": \"weiAmount\", \"type\": \"uint256\" }], \"name\": \"weiToToken\", \"outputs\": [{ \"name\": \"tokenAmount\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [{ \"name\": \"tokenAmount\", \"type\": \"uint256\" }], \"name\": \"tokenToWei\", \"outputs\": [{ \"name\": \"weiAmount\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [{ \"name\": \"_owner\", \"type\": \"string\" }], \"name\": \"balanceOf\", \"outputs\": [{ \"name\": \"balance\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": true, \"inputs\": [], \"name\": \"TotalFunds\", \"outputs\": [{ \"name\": \"balance\", \"type\": \"uint256\" }], \"payable\": false, \"stateMutability\": \"view\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"priceInWei\", \"type\": \"uint256\" }], \"name\": \"ChangePrice\", \"outputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"anonymous\": false, \"inputs\": [{ \"indexed\": false, \"name\": \"_managementKey\", \"type\": \"string\" }], \"name\": \"Deposit\", \"type\": \"event\" }, { \"constant\": false, \"inputs\": [], \"name\": \"Withdrawal\", \"outputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"constant\": false, \"inputs\": [{ \"name\": \"managementKey\", \"type\": \"string\" }], \"name\": \"addFuel\", \"outputs\": [], \"payable\": true, \"stateMutability\": \"payable\", \"type\": \"function\" }, { \"inputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"constructor\" }];\n\t// Your Kovan address\n\tcontractAddress = \"0x3b9...05f4\";\n\tvar ClientReceipt = web3.eth.contract(abi);\n\tcontract = ClientReceipt.at(contractAddress);\n\n\tlet connectionString = process.env.YOUR_STORAGE_NAME;\n\tlet tableService = azure.createTableService(connectionString);\n\tvar query = new azure.TableQuery()\n\t.where('PartitionKey eq ?', 'users');\n\ttableService.queryEntities('YOUR_TABLE_NAME', query, null, function(queryError, queryResult, response) {\n\t\tif(!queryError) {\n\t\t\tvar blockchainRequests = [];\n\t\t\tfor (var i = 0; i < queryResult.entries.length; i++) {\n\t\t\t\tvar user = queryResult.entries[i];\n\t\t\t\tblockchainRequests.push(new Promise(function(resolve, reject) { \n\t\t\t\t\tresolve(checkBlockchainForUpdate(context, tableService, user, contract))\n\t\t\t\t}));\n\t\t\t}\n\t\t\t// Resolve only once all requests have completed\n\t\t\tPromise.all(blockchainRequests).then(function(values) {\n\t\t\t context.log(\"blockchainRequests: \" + values);\n\t\t\t context.done();\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tcontext.log(\"Query error: \" + queryError);\n\t\t\tcontext.done();\n\t\t}\n\t});\n};\n\nfunction checkBlockchainForUpdate(context, tableService, user, contract){\n\tvar managementKey = user.managementKey._;\n\t// Async request to Ethereum contract\n\treturn new Promise(function(resolve, reject) {\n\t\tcontract.balanceOf(managementKey, function (scError, result) \n\t\t{ \n\t\t\tif (scError){\n\t\t\t\treject(\"BalanceOf error: \" + scError);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// return the user balance\n\t\t\t\tresolve(result.toNumber());\n\t\t\t}\n\t\t});\n\t}).then(function(balance) {\n\t\tif (user.accountBalance._ != balance){\n\t\t\treturn new Promise(function(resolve, reject) {\n\t\t\t\tcontext.log(\"Updating user's balance\\n user:\"+managementKey+\", old balance:\"+user.accountBalance._+\", new balance:\"+balance);\n\t\t\t\tuser.accountBalance._ = balance;\n\t\t\t\tuser.disabled._ = false;\n\t\t\t\t// Async call to update record\n\t\t\t\ttableService.replaceEntity('YOUR_TABLE_NAME', user, (error, result, response) => {\n\t\t\t\t\tif (!error) {\n\t\t\t\t\t\tresolve(\"Successfully updated user balance\");\n\t\t\t\t\t} \n\t\t\t\t\telse {\n\t\t\t\t\t\treject(\"Update record error: \" + error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t})\n\t\t}\n\t\treturn Promise.resolve(managementKey+\": Balance up to date\");\n\t})\n\t.then(function(message) {\n\t\treturn message;\n\t})\n\t.catch((err) => {\n\t\treturn 'checkBlockchainForUpdate failed: ' + err;\n\t})\n}\n~~~~\n\n## Conclusion\nAlthough this application is not decentralized, the application is more valuable with the ability to sync state with the blockchain. 100% of my users will have Ether (as miners), thus Ethereum provides a convenient and anonymous way to make small payments. Pulling blockchain data into an Azure Table opens up some really cool integration options:\n - Anonymous payments (see above example)\n - [Machine learning and analytics](https://azure.microsoft.com/en-us/services/machine-learning-studio/) on Blockchain data\n - [IOT integration](https://azure.microsoft.com/en-us/services/iot-hub/)\n - Event ingestion using [Event Hub](https://azure.microsoft.com/en-us/services/event-hubs/) or [Service Bus](https://azure.microsoft.com/en-us/services/service-bus/)",
"json_metadata": "{\"tags\":[\"blockchain\",\"azure\",\"mining\",\"ethereum\",\"cryptocurrency\"],\"image\":[\"https://steemitimages.com/DQmXy51oZxCJKJ1ta1DbSYX4ARbAV2JViXPTfYGnhDBnPWE/image.png\",\"https://steemitimages.com/DQmUGSP2dKFymrK4wWRDy9ZnR2U712rpVb5dUVprWAmJ6g9/infura.PNG\",\"https://steemitimages.com/DQmfCoQ5aKbqR3xqwS9rUXL4njKC4pKophNYcpwihpJnQtC/image.png\",\"https://steemitimages.com/DQmZtDbnDJTFUTEPrY7FSDGiTMGbVkHspEgPQXr7L8yoSS3/image.png\"],\"links\":[\"https://cryptomonitor.azurewebsites.net/Signup.html\",\"https://azure.microsoft.com/en-us/services/functions\",\"https://steemit.com/bitcoin/@bornswift/coin-watch-bitcoin-arbitrage-tool\",\"https://azure.microsoft.com/en-us/services/functions/\",\"https://infura.io/signup\",\"https://remix.ethereum.org\",\"https://YOUR_AZURE_FUNCTION_NAME.scm.azurewebsites.net/DebugConsole\",\"https://azure.microsoft.com/en-us/services/machine-learning-studio/\",\"https://azure.microsoft.com/en-us/services/iot-hub/\",\"https://azure.microsoft.com/en-us/services/event-hubs/\",\"https://azure.microsoft.com/en-us/services/service-bus/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
}
]
}bornswiftreceived 0.014 SP author reward for @bornswift / the-double-spend-problem2018/02/11 18:49:09
bornswiftreceived 0.014 SP author reward for @bornswift / the-double-spend-problem
2018/02/11 18:49:09
| author | bornswift |
| permlink | the-double-spend-problem |
| sbd payout | 0.000 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 22.493975 VESTS |
| Transaction Info | Block #19783602/Virtual Operation #36 |
View Raw JSON Data
{
"trx_id": "0000000000000000000000000000000000000000",
"block": 19783602,
"trx_in_block": 4294967295,
"op_in_trx": 0,
"virtual_op": 36,
"timestamp": "2018-02-11T18:49:09",
"op": [
"author_reward",
{
"author": "bornswift",
"permlink": "the-double-spend-problem",
"sbd_payout": "0.000 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "22.493975 VESTS"
}
]
}bornswiftreceived 0.016 SP author reward for @bornswift / what-s-backing-cryptocurrency2018/02/10 23:10:21
bornswiftreceived 0.016 SP author reward for @bornswift / what-s-backing-cryptocurrency
2018/02/10 23:10:21
| author | bornswift |
| permlink | what-s-backing-cryptocurrency |
| sbd payout | 0.000 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 26.584908 VESTS |
| Transaction Info | Block #19760045/Virtual Operation #53 |
View Raw JSON Data
{
"trx_id": "0000000000000000000000000000000000000000",
"block": 19760045,
"trx_in_block": 4294967295,
"op_in_trx": 0,
"virtual_op": 53,
"timestamp": "2018-02-10T23:10:21",
"op": [
"author_reward",
{
"author": "bornswift",
"permlink": "what-s-backing-cryptocurrency",
"sbd_payout": "0.000 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "26.584908 VESTS"
}
]
}bornswiftreceived 0.011 SP author reward for @bornswift / welcome-to-the-revolution2018/02/10 22:46:21
bornswiftreceived 0.011 SP author reward for @bornswift / welcome-to-the-revolution
2018/02/10 22:46:21
| author | bornswift |
| permlink | welcome-to-the-revolution |
| sbd payout | 0.000 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 18.404952 VESTS |
| Transaction Info | Block #19759565/Virtual Operation #13 |
View Raw JSON Data
{
"trx_id": "0000000000000000000000000000000000000000",
"block": 19759565,
"trx_in_block": 4294967295,
"op_in_trx": 0,
"virtual_op": 13,
"timestamp": "2018-02-10T22:46:21",
"op": [
"author_reward",
{
"author": "bornswift",
"permlink": "welcome-to-the-revolution",
"sbd_payout": "0.000 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "18.404952 VESTS"
}
]
}rbornupvoted (100.00%) @bornswift / the-double-spend-problem2018/02/04 20:45:21
rbornupvoted (100.00%) @bornswift / the-double-spend-problem
2018/02/04 20:45:21
| voter | rborn |
| author | bornswift |
| permlink | the-double-spend-problem |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19584663/Trx 82e7cf7b4e2454900827e4e102dfb1c9c6ea57cb |
View Raw JSON Data
{
"trx_id": "82e7cf7b4e2454900827e4e102dfb1c9c6ea57cb",
"block": 19584663,
"trx_in_block": 16,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-04T20:45:21",
"op": [
"vote",
{
"voter": "rborn",
"author": "bornswift",
"permlink": "the-double-spend-problem",
"weight": 10000
}
]
}bornswiftpublished a new post: the-double-spend-problem2018/02/04 20:39:57
bornswiftpublished a new post: the-double-spend-problem
2018/02/04 20:39:57
| parent author | |
| parent permlink | blockchain |
| author | bornswift |
| permlink | the-double-spend-problem |
| title | The Double Spend Problem |
| body | @@ -1479,20 +1479,16 @@ rack of -the where ea |
| json metadata | {"tags":["blockchain","cryptocurrency","bitcoin","technology","crypto"],"image":["https://steemitimages.com/DQmTsk8EcZ8y57Yuzkv97SpcR77gktP3Q26uqjGaaGi296k/rai-stones.jpg"],"links":["https://en.wikipedia.org/wiki/Rai_stones"],"app":"steemit/0.1","format":"markdown"} |
| Transaction Info | Block #19584555/Trx 10f1d295b52b7ca838dde1f6be74798436ac7e95 |
View Raw JSON Data
{
"trx_id": "10f1d295b52b7ca838dde1f6be74798436ac7e95",
"block": 19584555,
"trx_in_block": 46,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-04T20:39:57",
"op": [
"comment",
{
"parent_author": "",
"parent_permlink": "blockchain",
"author": "bornswift",
"permlink": "the-double-spend-problem",
"title": "The Double Spend Problem",
"body": "@@ -1479,20 +1479,16 @@\n rack of \n-the \n where ea\n",
"json_metadata": "{\"tags\":[\"blockchain\",\"cryptocurrency\",\"bitcoin\",\"technology\",\"crypto\"],\"image\":[\"https://steemitimages.com/DQmTsk8EcZ8y57Yuzkv97SpcR77gktP3Q26uqjGaaGi296k/rai-stones.jpg\"],\"links\":[\"https://en.wikipedia.org/wiki/Rai_stones\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
}
]
}jeftekupvoted (100.00%) @bornswift / the-double-spend-problem2018/02/04 19:08:54
jeftekupvoted (100.00%) @bornswift / the-double-spend-problem
2018/02/04 19:08:54
| voter | jeftek |
| author | bornswift |
| permlink | the-double-spend-problem |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19582734/Trx d944e24f3854551fae519f2a90aa83bd0afb726d |
View Raw JSON Data
{
"trx_id": "d944e24f3854551fae519f2a90aa83bd0afb726d",
"block": 19582734,
"trx_in_block": 36,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-04T19:08:54",
"op": [
"vote",
{
"voter": "jeftek",
"author": "bornswift",
"permlink": "the-double-spend-problem",
"weight": 10000
}
]
}2018/02/04 18:50:51
2018/02/04 18:50:51
| parent author | bornswift |
| parent permlink | the-double-spend-problem |
| author | sreeram661 |
| permlink | re-bornswift-the-double-spend-problem-20180204t185050749z |
| title | |
| body | Please Check out this below project.If you likeit, Follow and upvote for the project. https://steemit.com/steemit/@sreeram661/upvote-funding-crypto-mining-company-improved-plan |
| json metadata | {"tags":["blockchain"],"links":["https://steemit.com/steemit/@sreeram661/upvote-funding-crypto-mining-company-improved-plan"],"app":"steemit/0.1"} |
| Transaction Info | Block #19582373/Trx e86bb89a292a2f879994ffa76e970023577a8f4f |
View Raw JSON Data
{
"trx_id": "e86bb89a292a2f879994ffa76e970023577a8f4f",
"block": 19582373,
"trx_in_block": 39,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-04T18:50:51",
"op": [
"comment",
{
"parent_author": "bornswift",
"parent_permlink": "the-double-spend-problem",
"author": "sreeram661",
"permlink": "re-bornswift-the-double-spend-problem-20180204t185050749z",
"title": "",
"body": "Please Check out this below project.If you likeit, Follow and upvote for the project. https://steemit.com/steemit/@sreeram661/upvote-funding-crypto-mining-company-improved-plan",
"json_metadata": "{\"tags\":[\"blockchain\"],\"links\":[\"https://steemit.com/steemit/@sreeram661/upvote-funding-crypto-mining-company-improved-plan\"],\"app\":\"steemit/0.1\"}"
}
]
}bornswiftupvoted (100.00%) @bornswift / the-double-spend-problem2018/02/04 18:49:09
bornswiftupvoted (100.00%) @bornswift / the-double-spend-problem
2018/02/04 18:49:09
| voter | bornswift |
| author | bornswift |
| permlink | the-double-spend-problem |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19582339/Trx 7412fa62e7da7e41dfe9ff883deb8aa1d41a8e42 |
View Raw JSON Data
{
"trx_id": "7412fa62e7da7e41dfe9ff883deb8aa1d41a8e42",
"block": 19582339,
"trx_in_block": 35,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-04T18:49:09",
"op": [
"vote",
{
"voter": "bornswift",
"author": "bornswift",
"permlink": "the-double-spend-problem",
"weight": 10000
}
]
}bornswiftupdated options for the-double-spend-problem2018/02/04 18:49:09
bornswiftupdated options for the-double-spend-problem
2018/02/04 18:49:09
| author | bornswift |
| permlink | the-double-spend-problem |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| allow votes | true |
| allow curation rewards | true |
| extensions | [] |
| Transaction Info | Block #19582339/Trx 7412fa62e7da7e41dfe9ff883deb8aa1d41a8e42 |
View Raw JSON Data
{
"trx_id": "7412fa62e7da7e41dfe9ff883deb8aa1d41a8e42",
"block": 19582339,
"trx_in_block": 35,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-04T18:49:09",
"op": [
"comment_options",
{
"author": "bornswift",
"permlink": "the-double-spend-problem",
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"allow_votes": true,
"allow_curation_rewards": true,
"extensions": []
}
]
}bornswiftpublished a new post: the-double-spend-problem2018/02/04 18:49:09
bornswiftpublished a new post: the-double-spend-problem
2018/02/04 18:49:09
| parent author | |
| parent permlink | blockchain |
| author | bornswift |
| permlink | the-double-spend-problem |
| title | The Double Spend Problem |
| body |  There are a set of small islands in the Pacific whose citizens used massive stone disks as their form of currency ([Rai Stones](https://en.wikipedia.org/wiki/Rai_stones)). The stones were too large to move, so during a transaction, ownership of the stone would simply pass from one person to another by word of mouth. A problem arises here if I purchase something from you in exchange for my stone, then without telling you, go to someone else and barter with them using the same stone. This is called the double spend problem and will quickly devalue any currency. The two solutions to the problem are as follows: 1. Rely upon a single middleman for every transaction; some designated authority that can bless each transaction. - A middleman can ensure that no coin is spent twice. - A middleman has power over the system and can begin taking large cuts to facilitate the transaction. 2. Each transaction is broadcast to the entire community. Once everyone has heard of the transaction, then the coin is considered spent. - This is slow but cheap. No middleman to decide whether your transaction should go through or not. - This solution doesn't scale past a small village. It's clear which example is a system relying on banks and which is the peer-to-peer economy. In the peer-to-peer system, every person must keep track of the where each coin currently resides through the use of a ledger (this is the blockchain). You could imagine that as such a system grew, there would be so much chatter that it would be difficult to keep everyone on the same page. The existing Proof-of-Work (PoW) system provides a democratized way for selecting a member of the community to add some data to the blockchain (a way to take turns). More on PoW in a future post. Throughout history, we've relied upon barter systems and peer-to-peer economies to facilitate our transaction needs. However, as we sought-after further growth, we realized that these systems do not scale past a small village. Once centralized systems were invented, civilization flourished because it allowed the economy to scale. Thanks to the speed-of-light data transmission of the internet and the invention of a decentralized blockchain, we now have the ability to have the best of both worlds: __a global, peer-to-peer economy__. |
| json metadata | {"tags":["blockchain","cryptocurrency","bitcoin","technology","crypto"],"image":["https://steemitimages.com/DQmTsk8EcZ8y57Yuzkv97SpcR77gktP3Q26uqjGaaGi296k/rai-stones.jpg"],"links":["https://en.wikipedia.org/wiki/Rai_stones"],"app":"steemit/0.1","format":"markdown"} |
| Transaction Info | Block #19582339/Trx 7412fa62e7da7e41dfe9ff883deb8aa1d41a8e42 |
View Raw JSON Data
{
"trx_id": "7412fa62e7da7e41dfe9ff883deb8aa1d41a8e42",
"block": 19582339,
"trx_in_block": 35,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-04T18:49:09",
"op": [
"comment",
{
"parent_author": "",
"parent_permlink": "blockchain",
"author": "bornswift",
"permlink": "the-double-spend-problem",
"title": "The Double Spend Problem",
"body": "\n\nThere are a set of small islands in the Pacific whose citizens used massive stone disks as their form of currency ([Rai Stones](https://en.wikipedia.org/wiki/Rai_stones)). The stones were too large to move, so during a transaction, ownership of the stone would simply pass from one person to another by word of mouth. A problem arises here if I purchase something from you in exchange for my stone, then without telling you, go to someone else and barter with them using the same stone. This is called the double spend problem and will quickly devalue any currency. The two solutions to the problem are as follows:\n\n1. Rely upon a single middleman for every transaction; some designated authority that can bless each transaction.\n - A middleman can ensure that no coin is spent twice. \n - A middleman has power over the system and can begin taking large cuts to facilitate the transaction.\n2. Each transaction is broadcast to the entire community. Once everyone has heard of the transaction, then the coin is considered spent.\n- This is slow but cheap. No middleman to decide whether your transaction should go through or not.\n- This solution doesn't scale past a small village.\n\nIt's clear which example is a system relying on banks and which is the peer-to-peer economy. In the peer-to-peer system, every person must keep track of the where each coin currently resides through the use of a ledger (this is the blockchain). You could imagine that as such a system grew, there would be so much chatter that it would be difficult to keep everyone on the same page. The existing Proof-of-Work (PoW) system provides a democratized way for selecting a member of the community to add some data to the blockchain (a way to take turns). More on PoW in a future post.\n\nThroughout history, we've relied upon barter systems and peer-to-peer economies to facilitate our transaction needs. However, as we sought-after further growth, we realized that these systems do not scale past a small village. Once centralized systems were invented, civilization flourished because it allowed the economy to scale. Thanks to the speed-of-light data transmission of the internet and the invention of a decentralized blockchain, we now have the ability to have the best of both worlds: __a global, peer-to-peer economy__.",
"json_metadata": "{\"tags\":[\"blockchain\",\"cryptocurrency\",\"bitcoin\",\"technology\",\"crypto\"],\"image\":[\"https://steemitimages.com/DQmTsk8EcZ8y57Yuzkv97SpcR77gktP3Q26uqjGaaGi296k/rai-stones.jpg\"],\"links\":[\"https://en.wikipedia.org/wiki/Rai_stones\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
}
]
}2018/02/03 23:28:21
2018/02/03 23:28:21
| voter | bornswift |
| author | totopapa |
| permlink | tyl2b |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19559134/Trx 040e66fcdeb4994c6d91cc0a43db56d882a5c273 |
View Raw JSON Data
{
"trx_id": "040e66fcdeb4994c6d91cc0a43db56d882a5c273",
"block": 19559134,
"trx_in_block": 52,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-03T23:28:21",
"op": [
"vote",
{
"voter": "bornswift",
"author": "totopapa",
"permlink": "tyl2b",
"weight": 10000
}
]
}2018/02/03 23:11:27
2018/02/03 23:11:27
| parent author | bornswift |
| parent permlink | what-s-backing-cryptocurrency |
| author | cool-mike |
| permlink | re-bornswift-what-s-backing-cryptocurrency-20180203t231128169z |
| title | |
| body | Thank you for the great post. I just finished one myself that talks about this recent Bitcoin crash. You might be interested in it so check it out if you get the opportunity. https://steemit.com/bitcoin/@cool-mike/the-great-bitcoin-crash-of-2018-will-cryptocurrency-survive |
| json metadata | {"tags":["blockchain"],"links":["https://steemit.com/bitcoin/@cool-mike/the-great-bitcoin-crash-of-2018-will-cryptocurrency-survive"],"app":"steemit/0.1"} |
| Transaction Info | Block #19558796/Trx 45b75952aff3cf629ae172cafa90b39a0e83129c |
View Raw JSON Data
{
"trx_id": "45b75952aff3cf629ae172cafa90b39a0e83129c",
"block": 19558796,
"trx_in_block": 21,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-03T23:11:27",
"op": [
"comment",
{
"parent_author": "bornswift",
"parent_permlink": "what-s-backing-cryptocurrency",
"author": "cool-mike",
"permlink": "re-bornswift-what-s-backing-cryptocurrency-20180203t231128169z",
"title": "",
"body": "Thank you for the great post. I just finished one myself that talks about this recent Bitcoin crash. You might be interested in it so check it out if you get the opportunity.\n\nhttps://steemit.com/bitcoin/@cool-mike/the-great-bitcoin-crash-of-2018-will-cryptocurrency-survive",
"json_metadata": "{\"tags\":[\"blockchain\"],\"links\":[\"https://steemit.com/bitcoin/@cool-mike/the-great-bitcoin-crash-of-2018-will-cryptocurrency-survive\"],\"app\":\"steemit/0.1\"}"
}
]
}cool-mikeupvoted (100.00%) @bornswift / what-s-backing-cryptocurrency2018/02/03 23:10:39
cool-mikeupvoted (100.00%) @bornswift / what-s-backing-cryptocurrency
2018/02/03 23:10:39
| voter | cool-mike |
| author | bornswift |
| permlink | what-s-backing-cryptocurrency |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19558780/Trx 02dd409b9a43ddf138745e0cd335cec0767a075a |
View Raw JSON Data
{
"trx_id": "02dd409b9a43ddf138745e0cd335cec0767a075a",
"block": 19558780,
"trx_in_block": 38,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-03T23:10:39",
"op": [
"vote",
{
"voter": "cool-mike",
"author": "bornswift",
"permlink": "what-s-backing-cryptocurrency",
"weight": 10000
}
]
}bornswiftupvoted (100.00%) @bornswift / what-s-backing-cryptocurrency2018/02/03 23:10:21
bornswiftupvoted (100.00%) @bornswift / what-s-backing-cryptocurrency
2018/02/03 23:10:21
| voter | bornswift |
| author | bornswift |
| permlink | what-s-backing-cryptocurrency |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19558774/Trx b274c51e0c10630e529ce89fd3cd2278b6657fc7 |
View Raw JSON Data
{
"trx_id": "b274c51e0c10630e529ce89fd3cd2278b6657fc7",
"block": 19558774,
"trx_in_block": 92,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-03T23:10:21",
"op": [
"vote",
{
"voter": "bornswift",
"author": "bornswift",
"permlink": "what-s-backing-cryptocurrency",
"weight": 10000
}
]
}bornswiftupdated options for what-s-backing-cryptocurrency2018/02/03 23:10:21
bornswiftupdated options for what-s-backing-cryptocurrency
2018/02/03 23:10:21
| author | bornswift |
| permlink | what-s-backing-cryptocurrency |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 0 |
| allow votes | true |
| allow curation rewards | true |
| extensions | [] |
| Transaction Info | Block #19558774/Trx b274c51e0c10630e529ce89fd3cd2278b6657fc7 |
View Raw JSON Data
{
"trx_id": "b274c51e0c10630e529ce89fd3cd2278b6657fc7",
"block": 19558774,
"trx_in_block": 92,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-03T23:10:21",
"op": [
"comment_options",
{
"author": "bornswift",
"permlink": "what-s-backing-cryptocurrency",
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 0,
"allow_votes": true,
"allow_curation_rewards": true,
"extensions": []
}
]
}bornswiftpublished a new post: what-s-backing-cryptocurrency2018/02/03 23:10:21
bornswiftpublished a new post: what-s-backing-cryptocurrency
2018/02/03 23:10:21
| parent author | |
| parent permlink | blockchain |
| author | bornswift |
| permlink | what-s-backing-cryptocurrency |
| title | What's Backing Cryptocurrency? |
| body |  One of the first questions that many people ask as they dive into the world of #crypto is "What's backing #cryptocurrency? Where does it get its value from?". Value of any asset simply comes from the demand. The demand is influenced both by the utility and the scarcity (aka supply). When the system was designed, it was created with a finite supply (21M in the case of #Bitcoin), which cannot be modified as the system is decentralized. Setting supply aside, let's look at the value derived from utility. Utility encompasses both today's utility and tomorrow's utility (speculation). Today's utility can more easily be predicted: if an individual or business can use cryptocurrency to save $100 through disintermediation, then they'd be willing to pay up to $99 to use said cryptocurrency. This drives up demand on a scarce resource. The speculated utility is based on predicting the future, something humans are pretty terrible at. Because of the uncertainty of the future, humans rely upon emotion to speculate their prediction. If the investing population is not diverse enough this leads to wild price swings (see crypto 😜). <p align="center"> <img width="460" height="300" src="https://steemitimages.com/DQmQaSfAyZvbTefExHvnUDGZrGx7rKL6bmYveJa5jx9aRKZ/tenor.gif"> </p> Many cryptocurrencies provide utility today and have a solid price floor. Utility today can be seen through disintermediation, better control of assets, remittances, entertainment, diversification, medium of exchange, etc. Many (more) cryptocurrencies have purely speculative value, which makes them naturally more risky. It's important to understand that cryptocurrencies are diverse and fall under a wide range on this scale. Don't assume all cryptocurrencies are solid and don't assume all cryptocurrencies are scams. Did I miss anything? Add your points to the comments below! |
| json metadata | {"tags":["blockchain","cryptocurrency","bitcoin","technology","crypto"],"image":["https://steemitimages.com/DQmYFVEbHdUquhy4zJXEsTVfXtUkHooS3dPF9kD6BtPjQrk/Bitcoin-Price.jpg","https://steemitimages.com/DQmQaSfAyZvbTefExHvnUDGZrGx7rKL6bmYveJa5jx9aRKZ/tenor.gif"],"app":"steemit/0.1","format":"markdown"} |
| Transaction Info | Block #19558774/Trx b274c51e0c10630e529ce89fd3cd2278b6657fc7 |
View Raw JSON Data
{
"trx_id": "b274c51e0c10630e529ce89fd3cd2278b6657fc7",
"block": 19558774,
"trx_in_block": 92,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-03T23:10:21",
"op": [
"comment",
{
"parent_author": "",
"parent_permlink": "blockchain",
"author": "bornswift",
"permlink": "what-s-backing-cryptocurrency",
"title": "What's Backing Cryptocurrency?",
"body": "\n\nOne of the first questions that many people ask as they dive into the world of #crypto is \"What's backing #cryptocurrency? Where does it get its value from?\". Value of any asset simply comes from the demand. The demand is influenced both by the utility and the scarcity (aka supply). When the system was designed, it was created with a finite supply (21M in the case of #Bitcoin), which cannot be modified as the system is decentralized. Setting supply aside, let's look at the value derived from utility.\n\nUtility encompasses both today's utility and tomorrow's utility (speculation). Today's utility can more easily be predicted: if an individual or business can use cryptocurrency to save $100 through disintermediation, then they'd be willing to pay up to $99 to use said cryptocurrency. This drives up demand on a scarce resource. The speculated utility is based on predicting the future, something humans are pretty terrible at. Because of the uncertainty of the future, humans rely upon emotion to speculate their prediction. If the investing population is not diverse enough this leads to wild price swings (see crypto 😜).\n\n<p align=\"center\">\n <img width=\"460\" height=\"300\" src=\"https://steemitimages.com/DQmQaSfAyZvbTefExHvnUDGZrGx7rKL6bmYveJa5jx9aRKZ/tenor.gif\">\n</p>\n\nMany cryptocurrencies provide utility today and have a solid price floor. Utility today can be seen through disintermediation, better control of assets, remittances, entertainment, diversification, medium of exchange, etc. Many (more) cryptocurrencies have purely speculative value, which makes them naturally more risky. It's important to understand that cryptocurrencies are diverse and fall under a wide range on this scale. Don't assume all cryptocurrencies are solid and don't assume all cryptocurrencies are scams.\n\nDid I miss anything? Add your points to the comments below!",
"json_metadata": "{\"tags\":[\"blockchain\",\"cryptocurrency\",\"bitcoin\",\"technology\",\"crypto\"],\"image\":[\"https://steemitimages.com/DQmYFVEbHdUquhy4zJXEsTVfXtUkHooS3dPF9kD6BtPjQrk/Bitcoin-Price.jpg\",\"https://steemitimages.com/DQmQaSfAyZvbTefExHvnUDGZrGx7rKL6bmYveJa5jx9aRKZ/tenor.gif\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
}
]
}bornswiftupvoted (100.00%) @bornswift / welcome-to-the-revolution2018/02/03 22:46:21
bornswiftupvoted (100.00%) @bornswift / welcome-to-the-revolution
2018/02/03 22:46:21
| voter | bornswift |
| author | bornswift |
| permlink | welcome-to-the-revolution |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19558294/Trx ade1ba1a6f6befebbc56f2cf0562a4e3a49eefb0 |
View Raw JSON Data
{
"trx_id": "ade1ba1a6f6befebbc56f2cf0562a4e3a49eefb0",
"block": 19558294,
"trx_in_block": 80,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-02-03T22:46:21",
"op": [
"vote",
{
"voter": "bornswift",
"author": "bornswift",
"permlink": "welcome-to-the-revolution",
"weight": 10000
}
]
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress73.32%
{
"voting_manabar": {
"current_mana": "276978691793",
"last_update_time": 1581668250
},
"downvote_manabar": {
"current_mana": "69244672947",
"last_update_time": 1581668250
},
"rc_account": {
"account": "bornswift",
"rc_manabar": {
"current_mana": "270575826186",
"last_update_time": 1581668460
},
"max_rc_creation_adjustment": {
"amount": "2020748973",
"precision": 6,
"nai": "@@000000037"
},
"max_rc": "278999440766"
}
}Account Metadata
| POSTING JSON METADATA | |
| profile | {"profile_image":"http://i.imgur.com/KOJZqsF.jpg","name":"Cody","about":"computer scientist - traveler - food lover - crypto enthusiast ","location":"Seattle, WA"} |
| JSON METADATA | |
| profile | {"profile_image":"http://i.imgur.com/KOJZqsF.jpg","name":"Cody","about":"computer scientist - traveler - food lover - crypto enthusiast ","location":"Seattle, WA"} |
{
"posting_json_metadata": {
"profile": {
"profile_image": "http://i.imgur.com/KOJZqsF.jpg",
"name": "Cody",
"about": "computer scientist - traveler - food lover - crypto enthusiast ",
"location": "Seattle, WA"
}
},
"json_metadata": {
"profile": {
"profile_image": "http://i.imgur.com/KOJZqsF.jpg",
"name": "Cody",
"about": "computer scientist - traveler - food lover - crypto enthusiast ",
"location": "Seattle, WA"
}
}
}Auth Keys
Owner
Single Signature
Public Keys
STM6TPLNTM6pzky3aRxJvQEByn6VHxdJzp62jQ6AkPe8wdqz3EAPd1/1
Active
Single Signature
Public Keys
STM8GzY2ZZVaND2Fvw9NtzYvh2U2Z5GdpKxuf3hNBmqrVWdAhaPr21/1
Posting
Single Signature
Public Keys
STM5jY8oq6EBvoHV8A4jwoQnyL9LHpWc2jCBErukRYqJzt3yi9zkS1/1
Memo
STM7BrBFaepFgaLJBY8VSAkSapWAUV6EGh293TDZuqvUQSes3AmW6
{
"owner": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM6TPLNTM6pzky3aRxJvQEByn6VHxdJzp62jQ6AkPe8wdqz3EAPd",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8GzY2ZZVaND2Fvw9NtzYvh2U2Z5GdpKxuf3hNBmqrVWdAhaPr2",
1
]
]
},
"posting": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM5jY8oq6EBvoHV8A4jwoQnyL9LHpWc2jCBErukRYqJzt3yi9zkS",
1
]
]
},
"memo": "STM7BrBFaepFgaLJBY8VSAkSapWAUV6EGh293TDZuqvUQSes3AmW6"
}Witness Votes
30 / 30
01.actifit |
02.aggroed |
03.anyx |
04.ausbitbank |
06.blocktrades |
07.cervantes |
08.clayop |
09.curie |
10.drakos |
11.emrebeyler |
12.good-karma |
13.gtg |
14.holger80 |
15.jesta |
16.kevinwong |
18.ocd-witness |
19.riverhead |
20.roelandp |
22.someguy123 |
23.steempeak |
25.themarkymark |
26.therealwolf |
27.timcliff |
28.utopian-io |
29.wise-team |
30.yabapmatt |
[ "actifit", "aggroed", "anyx", "ausbitbank", "blockbrothers", "blocktrades", "cervantes", "clayop", "curie", "drakos", "emrebeyler", "good-karma", "gtg", "holger80", "jesta", "kevinwong", "lukestokes.mhth", "ocd-witness", "riverhead", "roelandp", "smooth.witness", "someguy123", "steempeak", "thecryptodrive", "themarkymark", "therealwolf", "timcliff", "utopian-io", "wise-team", "yabapmatt" ]