Ecoer Logo

@bornswift

50

computer scientist - traveler - food lover - crypto enthusiast

steemit.com/@bornswift
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
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
170.093SP
Delegated Out
0.000SP
Delegation In
0.000SP
Effective Power
170.093SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
9.053SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "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

namebornswift
id159467
rank12,319
reputation559932099426
created2017-05-15T02:15:03
recovery_accountsteem
proxyNone
post_count73
comment_count0
lifetime_vote_count0
witnesses_voted_for30
last_post2018-07-01T20:46:42
last_root_post2018-07-01T20:46:42
last_vote_time2018-07-02T23:56:54
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance2.092 STEEM
savings_balance0.000 STEEM
sbd_balance9.053 SBD
savings_sbd_balance0.000 SBD
vesting_shares276978.691793 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares0.000000 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2017-05-27T21:12:18
minedNo
sbd_seconds0
sbd_last_interest_payment2020-02-14T08:17:30
savings_sbd_last_interest_payment1970-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

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
2020/03/05 19:54:03
parent authorbornswift
parent permlinkdata-privacy-and-the-tragedy-of-the-commons
authorsteemitboard
permlinksteemitboard-notify-bornswift-20200305t195403000z
title
bodyCongratulations @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 InfoBlock #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\"]}"
    }
  ]
}
bornswiftvoted for witness @drakos
2020/02/14 08:21:00
accountbornswift
witnessdrakos
approvetrue
Transaction InfoBlock #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 @cervantes
2020/02/14 08:20:48
accountbornswift
witnesscervantes
approvetrue
Transaction InfoBlock #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.mhth
2020/02/14 08:20:45
accountbornswift
witnesslukestokes.mhth
approvetrue
Transaction InfoBlock #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
    }
  ]
}
bornswiftvoted for witness @timcliff
2020/02/14 08:20:45
accountbornswift
witnesstimcliff
approvetrue
Transaction InfoBlock #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
    }
  ]
}
bornswiftvoted for witness @jesta
2020/02/14 08:20:42
accountbornswift
witnessjesta
approvetrue
Transaction InfoBlock #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
    }
  ]
}
bornswiftvoted for witness @actifit
2020/02/14 08:20:42
accountbornswift
witnessactifit
approvetrue
Transaction InfoBlock #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
    }
  ]
}
bornswiftvoted for witness @curie
2020/02/14 08:20:39
accountbornswift
witnesscurie
approvetrue
Transaction InfoBlock #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 @therealwolf
2020/02/14 08:20:36
accountbornswift
witnesstherealwolf
approvetrue
Transaction InfoBlock #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-witness
2020/02/14 08:20:36
accountbornswift
witnessocd-witness
approvetrue
Transaction InfoBlock #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
    }
  ]
}
bornswiftvoted for witness @anyx
2020/02/14 08:20:33
accountbornswift
witnessanyx
approvetrue
Transaction InfoBlock #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 @emrebeyler
2020/02/14 08:20:33
accountbornswift
witnessemrebeyler
approvetrue
Transaction InfoBlock #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 @riverhead
2020/02/14 08:19:03
accountbornswift
witnessriverhead
approvetrue
Transaction InfoBlock #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 @blockbrothers
2020/02/14 08:19:00
accountbornswift
witnessblockbrothers
approvetrue
Transaction InfoBlock #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-team
2020/02/14 08:19:00
accountbornswift
witnesswise-team
approvetrue
Transaction InfoBlock #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 @kevinwong
2020/02/14 08:18:57
accountbornswift
witnesskevinwong
approvetrue
Transaction InfoBlock #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-io
2020/02/14 08:18:57
accountbornswift
witnessutopian-io
approvetrue
Transaction InfoBlock #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
    }
  ]
}
bornswiftvoted for witness @holger80
2020/02/14 08:18:54
accountbornswift
witnessholger80
approvetrue
Transaction InfoBlock #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 @ausbitbank
2020/02/14 08:18:48
accountbornswift
witnessausbitbank
approvetrue
Transaction InfoBlock #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 @thecryptodrive
2020/02/14 08:18:48
accountbornswift
witnessthecryptodrive
approvetrue
Transaction InfoBlock #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-karma
2020/02/14 08:18:45
accountbornswift
witnessgood-karma
approvetrue
Transaction InfoBlock #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 @steempeak
2020/02/14 08:18:42
accountbornswift
witnesssteempeak
approvetrue
Transaction InfoBlock #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.witness
2020/02/14 08:18:42
accountbornswift
witnesssmooth.witness
approvetrue
Transaction InfoBlock #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
    }
  ]
}
bornswiftvoted for witness @clayop
2020/02/14 08:18:39
accountbornswift
witnessclayop
approvetrue
Transaction InfoBlock #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
    }
  ]
}
bornswiftvoted for witness @aggroed
2020/02/14 08:18:36
accountbornswift
witnessaggroed
approvetrue
Transaction InfoBlock #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
    }
  ]
}
bornswiftvoted for witness @roelandp
2020/02/14 08:18:33
accountbornswift
witnessroelandp
approvetrue
Transaction InfoBlock #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 @blocktrades
2020/02/14 08:18:30
accountbornswift
witnessblocktrades
approvetrue
Transaction InfoBlock #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
    }
  ]
}
bornswiftvoted for witness @gtg
2020/02/14 08:18:27
accountbornswift
witnessgtg
approvetrue
Transaction InfoBlock #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 @themarkymark
2020/02/14 08:18:24
accountbornswift
witnessthemarkymark
approvetrue
Transaction InfoBlock #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 @someguy123
2020/02/14 08:18:24
accountbornswift
witnesssomeguy123
approvetrue
Transaction InfoBlock #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 @yabapmatt
2020/02/14 08:18:18
accountbornswift
witnessyabapmatt
approvetrue
Transaction InfoBlock #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 SP
2020/02/14 08:17:30
accountbornswift
reward steem0.010 STEEM
reward sbd0.012 SBD
reward vests130.550938 VESTS
Transaction InfoBlock #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
parent authorbornswift
parent permlinkdata-privacy-and-the-tragedy-of-the-commons
authorsteemitboard
permlinksteemitboard-notify-bornswift-20190515t030626000z
title
bodyCongratulations @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 InfoBlock #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 savings
2018/08/31 18:19:33
fromsmitop
request id18297
tobornswift
amount3.333 SBD
memoHi, 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 InfoBlock #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."
    }
  ]
}
2018/07/08 21:28:57
votercobramovin
authorbornswift
permlinkdata-privacy-and-the-tragedy-of-the-commons
weight10000 (100.00%)
Transaction InfoBlock #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-commons
2018/07/08 20:46:42
authorbornswift
permlinkdata-privacy-and-the-tragedy-of-the-commons
sbd payout0.012 SBD
steem payout0.010 STEEM
vesting payout36.526288 VESTS
Transaction InfoBlock #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"
    }
  ]
}
2018/07/08 20:46:42
curatorbornswift
reward2.029238 VESTS
comment authorbornswift
comment permlinkdata-privacy-and-the-tragedy-of-the-commons
Transaction InfoBlock #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"
    }
  ]
}
2018/07/02 23:56:54
voterbornswift
authorbornswift
permlinkdata-privacy-and-the-tragedy-of-the-commons
weight10000 (100.00%)
Transaction InfoBlock #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
    }
  ]
}
2018/07/01 21:18:48
voteranomaly
authorbornswift
permlinkdata-privacy-and-the-tragedy-of-the-commons
weight100 (1.00%)
Transaction InfoBlock #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
    }
  ]
}
2018/07/01 21:15:39
votermarketstack
authorbornswift
permlinkdata-privacy-and-the-tragedy-of-the-commons
weight149 (1.49%)
Transaction InfoBlock #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
    }
  ]
}
2018/07/01 21:15:39
voterlionindayard
authorbornswift
permlinkdata-privacy-and-the-tragedy-of-the-commons
weight149 (1.49%)
Transaction InfoBlock #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
    }
  ]
}
2018/07/01 21:15:36
voterdick.sledge
authorbornswift
permlinkdata-privacy-and-the-tragedy-of-the-commons
weight149 (1.49%)
Transaction InfoBlock #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
    }
  ]
}
2018/07/01 21:06:48
voterowlrange
authorbornswift
permlinkdata-privacy-and-the-tragedy-of-the-commons
weight10000 (100.00%)
Transaction InfoBlock #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
parent authorbornswift
parent permlinkdata-privacy-and-the-tragedy-of-the-commons
authora-0-0
permlinkre-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 InfoBlock #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\"}"
    }
  ]
}
2018/07/01 20:46:42
parent author
parent permlinkblockchain
authorbornswift
permlinkdata-privacy-and-the-tragedy-of-the-commons
titleData Privacy and the Tragedy of the Commons
body![graphic.png](https://cdn.steemitimages.com/DQmYq2R5hTnRy2f5BCf2JUWtuFC2Fp6sLcLh9kXRTCbiCyv/graphic.png) ### 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. ![toc.PNG](https://cdn.steemitimages.com/DQmPcbZ7VAq5xBDrnL6HbPsCgvSQaBgp5NxG74PmQPkhP3d/toc.PNG) 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 InfoBlock #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": "![graphic.png](https://cdn.steemitimages.com/DQmYq2R5hTnRy2f5BCf2JUWtuFC2Fp6sLcLh9kXRTCbiCyv/graphic.png)\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![toc.PNG](https://cdn.steemitimages.com/DQmPcbZ7VAq5xBDrnL6HbPsCgvSQaBgp5NxG74PmQPkhP3d/toc.PNG)\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\"}"
    }
  ]
}
2018/04/17 05:03:03
voternathanedge
authorbornswift
permlinkusing-azure-functions-to-call-ethereum-smart-contract
weight10000 (100.00%)
Transaction InfoBlock #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
    }
  ]
}
2018/03/04 21:51:21
curatorbornswift
reward2.042631 VESTS
comment authorcobramovin
comment permlinkre-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z
Transaction InfoBlock #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"
    }
  ]
}
2018/03/04 21:47:45
authorbornswift
permlinkusing-azure-functions-to-call-ethereum-smart-contract
sbd payout0.000 SBD
steem payout0.000 STEEM
vesting payout22.468946 VESTS
Transaction InfoBlock #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"
    }
  ]
}
2018/02/26 08:16:15
votermex-power
authorbornswift
permlinkusing-azure-functions-to-call-ethereum-smart-contract
weight10000 (100.00%)
Transaction InfoBlock #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
    }
  ]
}
2018/02/26 05:41:30
parent author
parent permlinkblockchain
authorbornswift
permlinkusing-azure-functions-to-call-ethereum-smart-contract
titleUsing 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 InfoBlock #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
voterbornswift
authorcobramovin
permlinkre-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z
weight10000 (100.00%)
Transaction InfoBlock #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
    }
  ]
}
2018/02/25 22:15:33
voterrborn
authorbornswift
permlinkusing-azure-functions-to-call-ethereum-smart-contract
weight10000 (100.00%)
Transaction InfoBlock #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
parent authorbornswift
parent permlinkusing-azure-functions-to-call-ethereum-smart-contract
authorcobramovin
permlinkre-bornswift-using-azure-functions-to-call-ethereum-smart-contract-20180225t215117107z
title
bodyGreat work!!
json metadata{"tags":["blockchain"],"app":"steemit/0.1"}
Transaction InfoBlock #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\"}"
    }
  ]
}
2018/02/25 21:50:57
votercobramovin
authorbornswift
permlinkusing-azure-functions-to-call-ethereum-smart-contract
weight10000 (100.00%)
Transaction InfoBlock #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
    }
  ]
}
2018/02/25 21:48:39
parent author
parent permlinkblockchain
authorbornswift
permlinkusing-azure-functions-to-call-ethereum-smart-contract
titleUsing 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. &nbsp;Occasionally our mining rig would go down for miscellaneous reasons (power outage, network failure, Windows Defender targeting our mining client). &nbsp;While the miner is down, we're losing potential profit. &nbsp;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. &nbsp;This is a common problem for all miners, so I opened it up to the public. &nbsp;To help fund the costs of the monitor, I incorporated a fuel token which gets burnt every time you get alerted. &nbsp;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> ![MinerMonitor](https://steemitimages.com/DQmXy51oZxCJKJ1ta1DbSYX4ARbAV2JViXPTfYGnhDBnPWE/image.png) 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. &nbsp;Unfortunately, Azure Functions does not support Ethereum event triggers (yet!) so I had to setup an Azure Function job using a timer. &nbsp;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. &nbsp;Let's walk through how it's done. &nbsp;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/). &nbsp; ## 1. Create an Account on Infura The first thing we'll want to do is go Infura and create an account: ![infura.PNG](https://steemitimages.com/DQmUGSP2dKFymrK4wWRDy9ZnR2U712rpVb5dUVprWAmJ6g9/infura.PNG) #### 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. &nbsp;[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. &nbsp;![Add Storage](https://steemitimages.com/DQmfCoQ5aKbqR3xqwS9rUXL4njKC4pKophNYcpwihpJnQtC/image.png) This is where we will be storing the results from our blockchain function calls. &nbsp;By creating this output object, we will get the storage connection string passed in as an environment variable. &nbsp;The variable will be named the same as your storage account. &nbsp;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 ![Debug Console](https://steemitimages.com/DQmZtDbnDJTFUTEPrY7FSDGiTMGbVkHspEgPQXr7L8yoSS3/image.png) ##### - 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. &nbsp;I'll break down the various sections. #### Setup Your Smart Contact Test this code snippet by writing out the results to the `context.log`. &nbsp;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. &nbsp;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. &nbsp;Here, I'm updating the user's balance and replacing the entity in the table. &nbsp;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. &nbsp;100% of my users will have Ether (as miners), thus Ethereum provides a convenient and anonymous way to make small payments. &nbsp;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 InfoBlock #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. &nbsp;Occasionally our mining rig would go down for miscellaneous reasons (power outage, network failure, Windows Defender targeting our mining client). &nbsp;While the miner is down, we're losing potential profit. &nbsp;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. &nbsp;This is a common problem for all miners, so I opened it up to the public. &nbsp;To help fund the costs of the monitor, I incorporated a fuel token which gets burnt every time you get alerted. &nbsp;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![MinerMonitor](https://steemitimages.com/DQmXy51oZxCJKJ1ta1DbSYX4ARbAV2JViXPTfYGnhDBnPWE/image.png)\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. &nbsp;Unfortunately, Azure Functions does not support Ethereum event triggers (yet!) so I had to setup an Azure Function job using a timer. &nbsp;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. &nbsp;Let's walk through how it's done. &nbsp;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/). &nbsp;\n\n## 1. Create an Account on Infura\nThe first thing we'll want to do is go Infura and create an account: \n![infura.PNG](https://steemitimages.com/DQmUGSP2dKFymrK4wWRDy9ZnR2U712rpVb5dUVprWAmJ6g9/infura.PNG)\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. &nbsp;[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. &nbsp;![Add Storage](https://steemitimages.com/DQmfCoQ5aKbqR3xqwS9rUXL4njKC4pKophNYcpwihpJnQtC/image.png)\nThis is where we will be storing the results from our blockchain function calls. &nbsp;By creating this output object, we will get the storage connection string passed in as an environment variable. &nbsp;The variable will be named the same as your storage account. &nbsp;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![Debug Console](https://steemitimages.com/DQmZtDbnDJTFUTEPrY7FSDGiTMGbVkHspEgPQXr7L8yoSS3/image.png)\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. &nbsp;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`. &nbsp;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. &nbsp;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. &nbsp;Here, I'm updating the user's balance and replacing the entity in the table. &nbsp;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. &nbsp;100% of my users will have Ether (as miners), thus Ethereum provides a convenient and anonymous way to make small payments. &nbsp;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\"}"
    }
  ]
}
2018/02/25 21:47:45
voterbornswift
authorbornswift
permlinkusing-azure-functions-to-call-ethereum-smart-contract
weight10000 (100.00%)
Transaction InfoBlock #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
    }
  ]
}
2018/02/25 21:47:45
authorbornswift
permlinkusing-azure-functions-to-call-ethereum-smart-contract
max accepted payout1000000.000 SBD
percent steem dollars0
allow votestrue
allow curation rewardstrue
extensions[]
Transaction InfoBlock #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": []
    }
  ]
}
2018/02/25 21:47:45
parent author
parent permlinkblockchain
authorbornswift
permlinkusing-azure-functions-to-call-ethereum-smart-contract
titleUsing 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. &nbsp;Occasionally our mining rig would go down for miscellaneous reasons (power outage, network failure, Windows Defender targeting our mining client). &nbsp;While the miner is down, we're losing potential profit. &nbsp;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. &nbsp;This is a common problem for all miners, so I opened it up to the public. &nbsp;To help fund the costs of the monitor, I incorporated a fuel token which gets burnt every time you get alerted. &nbsp;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> ![MinerMonitor](https://steemitimages.com/DQmXy51oZxCJKJ1ta1DbSYX4ARbAV2JViXPTfYGnhDBnPWE/image.png) 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. &nbsp;Unfortunately, Azure Functions does not support Ethereum event triggers (yet!) so I had to setup an Azure Function job using a timer. &nbsp;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. &nbsp;Let's walk through how it's done. &nbsp;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/). &nbsp; ## 1. Create an Account on Infura The first thing we'll want to do is go Infura and create an account: ![infura.PNG](https://steemitimages.com/DQmUGSP2dKFymrK4wWRDy9ZnR2U712rpVb5dUVprWAmJ6g9/infura.PNG) #### 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. &nbsp;[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. &nbsp;![Add Storage](https://steemitimages.com/DQmfCoQ5aKbqR3xqwS9rUXL4njKC4pKophNYcpwihpJnQtC/image.png) This is where we will be storing the results from our blockchain function calls. &nbsp;By creating this output object, we will get the storage connection string passed in as an environment variable. &nbsp;The variable will be named the same as your storage account. &nbsp;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 ![Debug Console](https://steemitimages.com/DQmZtDbnDJTFUTEPrY7FSDGiTMGbVkHspEgPQXr7L8yoSS3/image.png) ##### - 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. &nbsp;I'll break down the various sections. #### Setup Your Smart Contact Test this code snippet by writing out the results to the `context.log`. &nbsp;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. &nbsp;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. &nbsp;Here, I'm updating the user's balance and replacing the entity in the table. &nbsp;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. &nbsp;100% of my users will have Ether (as miners), thus Ethereum provides a convenient and anonymous way to make small payments. &nbsp;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 InfoBlock #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. &nbsp;Occasionally our mining rig would go down for miscellaneous reasons (power outage, network failure, Windows Defender targeting our mining client). &nbsp;While the miner is down, we're losing potential profit. &nbsp;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. &nbsp;This is a common problem for all miners, so I opened it up to the public. &nbsp;To help fund the costs of the monitor, I incorporated a fuel token which gets burnt every time you get alerted. &nbsp;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![MinerMonitor](https://steemitimages.com/DQmXy51oZxCJKJ1ta1DbSYX4ARbAV2JViXPTfYGnhDBnPWE/image.png)\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. &nbsp;Unfortunately, Azure Functions does not support Ethereum event triggers (yet!) so I had to setup an Azure Function job using a timer. &nbsp;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. &nbsp;Let's walk through how it's done. &nbsp;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/). &nbsp;\n\n## 1. Create an Account on Infura\nThe first thing we'll want to do is go Infura and create an account: \n![infura.PNG](https://steemitimages.com/DQmUGSP2dKFymrK4wWRDy9ZnR2U712rpVb5dUVprWAmJ6g9/infura.PNG)\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. &nbsp;[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. &nbsp;![Add Storage](https://steemitimages.com/DQmfCoQ5aKbqR3xqwS9rUXL4njKC4pKophNYcpwihpJnQtC/image.png)\nThis is where we will be storing the results from our blockchain function calls. &nbsp;By creating this output object, we will get the storage connection string passed in as an environment variable. &nbsp;The variable will be named the same as your storage account. &nbsp;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![Debug Console](https://steemitimages.com/DQmZtDbnDJTFUTEPrY7FSDGiTMGbVkHspEgPQXr7L8yoSS3/image.png)\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. &nbsp;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`. &nbsp;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. &nbsp;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. &nbsp;Here, I'm updating the user's balance and replacing the entity in the table. &nbsp;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. &nbsp;100% of my users will have Ether (as miners), thus Ethereum provides a convenient and anonymous way to make small payments. &nbsp;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-problem
2018/02/11 18:49:09
authorbornswift
permlinkthe-double-spend-problem
sbd payout0.000 SBD
steem payout0.000 STEEM
vesting payout22.493975 VESTS
Transaction InfoBlock #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-cryptocurrency
2018/02/10 23:10:21
authorbornswift
permlinkwhat-s-backing-cryptocurrency
sbd payout0.000 SBD
steem payout0.000 STEEM
vesting payout26.584908 VESTS
Transaction InfoBlock #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-revolution
2018/02/10 22:46:21
authorbornswift
permlinkwelcome-to-the-revolution
sbd payout0.000 SBD
steem payout0.000 STEEM
vesting payout18.404952 VESTS
Transaction InfoBlock #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"
    }
  ]
}
2018/02/04 20:45:21
voterrborn
authorbornswift
permlinkthe-double-spend-problem
weight10000 (100.00%)
Transaction InfoBlock #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-problem
2018/02/04 20:39:57
parent author
parent permlinkblockchain
authorbornswift
permlinkthe-double-spend-problem
titleThe 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 InfoBlock #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\"}"
    }
  ]
}
2018/02/04 19:08:54
voterjeftek
authorbornswift
permlinkthe-double-spend-problem
weight10000 (100.00%)
Transaction InfoBlock #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
parent authorbornswift
parent permlinkthe-double-spend-problem
authorsreeram661
permlinkre-bornswift-the-double-spend-problem-20180204t185050749z
title
bodyPlease 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 InfoBlock #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\"}"
    }
  ]
}
2018/02/04 18:49:09
voterbornswift
authorbornswift
permlinkthe-double-spend-problem
weight10000 (100.00%)
Transaction InfoBlock #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
    }
  ]
}
2018/02/04 18:49:09
authorbornswift
permlinkthe-double-spend-problem
max accepted payout1000000.000 SBD
percent steem dollars0
allow votestrue
allow curation rewardstrue
extensions[]
Transaction InfoBlock #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-problem
2018/02/04 18:49:09
parent author
parent permlinkblockchain
authorbornswift
permlinkthe-double-spend-problem
titleThe Double Spend Problem
body![rai-stones.jpg](https://steemitimages.com/DQmTsk8EcZ8y57Yuzkv97SpcR77gktP3Q26uqjGaaGi296k/rai-stones.jpg) 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)). &nbsp;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. &nbsp;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. &nbsp;This is called the double spend problem and will quickly devalue any currency. &nbsp;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. &nbsp;Once everyone has heard of the transaction, then the coin is considered spent. - This is slow but cheap. &nbsp;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. &nbsp;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). &nbsp;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. &nbsp;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). &nbsp; 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. &nbsp; 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. &nbsp;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 InfoBlock #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": "![rai-stones.jpg](https://steemitimages.com/DQmTsk8EcZ8y57Yuzkv97SpcR77gktP3Q26uqjGaaGi296k/rai-stones.jpg)\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)). &nbsp;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. &nbsp;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. &nbsp;This is called the double spend problem and will quickly devalue any currency. &nbsp;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. &nbsp;Once everyone has heard of the transaction, then the coin is considered spent.\n- This is slow but cheap. &nbsp;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. &nbsp;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). &nbsp;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. &nbsp;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). &nbsp; 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. &nbsp; 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.  &nbsp;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\"}"
    }
  ]
}
bornswiftupvoted (100.00%) @totopapa / tyl2b
2018/02/03 23:28:21
voterbornswift
authortotopapa
permlinktyl2b
weight10000 (100.00%)
Transaction InfoBlock #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
parent authorbornswift
parent permlinkwhat-s-backing-cryptocurrency
authorcool-mike
permlinkre-bornswift-what-s-backing-cryptocurrency-20180203t231128169z
title
bodyThank 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 InfoBlock #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\"}"
    }
  ]
}
2018/02/03 23:10:39
votercool-mike
authorbornswift
permlinkwhat-s-backing-cryptocurrency
weight10000 (100.00%)
Transaction InfoBlock #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
    }
  ]
}
2018/02/03 23:10:21
voterbornswift
authorbornswift
permlinkwhat-s-backing-cryptocurrency
weight10000 (100.00%)
Transaction InfoBlock #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
    }
  ]
}
2018/02/03 23:10:21
authorbornswift
permlinkwhat-s-backing-cryptocurrency
max accepted payout1000000.000 SBD
percent steem dollars0
allow votestrue
allow curation rewardstrue
extensions[]
Transaction InfoBlock #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": []
    }
  ]
}
2018/02/03 23:10:21
parent author
parent permlinkblockchain
authorbornswift
permlinkwhat-s-backing-cryptocurrency
titleWhat's Backing Cryptocurrency?
body![Bitcoin.jpg](https://steemitimages.com/DQmYFVEbHdUquhy4zJXEsTVfXtUkHooS3dPF9kD6BtPjQrk/Bitcoin-Price.jpg) 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?". &nbsp;Value of any asset simply comes from the demand. &nbsp;The demand is influenced both by the utility and the scarcity (aka supply). &nbsp;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. &nbsp;Setting supply aside, let's look at the value derived from utility. Utility encompasses both today's utility and tomorrow's utility (speculation). &nbsp;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. &nbsp;This drives up demand on a scarce resource. &nbsp;The speculated utility is based on predicting the future, something humans are pretty terrible at. &nbsp;Because of the uncertainty of the future, humans rely upon emotion to speculate their prediction. &nbsp;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. &nbsp;Utility today can be seen through disintermediation, better control of assets, remittances, entertainment, diversification, medium of exchange, etc. &nbsp;Many (more) cryptocurrencies have purely speculative value, which makes them naturally more risky. &nbsp;It's important to understand that cryptocurrencies are diverse and fall under a wide range on this scale. &nbsp;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 InfoBlock #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": "![Bitcoin.jpg](https://steemitimages.com/DQmYFVEbHdUquhy4zJXEsTVfXtUkHooS3dPF9kD6BtPjQrk/Bitcoin-Price.jpg)\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?\". &nbsp;Value of any asset simply comes from the demand. &nbsp;The demand is influenced both by the utility and the scarcity (aka supply). &nbsp;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. &nbsp;Setting supply aside, let's look at the value derived from utility.\n\nUtility encompasses both today's utility and tomorrow's utility (speculation). &nbsp;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. &nbsp;This drives up demand on a scarce resource. &nbsp;The speculated utility is based on predicting the future, something humans are pretty terrible at. &nbsp;Because of the uncertainty of the future, humans rely upon emotion to speculate their prediction. &nbsp;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. &nbsp;Utility today can be seen through disintermediation, better control of assets, remittances, entertainment, diversification, medium of exchange, etc. &nbsp;Many (more) cryptocurrencies have purely speculative value, which makes them naturally more risky. &nbsp;It's important to understand that cryptocurrencies are diverse and fall under a wide range on this scale. &nbsp;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\"}"
    }
  ]
}
2018/02/03 22:46:21
voterbornswift
authorbornswift
permlinkwelcome-to-the-revolution
weight10000 (100.00%)
Transaction InfoBlock #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
    }
  ]
}

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
[
  "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"
]