VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.217USD
STEEM
0.000STEEM
SBD
0.000SBD
Own SP
3.747SP
Detailed Balance
| STEEM | ||
| balance | 0.000STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 3.747SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 0.000SP | SP |
| Effective Power | 3.747SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"balance": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"reward_steem_balance": "0.000 STEEM",
"vesting_shares": "6091.282774 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "0.000000 VESTS",
"sbd_balance": "0.000 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.000 SBD",
"conversions": []
}Account Info
| name | goam |
| id | 1062036 |
| rank | 1,067,389 |
| reputation | 498125518 |
| created | 2018-06-27T07:20:15 |
| recovery_account | anonsteem |
| proxy | None |
| post_count | 55 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2018-06-29T04:51:09 |
| last_root_post | 2018-06-29T04:51:09 |
| last_vote_time | 1970-01-01T00:00:00 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 10,000 |
| delayed_votes | 0 |
| balance | 0.000 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 6091.282774 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 0.000000 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 2018-06-27T07:23:33 |
| last_account_update | 2018-06-29T05:26:42 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-01-01T00:00:00 |
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM84xfAGfEDWhoBAFE54ntYpkj4diMm6E4KvGvGrkNwPkJEY1jCN",
1
]
],
"weight_threshold": 1
},
"balance": "0.000 STEEM",
"can_vote": true,
"comment_count": 0,
"created": "2018-06-27T07:20:15",
"curation_rewards": 0,
"delegated_vesting_shares": "0.000000 VESTS",
"downvote_manabar": {
"current_mana": 0,
"last_update_time": 1530084015
},
"guest_bloggers": [],
"id": 1062036,
"json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg\",\"cover_image\":\"https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG\",\"name\":\"Ethereum Dev Course\"}}",
"last_account_recovery": "1970-01-01T00:00:00",
"last_account_update": "2018-06-29T05:26:42",
"last_owner_update": "2018-06-27T07:23:33",
"last_post": "2018-06-29T04:51:09",
"last_root_post": "2018-06-29T04:51:09",
"last_vote_time": "1970-01-01T00:00:00",
"lifetime_vote_count": 0,
"market_history": [],
"memo_key": "STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL",
"mined": false,
"name": "goam",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"other_history": [],
"owner": {
"account_auths": [],
"key_auths": [
[
"STM6Dp2ufeAvpLaPdiMK9z5vYSUzo6Hf76koY5zzqV8VK6RrviQmh",
1
]
],
"weight_threshold": 1
},
"pending_claimed_accounts": 0,
"post_bandwidth": 0,
"post_count": 55,
"post_history": [],
"posting": {
"account_auths": [
[
"dbooks",
1
],
[
"dtube.app",
1
]
],
"key_auths": [
[
"STM8DWSHcVGfyumzTBm5v9UEwSBbgndfvUrAPRGghG4XPCmKotWZa",
1
]
],
"weight_threshold": 1
},
"posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg\",\"cover_image\":\"https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG\",\"name\":\"Ethereum Dev Course\"}}",
"posting_rewards": 0,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"proxy": "",
"received_vesting_shares": "0.000000 VESTS",
"recovery_account": "anonsteem",
"reputation": 498125518,
"reset_account": "null",
"reward_sbd_balance": "0.000 SBD",
"reward_steem_balance": "0.000 STEEM",
"reward_vesting_balance": "0.000000 VESTS",
"reward_vesting_steem": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"savings_sbd_balance": "0.000 SBD",
"savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_sbd_seconds": "0",
"savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
"savings_withdraw_requests": 0,
"sbd_balance": "0.000 SBD",
"sbd_last_interest_payment": "1970-01-01T00:00:00",
"sbd_seconds": "0",
"sbd_seconds_last_update": "1970-01-01T00:00:00",
"tags_usage": [],
"to_withdraw": 0,
"transfer_history": [],
"vesting_balance": "0.000 STEEM",
"vesting_shares": "6091.282774 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"vote_history": [],
"voting_manabar": {
"current_mana": 10000,
"last_update_time": 1530084015
},
"voting_power": 10000,
"withdraw_routes": 0,
"withdrawn": 0,
"witness_votes": [],
"witnesses_voted_for": 0,
"rank": 1067389
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
2019/06/27 08:07:06
2019/06/27 08:07:06
| author | steemitboard |
| body | Congratulations @goam! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@goam/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@goam) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=goam)_</sub> ###### [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"]} |
| parent author | goam |
| parent permlink | v4d6uk5t |
| permlink | steemitboard-notify-goam-20190627t080705000z |
| title | |
| Transaction Info | Block #34160587/Trx eedb9e8b9c27d32035bf5b02e5d226fb0261d1f9 |
View Raw JSON Data
{
"block": 34160587,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @goam! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@goam/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@goam) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=goam)_</sub>\n\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\"]}",
"parent_author": "goam",
"parent_permlink": "v4d6uk5t",
"permlink": "steemitboard-notify-goam-20190627t080705000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2019-06-27T08:07:06",
"trx_id": "eedb9e8b9c27d32035bf5b02e5d226fb0261d1f9",
"trx_in_block": 3,
"virtual_op": 0
}goamupdated their account properties2018/06/29 05:26:42
goamupdated their account properties
2018/06/29 05:26:42
| account | goam |
| json metadata | {"profile":{"profile_image":"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg","cover_image":"https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG","name":"Ethereum Dev Course"}} |
| memo key | STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL |
| posting | {"account_auths":[["dbooks",1],["dtube.app",1]],"key_auths":[["STM8DWSHcVGfyumzTBm5v9UEwSBbgndfvUrAPRGghG4XPCmKotWZa",1]],"weight_threshold":1} |
| Transaction Info | Block #23737961/Trx 510c9a1edf8a54c4dd2eff71640a2efbf9523c28 |
View Raw JSON Data
{
"block": 23737961,
"op": [
"account_update",
{
"account": "goam",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg\",\"cover_image\":\"https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG\",\"name\":\"Ethereum Dev Course\"}}",
"memo_key": "STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL",
"posting": {
"account_auths": [
[
"dbooks",
1
],
[
"dtube.app",
1
]
],
"key_auths": [
[
"STM8DWSHcVGfyumzTBm5v9UEwSBbgndfvUrAPRGghG4XPCmKotWZa",
1
]
],
"weight_threshold": 1
}
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T05:26:42",
"trx_id": "510c9a1edf8a54c4dd2eff71640a2efbf9523c28",
"trx_in_block": 19,
"virtual_op": 0
}2018/06/29 05:18:03
2018/06/29 05:18:03
| author | goam |
| permlink | bbus3rl6 |
| voter | anomaly |
| weight | 100 (1.00%) |
| Transaction Info | Block #23737788/Trx b1d6c00d02d39862c2fd8d4d7b95709bb06f2fdf |
View Raw JSON Data
{
"block": 23737788,
"op": [
"vote",
{
"author": "goam",
"permlink": "bbus3rl6",
"voter": "anomaly",
"weight": 100
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T05:18:03",
"trx_id": "b1d6c00d02d39862c2fd8d4d7b95709bb06f2fdf",
"trx_in_block": 12,
"virtual_op": 0
}2018/06/29 05:12:09
2018/06/29 05:12:09
| author | goam |
| permlink | 539ewdz0 |
| voter | anomaly |
| weight | 100 (1.00%) |
| Transaction Info | Block #23737670/Trx 341d7e299d651376eafb645bad4c8ca553b532b4 |
View Raw JSON Data
{
"block": 23737670,
"op": [
"vote",
{
"author": "goam",
"permlink": "539ewdz0",
"voter": "anomaly",
"weight": 100
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T05:12:09",
"trx_id": "341d7e299d651376eafb645bad4c8ca553b532b4",
"trx_in_block": 36,
"virtual_op": 0
}thetroublenotesupvoted (0.30%) @goam / o416ruwy2018/06/29 05:03:03
thetroublenotesupvoted (0.30%) @goam / o416ruwy
2018/06/29 05:03:03
| author | goam |
| permlink | o416ruwy |
| voter | thetroublenotes |
| weight | 30 (0.30%) |
| Transaction Info | Block #23737488/Trx 8648763c97e4f28119be2dd5ccd8a3fed771c266 |
View Raw JSON Data
{
"block": 23737488,
"op": [
"vote",
{
"author": "goam",
"permlink": "o416ruwy",
"voter": "thetroublenotes",
"weight": 30
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T05:03:03",
"trx_id": "8648763c97e4f28119be2dd5ccd8a3fed771c266",
"trx_in_block": 3,
"virtual_op": 0
}2018/06/29 05:01:06
2018/06/29 05:01:06
| author | goam |
| permlink | vxss8el8 |
| voter | anomaly |
| weight | 100 (1.00%) |
| Transaction Info | Block #23737449/Trx ef7f2df4eac21bf0adba63f15be15f700b510409 |
View Raw JSON Data
{
"block": 23737449,
"op": [
"vote",
{
"author": "goam",
"permlink": "vxss8el8",
"voter": "anomaly",
"weight": 100
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T05:01:06",
"trx_id": "ef7f2df4eac21bf0adba63f15be15f700b510409",
"trx_in_block": 18,
"virtual_op": 0
}2018/06/29 04:56:12
2018/06/29 04:56:12
| author | goam |
| permlink | 1nw1q9sw |
| voter | anomaly |
| weight | 100 (1.00%) |
| Transaction Info | Block #23737351/Trx 8488a0a1282257047bd08f5433dbc240dd22a8ca |
View Raw JSON Data
{
"block": 23737351,
"op": [
"vote",
{
"author": "goam",
"permlink": "1nw1q9sw",
"voter": "anomaly",
"weight": 100
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:56:12",
"trx_id": "8488a0a1282257047bd08f5433dbc240dd22a8ca",
"trx_in_block": 14,
"virtual_op": 0
}2018/06/29 04:53:45
2018/06/29 04:53:45
| author | goam |
| permlink | v4d6uk5t |
| voter | steemread |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23737302/Trx 5f5bfd4d74ddf102ed9701d8e93ed27d2b960c43 |
View Raw JSON Data
{
"block": 23737302,
"op": [
"vote",
{
"author": "goam",
"permlink": "v4d6uk5t",
"voter": "steemread",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:53:45",
"trx_id": "5f5bfd4d74ddf102ed9701d8e93ed27d2b960c43",
"trx_in_block": 23,
"virtual_op": 0
}2018/06/29 04:51:09
2018/06/29 04:51:09
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | v4d6uk5t |
| Transaction Info | Block #23737250/Trx 5760326d0ed97febe0b84c244df04b5a552d533d |
View Raw JSON Data
{
"block": 23737250,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "v4d6uk5t"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:51:09",
"trx_id": "5760326d0ed97febe0b84c244df04b5a552d533d",
"trx_in_block": 33,
"virtual_op": 0
}2018/06/29 04:51:09
2018/06/29 04:51:09
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/v4d6uk5t'><img src='https://ipfs.io/ipfs/QmYGarBXc812xbJx6CNNwvcCY7g2gQsksy9qKesYXCQjKx'></a></center><hr> What are Ethereum Improvement Proposals (or EIPs)? Ethereum is an open source project with no one company or organization that controls the direction of the project. There is an open governance model where everyone is free to propose and discuss changes to the system. The EIP system is the forum to do this. You can view the EIP website here: https://eips.ethereum.org/ Some notable features of the EIP system are the submissions are open to everyone with a github account, which is very easy to get. The incorporation of a proposal into the platform is dictated by the quality of the idea rather than the reputation of the proposer. There are several different stages that an EIP can be in. Draft EIPs are works in progress, are open for consideration and discussed on github. Accepted EIPs can be expected to be included in the next hard fork. Final EIPs are proposals that have already been adopted and deferred EIPs are not being considered for immediate adoption, but may be considered again in the future. The structure of an EIP is important for clear and effective communication among so many project participants. An EIP includes the following sections: * Preamble (metadata) * Simple summary * Abstract - A short description of the issue * Motivation - Why is the existing protocol inadequate * Specification - Describes the syntax and semantics of the new feature * Rationale - Why did you make these design decisions? * Backwards compatibility - Explain any backward incompatibilities and how they will be addressed * Test Cases - These are mandatory for EIPs proposing consensus changes * Implementation - What does an implementation of the EIP look like? This section must be completed before the EIP is given the status “Final”. In practice, this system creates a set of community standards for changing the project. # EIP-20, a Standard Token Interface: https://eips.ethereum.org/EIPS/eip-20 Let’s look at one of the most popular EIPs, EIP-20 which specifies a standardized token interface. The implementation specification enables easy interoperability between Ethereum tokens and allows applications with complex functionality to reliably handle Ethereum tokens. The development of tokens on Ethereum is under active development. The following EIPs are in the draft phase. Explore these EIPs to follow the development of token standards. https://eips.ethereum.org/EIPS/eip-721 https://eips.ethereum.org/EIPS/eip-918 https://eips.ethereum.org/EIPS/eip-777 https://eips.ethereum.org/EIPS/eip-1046 https://eips.ethereum.org/EIPS/eip-1080 https://github.com/ethereum/EIPs https://medium.com/@codetractio/walkthrough-of-an-ethereum-improvement-proposal-eip-6fda3966d171 https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md https://theethereum.wiki/w/index.php/ERC20_Token_Standard https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md <hr><a href='https://d.tube/#!/v/goam/v4d6uk5t'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmSJeLm5GGRy9ubZ5MKzAaS1BfnqdSYStcdVMEUKSYKe4J'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #55: The Ethereum Improvement Proposal","snaphash":"QmZGryc81RnbsJnBDW3mh4E44iQaeNoQoJeUcGf76CDTYT","author":"goam","permlink":"v4d6uk5t","duration":95.039274,"filesize":8529929,"spritehash":"QmNgETLPbnsggdewpr5Lv7hM1Y5xR7DMGGGB3QQmkxbZCf"},"content":{"videohash":"QmSJeLm5GGRy9ubZ5MKzAaS1BfnqdSYStcdVMEUKSYKe4J","description":"What are Ethereum Improvement Proposals (or EIPs)?\n\nEthereum is an open source project with no one company or organization that controls the direction of the project. There is an open governance model where everyone is free to propose and discuss changes to the system. The EIP system is the forum to do this. You can view the EIP website here: https://eips.ethereum.org/\n\nSome notable features of the EIP system are the submissions are open to everyone with a github account, which is very easy to get. The incorporation of a proposal into the platform is dictated by the quality of the idea rather than the reputation of the proposer. \n\nThere are several different stages that an EIP can be in. Draft EIPs are works in progress, are open for consideration and discussed on github. Accepted EIPs can be expected to be included in the next hard fork. Final EIPs are proposals that have already been adopted and deferred EIPs are not being considered for immediate adoption, but may be considered again in the future.\n\nThe structure of an EIP is important for clear and effective communication among so many project participants. An EIP includes the following sections:\n\n* Preamble (metadata)\n* Simple summary\n* Abstract - A short description of the issue\n* Motivation - Why is the existing protocol inadequate\n* Specification - Describes the syntax and semantics of the new feature\n* Rationale - Why did you make these design decisions?\n* Backwards compatibility - Explain any backward incompatibilities and how they will be addressed\n* Test Cases - These are mandatory for EIPs proposing consensus changes\n* Implementation - What does an implementation of the EIP look like? This section must be completed before the EIP is given the status “Final”.\n\nIn practice, this system creates a set of community standards for changing the project. \n\n# EIP-20, a Standard Token Interface: https://eips.ethereum.org/EIPS/eip-20\n\nLet’s look at one of the most popular EIPs, EIP-20 which specifies a standardized token interface. The implementation specification enables easy interoperability between Ethereum tokens and allows applications with complex functionality to reliably handle Ethereum tokens. \n\nThe development of tokens on Ethereum is under active development. The following EIPs are in the draft phase. Explore these EIPs to follow the development of token standards.\n\nhttps://eips.ethereum.org/EIPS/eip-721\nhttps://eips.ethereum.org/EIPS/eip-918\nhttps://eips.ethereum.org/EIPS/eip-777\nhttps://eips.ethereum.org/EIPS/eip-1046\nhttps://eips.ethereum.org/EIPS/eip-1080\nhttps://github.com/ethereum/EIPs\nhttps://medium.com/@codetractio/walkthrough-of-an-ethereum-improvement-proposal-eip-6fda3966d171\nhttps://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md\nhttps://theethereum.wiki/w/index.php/ERC20_Token_Standard\nhttps://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md","tags":["ethereum","blockchain","developer","education"],"video240hash":"QmWHdwjkDhgy3mDpCqdnSPw8k3qyuRQr3erwVDtLs9Ymng","video480hash":"Qme16BCcYVd4hk5nznd9WpeJ7M3GDBMv3crRJR7QR31NMN"}},"tags":["ethereum","blockchain","developer","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | v4d6uk5t |
| title | Ethereum #55: The Ethereum Improvement Proposal |
| Transaction Info | Block #23737250/Trx 5760326d0ed97febe0b84c244df04b5a552d533d |
View Raw JSON Data
{
"block": 23737250,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/v4d6uk5t'><img src='https://ipfs.io/ipfs/QmYGarBXc812xbJx6CNNwvcCY7g2gQsksy9qKesYXCQjKx'></a></center><hr>\n\nWhat are Ethereum Improvement Proposals (or EIPs)?\n\nEthereum is an open source project with no one company or organization that controls the direction of the project. There is an open governance model where everyone is free to propose and discuss changes to the system. The EIP system is the forum to do this. You can view the EIP website here: https://eips.ethereum.org/\n\nSome notable features of the EIP system are the submissions are open to everyone with a github account, which is very easy to get. The incorporation of a proposal into the platform is dictated by the quality of the idea rather than the reputation of the proposer. \n\nThere are several different stages that an EIP can be in. Draft EIPs are works in progress, are open for consideration and discussed on github. Accepted EIPs can be expected to be included in the next hard fork. Final EIPs are proposals that have already been adopted and deferred EIPs are not being considered for immediate adoption, but may be considered again in the future.\n\nThe structure of an EIP is important for clear and effective communication among so many project participants. An EIP includes the following sections:\n\n* Preamble (metadata)\n* Simple summary\n* Abstract - A short description of the issue\n* Motivation - Why is the existing protocol inadequate\n* Specification - Describes the syntax and semantics of the new feature\n* Rationale - Why did you make these design decisions?\n* Backwards compatibility - Explain any backward incompatibilities and how they will be addressed\n* Test Cases - These are mandatory for EIPs proposing consensus changes\n* Implementation - What does an implementation of the EIP look like? This section must be completed before the EIP is given the status “Final”.\n\nIn practice, this system creates a set of community standards for changing the project. \n\n# EIP-20, a Standard Token Interface: https://eips.ethereum.org/EIPS/eip-20\n\nLet’s look at one of the most popular EIPs, EIP-20 which specifies a standardized token interface. The implementation specification enables easy interoperability between Ethereum tokens and allows applications with complex functionality to reliably handle Ethereum tokens. \n\nThe development of tokens on Ethereum is under active development. The following EIPs are in the draft phase. Explore these EIPs to follow the development of token standards.\n\nhttps://eips.ethereum.org/EIPS/eip-721\nhttps://eips.ethereum.org/EIPS/eip-918\nhttps://eips.ethereum.org/EIPS/eip-777\nhttps://eips.ethereum.org/EIPS/eip-1046\nhttps://eips.ethereum.org/EIPS/eip-1080\nhttps://github.com/ethereum/EIPs\nhttps://medium.com/@codetractio/walkthrough-of-an-ethereum-improvement-proposal-eip-6fda3966d171\nhttps://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md\nhttps://theethereum.wiki/w/index.php/ERC20_Token_Standard\nhttps://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n\n<hr><a href='https://d.tube/#!/v/goam/v4d6uk5t'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmSJeLm5GGRy9ubZ5MKzAaS1BfnqdSYStcdVMEUKSYKe4J'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #55: The Ethereum Improvement Proposal\",\"snaphash\":\"QmZGryc81RnbsJnBDW3mh4E44iQaeNoQoJeUcGf76CDTYT\",\"author\":\"goam\",\"permlink\":\"v4d6uk5t\",\"duration\":95.039274,\"filesize\":8529929,\"spritehash\":\"QmNgETLPbnsggdewpr5Lv7hM1Y5xR7DMGGGB3QQmkxbZCf\"},\"content\":{\"videohash\":\"QmSJeLm5GGRy9ubZ5MKzAaS1BfnqdSYStcdVMEUKSYKe4J\",\"description\":\"What are Ethereum Improvement Proposals (or EIPs)?\\n\\nEthereum is an open source project with no one company or organization that controls the direction of the project. There is an open governance model where everyone is free to propose and discuss changes to the system. The EIP system is the forum to do this. You can view the EIP website here: https://eips.ethereum.org/\\n\\nSome notable features of the EIP system are the submissions are open to everyone with a github account, which is very easy to get. The incorporation of a proposal into the platform is dictated by the quality of the idea rather than the reputation of the proposer. \\n\\nThere are several different stages that an EIP can be in. Draft EIPs are works in progress, are open for consideration and discussed on github. Accepted EIPs can be expected to be included in the next hard fork. Final EIPs are proposals that have already been adopted and deferred EIPs are not being considered for immediate adoption, but may be considered again in the future.\\n\\nThe structure of an EIP is important for clear and effective communication among so many project participants. An EIP includes the following sections:\\n\\n* Preamble (metadata)\\n* Simple summary\\n* Abstract - A short description of the issue\\n* Motivation - Why is the existing protocol inadequate\\n* Specification - Describes the syntax and semantics of the new feature\\n* Rationale - Why did you make these design decisions?\\n* Backwards compatibility - Explain any backward incompatibilities and how they will be addressed\\n* Test Cases - These are mandatory for EIPs proposing consensus changes\\n* Implementation - What does an implementation of the EIP look like? This section must be completed before the EIP is given the status “Final”.\\n\\nIn practice, this system creates a set of community standards for changing the project. \\n\\n# EIP-20, a Standard Token Interface: https://eips.ethereum.org/EIPS/eip-20\\n\\nLet’s look at one of the most popular EIPs, EIP-20 which specifies a standardized token interface. The implementation specification enables easy interoperability between Ethereum tokens and allows applications with complex functionality to reliably handle Ethereum tokens. \\n\\nThe development of tokens on Ethereum is under active development. The following EIPs are in the draft phase. Explore these EIPs to follow the development of token standards.\\n\\nhttps://eips.ethereum.org/EIPS/eip-721\\nhttps://eips.ethereum.org/EIPS/eip-918\\nhttps://eips.ethereum.org/EIPS/eip-777\\nhttps://eips.ethereum.org/EIPS/eip-1046\\nhttps://eips.ethereum.org/EIPS/eip-1080\\nhttps://github.com/ethereum/EIPs\\nhttps://medium.com/@codetractio/walkthrough-of-an-ethereum-improvement-proposal-eip-6fda3966d171\\nhttps://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md\\nhttps://theethereum.wiki/w/index.php/ERC20_Token_Standard\\nhttps://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\",\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\"],\"video240hash\":\"QmWHdwjkDhgy3mDpCqdnSPw8k3qyuRQr3erwVDtLs9Ymng\",\"video480hash\":\"Qme16BCcYVd4hk5nznd9WpeJ7M3GDBMv3crRJR7QR31NMN\"}},\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "v4d6uk5t",
"title": "Ethereum #55: The Ethereum Improvement Proposal"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:51:09",
"trx_id": "5760326d0ed97febe0b84c244df04b5a552d533d",
"trx_in_block": 33,
"virtual_op": 0
}sawant9171upvoted (100.00%) @goam / bbus3rl62018/06/29 04:47:21
sawant9171upvoted (100.00%) @goam / bbus3rl6
2018/06/29 04:47:21
| author | goam |
| permlink | bbus3rl6 |
| voter | sawant9171 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23737174/Trx 85ec72be86a6d99be80e55b094fc507c388b883d |
View Raw JSON Data
{
"block": 23737174,
"op": [
"vote",
{
"author": "goam",
"permlink": "bbus3rl6",
"voter": "sawant9171",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:47:21",
"trx_id": "85ec72be86a6d99be80e55b094fc507c388b883d",
"trx_in_block": 22,
"virtual_op": 0
}2018/06/29 04:46:06
2018/06/29 04:46:06
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | bbus3rl6 |
| Transaction Info | Block #23737149/Trx add281346c1e6718c47bb33bddb3671632d24d00 |
View Raw JSON Data
{
"block": 23737149,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "bbus3rl6"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:46:06",
"trx_id": "add281346c1e6718c47bb33bddb3671632d24d00",
"trx_in_block": 5,
"virtual_op": 0
}2018/06/29 04:46:06
2018/06/29 04:46:06
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/bbus3rl6'><img src='https://ipfs.io/ipfs/QmUT6cprx4r83fnxDeuyTTa1TLgK83oRFPsjSnkxAa81e2'></a></center><hr> Vyper is an experimental, contract-oriented, pythonic programming language that targets the Ethereum Virtual Machine (EVM). Vyper has a few principles and goals that aim to make it a language that is ideal for programming smart contracts. 1. Security is a primary focus for any smart contract language and Vyper maintains that “it should be possible and natural to build secure smart contracts in Vyper.” 2. Vyper code should be not just human readable, but make it difficult to write misleading code. This directive is aimed at making contract audits as successful as possible. 3. Striving for language and compiler simplicity support the other goals by keeping confusing complexity under control. To achieve these goals, Vyper implements the following features: 1. Bounds and overflow checking 2. Support for signed integers and decimal fixed point numbers 3. Decidability - Reliably compute upper bounds for gas consumption of any function call 3. Strong typing 4. Small and understandable compiler code 5. Limited support for pure functions There is a notable lack of the following features that are present in Solidity: 1. Modifiers - Modifiers make it easier to write misleading code. It encourages writing code where execution jumps around the source file, making audits more difficult. Vyper encourages inline checks in each function to improve clarity. 2. Class Inheritance - Inheritance also makes it easier to write misleading code. Contracts’ logic is spread across multiple files, decreasing readability and requires additional understanding about how inheritance works in case of conflicts. 3. Inline Assembly - Inline assembly makes it possible to manipulate variables without referencing it directly by name. This makes development and auditing more difficult and can obfuscate bugs. 4. Function overloading - Contracts with overloaded functions can be confusing. It may not be clear which function is being called in specific situations. 5. Operator overloading 6. Recursive calling - It is not possible to set an upper bound on gas limits in contracts with recursive calling 7. Infinite-length loops - It is not possible to set an upper bound on gas limits in contracts with infinite length loops 8. Binary fixed point - In binary fixed point, approximations are required (e.g. in Python 0.3 + 0.3 + 0.3 + 0.1 != 1). As you can see in the list of features that Vyper is lacking, writing clear, understandable code is of primary importance. Vyper is not trying to be a replacement for Solidity. It is meant to be a more security focused smart contract programming language and will likely not be able to do everything that Solidity can. You can view the latest documentation here: https://vyper.readthedocs.io/en/latest/index.html Vyper is a subset of Python syntax, making the syntax familiar to many developers. https://i.imgur.com/Q4Ldigb.png In Vyper, whitespace matters, so pay attention to spaces and tabs. Comment code using ‘#’. Vyper compiles to LLL. https://vyper.readthedocs.io/en/latest/index.html https://vyper.online/ https://medium.com/@daniel.jozsef/why-i-learned-to-stop-worrying-and-love-viper-part-1-c6ba7bda02f5 https://medium.com/@daniel.jozsef/how-i-learned-to-stop-worrying-and-love-vyper-part-2-c5d4bb7dcc64 https://medium.com/@daniel.jozsef/how-i-learned-to-stop-worrying-and-love-vyper-part-3-4031a70a60d9 https://medium.com/@maurelian/an-early-look-at-vyper-d101e0c349c1 <hr><a href='https://d.tube/#!/v/goam/bbus3rl6'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmbSbmrRAkAqSRz31rtSz1oBTts8N1e1fU3qFC7HqUM5fv'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #54: Vyper","snaphash":"QmX1pCwDyhshWGLn7GDVJC2QXt3JUAMevY8ebsBbiqs43V","author":"goam","permlink":"bbus3rl6","duration":87.353469,"filesize":8453096,"spritehash":"QmYeH2xjRTM8znfVpafbKaN37pH48gbGKspyNFLdQvboqy"},"content":{"videohash":"QmbSbmrRAkAqSRz31rtSz1oBTts8N1e1fU3qFC7HqUM5fv","description":"Vyper is an experimental, contract-oriented, pythonic programming language that targets the Ethereum Virtual Machine (EVM).\n\nVyper has a few principles and goals that aim to make it a language that is ideal for programming smart contracts. \n\n1. Security is a primary focus for any smart contract language and Vyper maintains that “it should be possible and natural to build secure smart contracts in Vyper.”\n2. Vyper code should be not just human readable, but make it difficult to write misleading code. This directive is aimed at making contract audits as successful as possible.\n3. Striving for language and compiler simplicity support the other goals by keeping confusing complexity under control. \n\nTo achieve these goals, Vyper implements the following features:\n\n1. Bounds and overflow checking\n2. Support for signed integers and decimal fixed point numbers\n3. Decidability - Reliably compute upper bounds for gas consumption of any function call\n3. Strong typing\n4. Small and understandable compiler code\n5. Limited support for pure functions\n\nThere is a notable lack of the following features that are present in Solidity:\n\n1. Modifiers - Modifiers make it easier to write misleading code. It encourages writing code where execution jumps around the source file, making audits more difficult. Vyper encourages inline checks in each function to improve clarity.\n2. Class Inheritance - Inheritance also makes it easier to write misleading code. Contracts’ logic is spread across multiple files, decreasing readability and requires additional understanding about how inheritance works in case of conflicts.\n3. Inline Assembly - Inline assembly makes it possible to manipulate variables without referencing it directly by name. This makes development and auditing more difficult and can obfuscate bugs.\n4. Function overloading - Contracts with overloaded functions can be confusing. It may not be clear which function is being called in specific situations.\n5. Operator overloading\n6. Recursive calling - It is not possible to set an upper bound on gas limits in contracts with recursive calling\n7. Infinite-length loops - It is not possible to set an upper bound on gas limits in contracts with infinite length loops\n8. Binary fixed point - In binary fixed point, approximations are required (e.g. in Python 0.3 + 0.3 + 0.3 + 0.1 != 1).\n\nAs you can see in the list of features that Vyper is lacking, writing clear, understandable code is of primary importance.\n\nVyper is not trying to be a replacement for Solidity. It is meant to be a more security focused smart contract programming language and will likely not be able to do everything that Solidity can. \n\nYou can view the latest documentation here: https://vyper.readthedocs.io/en/latest/index.html\n\nVyper is a subset of Python syntax, making the syntax familiar to many developers.\n\nhttps://i.imgur.com/Q4Ldigb.png\n\nIn Vyper, whitespace matters, so pay attention to spaces and tabs. Comment code using ‘#’.\n\nVyper compiles to LLL.\n\nhttps://vyper.readthedocs.io/en/latest/index.html\nhttps://vyper.online/\nhttps://medium.com/@daniel.jozsef/why-i-learned-to-stop-worrying-and-love-viper-part-1-c6ba7bda02f5\nhttps://medium.com/@daniel.jozsef/how-i-learned-to-stop-worrying-and-love-vyper-part-2-c5d4bb7dcc64\nhttps://medium.com/@daniel.jozsef/how-i-learned-to-stop-worrying-and-love-vyper-part-3-4031a70a60d9\nhttps://medium.com/@maurelian/an-early-look-at-vyper-d101e0c349c1","tags":["ethereum","developer","blockchain","education"],"video240hash":"Qmc85G6TWpgHUYiuiFGLpD6STtfVHPYkEVxYF2R7DLVQXj","video480hash":"QmPKsDn684xhGpurUpWVWuUEyBQcn5p5YjUehdZP6TSMto"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | bbus3rl6 |
| title | Ethereum #54: Vyper |
| Transaction Info | Block #23737149/Trx add281346c1e6718c47bb33bddb3671632d24d00 |
View Raw JSON Data
{
"block": 23737149,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/bbus3rl6'><img src='https://ipfs.io/ipfs/QmUT6cprx4r83fnxDeuyTTa1TLgK83oRFPsjSnkxAa81e2'></a></center><hr>\n\nVyper is an experimental, contract-oriented, pythonic programming language that targets the Ethereum Virtual Machine (EVM).\n\nVyper has a few principles and goals that aim to make it a language that is ideal for programming smart contracts. \n\n1. Security is a primary focus for any smart contract language and Vyper maintains that “it should be possible and natural to build secure smart contracts in Vyper.”\n2. Vyper code should be not just human readable, but make it difficult to write misleading code. This directive is aimed at making contract audits as successful as possible.\n3. Striving for language and compiler simplicity support the other goals by keeping confusing complexity under control. \n\nTo achieve these goals, Vyper implements the following features:\n\n1. Bounds and overflow checking\n2. Support for signed integers and decimal fixed point numbers\n3. Decidability - Reliably compute upper bounds for gas consumption of any function call\n3. Strong typing\n4. Small and understandable compiler code\n5. Limited support for pure functions\n\nThere is a notable lack of the following features that are present in Solidity:\n\n1. Modifiers - Modifiers make it easier to write misleading code. It encourages writing code where execution jumps around the source file, making audits more difficult. Vyper encourages inline checks in each function to improve clarity.\n2. Class Inheritance - Inheritance also makes it easier to write misleading code. Contracts’ logic is spread across multiple files, decreasing readability and requires additional understanding about how inheritance works in case of conflicts.\n3. Inline Assembly - Inline assembly makes it possible to manipulate variables without referencing it directly by name. This makes development and auditing more difficult and can obfuscate bugs.\n4. Function overloading - Contracts with overloaded functions can be confusing. It may not be clear which function is being called in specific situations.\n5. Operator overloading\n6. Recursive calling - It is not possible to set an upper bound on gas limits in contracts with recursive calling\n7. Infinite-length loops - It is not possible to set an upper bound on gas limits in contracts with infinite length loops\n8. Binary fixed point - In binary fixed point, approximations are required (e.g. in Python 0.3 + 0.3 + 0.3 + 0.1 != 1).\n\nAs you can see in the list of features that Vyper is lacking, writing clear, understandable code is of primary importance.\n\nVyper is not trying to be a replacement for Solidity. It is meant to be a more security focused smart contract programming language and will likely not be able to do everything that Solidity can. \n\nYou can view the latest documentation here: https://vyper.readthedocs.io/en/latest/index.html\n\nVyper is a subset of Python syntax, making the syntax familiar to many developers.\n\nhttps://i.imgur.com/Q4Ldigb.png\n\nIn Vyper, whitespace matters, so pay attention to spaces and tabs. Comment code using ‘#’.\n\nVyper compiles to LLL.\n\nhttps://vyper.readthedocs.io/en/latest/index.html\nhttps://vyper.online/\nhttps://medium.com/@daniel.jozsef/why-i-learned-to-stop-worrying-and-love-viper-part-1-c6ba7bda02f5\nhttps://medium.com/@daniel.jozsef/how-i-learned-to-stop-worrying-and-love-vyper-part-2-c5d4bb7dcc64\nhttps://medium.com/@daniel.jozsef/how-i-learned-to-stop-worrying-and-love-vyper-part-3-4031a70a60d9\nhttps://medium.com/@maurelian/an-early-look-at-vyper-d101e0c349c1\n\n<hr><a href='https://d.tube/#!/v/goam/bbus3rl6'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmbSbmrRAkAqSRz31rtSz1oBTts8N1e1fU3qFC7HqUM5fv'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #54: Vyper\",\"snaphash\":\"QmX1pCwDyhshWGLn7GDVJC2QXt3JUAMevY8ebsBbiqs43V\",\"author\":\"goam\",\"permlink\":\"bbus3rl6\",\"duration\":87.353469,\"filesize\":8453096,\"spritehash\":\"QmYeH2xjRTM8znfVpafbKaN37pH48gbGKspyNFLdQvboqy\"},\"content\":{\"videohash\":\"QmbSbmrRAkAqSRz31rtSz1oBTts8N1e1fU3qFC7HqUM5fv\",\"description\":\"Vyper is an experimental, contract-oriented, pythonic programming language that targets the Ethereum Virtual Machine (EVM).\\n\\nVyper has a few principles and goals that aim to make it a language that is ideal for programming smart contracts. \\n\\n1. Security is a primary focus for any smart contract language and Vyper maintains that “it should be possible and natural to build secure smart contracts in Vyper.”\\n2. Vyper code should be not just human readable, but make it difficult to write misleading code. This directive is aimed at making contract audits as successful as possible.\\n3. Striving for language and compiler simplicity support the other goals by keeping confusing complexity under control. \\n\\nTo achieve these goals, Vyper implements the following features:\\n\\n1. Bounds and overflow checking\\n2. Support for signed integers and decimal fixed point numbers\\n3. Decidability - Reliably compute upper bounds for gas consumption of any function call\\n3. Strong typing\\n4. Small and understandable compiler code\\n5. Limited support for pure functions\\n\\nThere is a notable lack of the following features that are present in Solidity:\\n\\n1. Modifiers - Modifiers make it easier to write misleading code. It encourages writing code where execution jumps around the source file, making audits more difficult. Vyper encourages inline checks in each function to improve clarity.\\n2. Class Inheritance - Inheritance also makes it easier to write misleading code. Contracts’ logic is spread across multiple files, decreasing readability and requires additional understanding about how inheritance works in case of conflicts.\\n3. Inline Assembly - Inline assembly makes it possible to manipulate variables without referencing it directly by name. This makes development and auditing more difficult and can obfuscate bugs.\\n4. Function overloading - Contracts with overloaded functions can be confusing. It may not be clear which function is being called in specific situations.\\n5. Operator overloading\\n6. Recursive calling - It is not possible to set an upper bound on gas limits in contracts with recursive calling\\n7. Infinite-length loops - It is not possible to set an upper bound on gas limits in contracts with infinite length loops\\n8. Binary fixed point - In binary fixed point, approximations are required (e.g. in Python 0.3 + 0.3 + 0.3 + 0.1 != 1).\\n\\nAs you can see in the list of features that Vyper is lacking, writing clear, understandable code is of primary importance.\\n\\nVyper is not trying to be a replacement for Solidity. It is meant to be a more security focused smart contract programming language and will likely not be able to do everything that Solidity can. \\n\\nYou can view the latest documentation here: https://vyper.readthedocs.io/en/latest/index.html\\n\\nVyper is a subset of Python syntax, making the syntax familiar to many developers.\\n\\nhttps://i.imgur.com/Q4Ldigb.png\\n\\nIn Vyper, whitespace matters, so pay attention to spaces and tabs. Comment code using ‘#’.\\n\\nVyper compiles to LLL.\\n\\nhttps://vyper.readthedocs.io/en/latest/index.html\\nhttps://vyper.online/\\nhttps://medium.com/@daniel.jozsef/why-i-learned-to-stop-worrying-and-love-viper-part-1-c6ba7bda02f5\\nhttps://medium.com/@daniel.jozsef/how-i-learned-to-stop-worrying-and-love-vyper-part-2-c5d4bb7dcc64\\nhttps://medium.com/@daniel.jozsef/how-i-learned-to-stop-worrying-and-love-vyper-part-3-4031a70a60d9\\nhttps://medium.com/@maurelian/an-early-look-at-vyper-d101e0c349c1\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"Qmc85G6TWpgHUYiuiFGLpD6STtfVHPYkEVxYF2R7DLVQXj\",\"video480hash\":\"QmPKsDn684xhGpurUpWVWuUEyBQcn5p5YjUehdZP6TSMto\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "bbus3rl6",
"title": "Ethereum #54: Vyper"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:46:06",
"trx_id": "add281346c1e6718c47bb33bddb3671632d24d00",
"trx_in_block": 5,
"virtual_op": 0
}2018/06/29 04:40:12
2018/06/29 04:40:12
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | 539ewdz0 |
| Transaction Info | Block #23737031/Trx 05e26cd22d95f1031111420da1766ec129566ab8 |
View Raw JSON Data
{
"block": 23737031,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "539ewdz0"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:40:12",
"trx_id": "05e26cd22d95f1031111420da1766ec129566ab8",
"trx_in_block": 34,
"virtual_op": 0
}2018/06/29 04:40:12
2018/06/29 04:40:12
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/539ewdz0'><img src='https://ipfs.io/ipfs/QmPjqvKWvreo1G4ReicrB3XNTSgSxv7wZFSDFzhhN1r78Z'></a></center><hr> Let’s start by diving right into an abstruse example of the low-level lisp-like language (LLL). { [[69]] (caller ) (return 0 (lll (when (= (caller) @@69) (for {} (< @i (calldatasize)) [i](+ @i 64) [[ (calldataload @i) ]] (calldataload (+ @i 32)) ) ) 0)) } As the name suggests, LLL is a low level language. It operates more closely to the EVM bytecode than higher level languages like Solidity or Vyper. LLL has direct access to storage and memory of the EVM so you can determine exactly where your data sits. When you use an EVM opcode in LLL, it translates directly to the bytecode representation of that opcode. In fact, all EVM opcodes are available to LLL. It produces smaller binaries that Solidity. As an example, reimplementing uPort's registry contract in LLL. The Solidity implementation comes in at 591 bytes, compiled with the optimize flag. Admittedly, this is pretty small. But the LLL implementation compiles to 171 bytes. So in this case the LLL version is about 70% smaller than the Solidity version. That matters a lot when a contract will be accessed many times. It also makes deployment less costly. This is an extreme case, of course. Generally LLL binaries are about 30 to 40% smaller than the equivalent in Solidity. LLL is considered lisp like because of its syntax. There are many parenthesis compared to other smart contract languages. LLL uses symbolic expression. Symbolic expressions are a notation for nested list data. Lisp developers generally use indentation to indicate code blocks. LLL also uses prefix notation, where operators are placed to the left of their operands. Infix notation is the more familiar notation (2 + 3), which looks like (+ 2 3) in prefix notation. The expression (+ @i 64) adds i and 64. “Symbolic expressions are a means of representing semistructured data in human readable text form mostly composed of symbols and lists and extensively used in the Lisp programming language.” -yourdictionary.com # An example of LLL ;; check that the caller is the node owner (def ‘only-node-owner (node) (when (!= caller) (get-owner-node)) (panic)) LLL uses semicolons for comments. def starts the definition of an LLL macro. Macros can be used to clarify your code. They aren't even close to the power of Lisp macros. They're more like the C macro system. They do a simple substitution. Here we're defining a macro called only-node-owner. This will be used as a modifier to ensure that only the node owner can execute a block of code. So when only-node-owner is used in the source, the macro will be looked up and its definition will be compiled into the bytecode. Macros can take parameters. In this case the node's ID. The rest of the code is what will be substituted at compile time when the macro is invoked. Here you can see the use of symbolic expressions and prefix notation. Everything is composed of lists defined within matching parentheses. Prefix notation can be seen with the use of !=. That operator comes first, and its operands follow. One of the != operands uses another macro I defined that's not shown here, called get-owner. So you can see that it's easy to build up complex code but keep things clear with the use of macros. There is actually an LLL contract deployed on the mainnet. The registry contract of the Ethereum Name service (ENS) was written in LLL mainly because of the gas savings due to its size and the brevity of its code. It's the contract in the ENS system that's called more than any other. Check out the github (https://github.com/ethereum/ens) for details about the LLL contracts as well as the Solidity counterparts. <hr><a href='https://d.tube/#!/v/goam/539ewdz0'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYbfaJomGaPNEUgUG9TPn9PvZ25bzx1gZnm5DQNVTMLfs'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #53: LLL","snaphash":"QmTkbwq6hZwjBCrSFJriVgQXLCctkQX4wJSfSiX3Qrt4Zz","author":"goam","permlink":"539ewdz0","duration":84.752834,"filesize":8943271,"spritehash":"QmUb9n9PGGRj2byjBt4jozBuE3V2rZXA28bUwVgac2j95W"},"content":{"videohash":"QmYbfaJomGaPNEUgUG9TPn9PvZ25bzx1gZnm5DQNVTMLfs","description":"Let’s start by diving right into an abstruse example of the low-level lisp-like language (LLL).\n\n { \n [[69]] (caller ) \n (return 0 (lll \n (when (= (caller) @@69) \n (for {} (< @i (calldatasize)) [i](+ @i 64) \n [[ (calldataload @i) ]] (calldataload (+ @i 32)) \n ) \n ) \n 0)) \n } \n\nAs the name suggests, LLL is a low level language. It operates more closely to the EVM bytecode than higher level languages like Solidity or Vyper.\n\nLLL has direct access to storage and memory of the EVM so you can determine exactly where your data sits. When you use an EVM opcode in LLL, it translates directly to the bytecode representation of that opcode. In fact, all EVM opcodes are available to LLL.\n\nIt produces smaller binaries that Solidity. As an example, reimplementing uPort's registry contract in LLL. The Solidity implementation comes in at 591 bytes, compiled with the optimize flag. Admittedly, this is pretty small. But the LLL implementation compiles to 171 bytes. So in this case the LLL version is about 70% smaller than the Solidity version. That matters a lot when a contract will be accessed many times. It also makes deployment less costly. This is an extreme case, of course. Generally LLL binaries are about 30 to 40% smaller than the equivalent in Solidity.\n\nLLL is considered lisp like because of its syntax. There are many parenthesis compared to other smart contract languages. LLL uses symbolic expression. Symbolic expressions are a notation for nested list data.\n\nLisp developers generally use indentation to indicate code blocks.\n\nLLL also uses prefix notation, where operators are placed to the left of their operands. Infix notation is the more familiar notation (2 + 3), which looks like (+ 2 3) in prefix notation. The expression (+ @i 64) adds i and 64.\n\n“Symbolic expressions are a means of representing semistructured data in human readable text form mostly composed of symbols and lists and extensively used in the Lisp programming language.” -yourdictionary.com\n\n# An example of LLL\n\n;; check that the caller is the node owner \n\n(def ‘only-node-owner (node) \n \t(when (!= caller) (get-owner-node)) \n (panic)) \n\nLLL uses semicolons for comments.\n\ndef starts the definition of an LLL macro. Macros can be used to clarify your code. They aren't even close to the power of Lisp macros. They're more like the C macro system. They do a simple substitution.\n\nHere we're defining a macro called only-node-owner. This will be used as a modifier to ensure that only the node owner can execute a block of code. So when only-node-owner is used in the source, the macro will be looked up and its definition will be compiled into the bytecode.\n\nMacros can take parameters. In this case the node's ID.\n\nThe rest of the code is what will be substituted at compile time when the macro is invoked. Here you can see the use of symbolic expressions and prefix notation. Everything is composed of lists defined within matching parentheses. Prefix notation can be seen with the use of !=. That operator comes first, and its operands follow. One of the != operands uses another macro I defined that's not shown here, called get-owner. So you can see that it's easy to build up complex code but keep things clear with the use of macros.\n\nThere is actually an LLL contract deployed on the mainnet. The registry contract of the Ethereum Name service (ENS) was written in LLL mainly because of the gas savings due to its size and the brevity of its code. It's the contract in the ENS system that's called more than any other.\n\nCheck out the github (https://github.com/ethereum/ens) for details about the LLL contracts as well as the Solidity counterparts.","tags":["ethereum","blockchain","developer","education"],"video240hash":"QmVcmwo6guCHajyaJJdMopssie3gUr1pLzcvXD6sjJHW3W","video480hash":"QmZutwFXqcXaULNwyUU2kaMQLCstS4p6PijuPfLNbH2xBd"}},"tags":["ethereum","blockchain","developer","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 539ewdz0 |
| title | Ethereum #53: LLL |
| Transaction Info | Block #23737031/Trx 05e26cd22d95f1031111420da1766ec129566ab8 |
View Raw JSON Data
{
"block": 23737031,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/539ewdz0'><img src='https://ipfs.io/ipfs/QmPjqvKWvreo1G4ReicrB3XNTSgSxv7wZFSDFzhhN1r78Z'></a></center><hr>\n\nLet’s start by diving right into an abstruse example of the low-level lisp-like language (LLL).\n\n { \n [[69]] (caller ) \n (return 0 (lll \n (when (= (caller) @@69) \n (for {} (< @i (calldatasize)) [i](+ @i 64) \n [[ (calldataload @i) ]] (calldataload (+ @i 32)) \n ) \n ) \n 0)) \n } \n\nAs the name suggests, LLL is a low level language. It operates more closely to the EVM bytecode than higher level languages like Solidity or Vyper.\n\nLLL has direct access to storage and memory of the EVM so you can determine exactly where your data sits. When you use an EVM opcode in LLL, it translates directly to the bytecode representation of that opcode. In fact, all EVM opcodes are available to LLL.\n\nIt produces smaller binaries that Solidity. As an example, reimplementing uPort's registry contract in LLL. The Solidity implementation comes in at 591 bytes, compiled with the optimize flag. Admittedly, this is pretty small. But the LLL implementation compiles to 171 bytes. So in this case the LLL version is about 70% smaller than the Solidity version. That matters a lot when a contract will be accessed many times. It also makes deployment less costly. This is an extreme case, of course. Generally LLL binaries are about 30 to 40% smaller than the equivalent in Solidity.\n\nLLL is considered lisp like because of its syntax. There are many parenthesis compared to other smart contract languages. LLL uses symbolic expression. Symbolic expressions are a notation for nested list data.\n\nLisp developers generally use indentation to indicate code blocks.\n\nLLL also uses prefix notation, where operators are placed to the left of their operands. Infix notation is the more familiar notation (2 + 3), which looks like (+ 2 3) in prefix notation. The expression (+ @i 64) adds i and 64.\n\n“Symbolic expressions are a means of representing semistructured data in human readable text form mostly composed of symbols and lists and extensively used in the Lisp programming language.” -yourdictionary.com\n\n# An example of LLL\n\n;; check that the caller is the node owner \n\n(def ‘only-node-owner (node) \n \t(when (!= caller) (get-owner-node)) \n (panic)) \n\nLLL uses semicolons for comments.\n\ndef starts the definition of an LLL macro. Macros can be used to clarify your code. They aren't even close to the power of Lisp macros. They're more like the C macro system. They do a simple substitution.\n\nHere we're defining a macro called only-node-owner. This will be used as a modifier to ensure that only the node owner can execute a block of code. So when only-node-owner is used in the source, the macro will be looked up and its definition will be compiled into the bytecode.\n\nMacros can take parameters. In this case the node's ID.\n\nThe rest of the code is what will be substituted at compile time when the macro is invoked. Here you can see the use of symbolic expressions and prefix notation. Everything is composed of lists defined within matching parentheses. Prefix notation can be seen with the use of !=. That operator comes first, and its operands follow. One of the != operands uses another macro I defined that's not shown here, called get-owner. So you can see that it's easy to build up complex code but keep things clear with the use of macros.\n\nThere is actually an LLL contract deployed on the mainnet. The registry contract of the Ethereum Name service (ENS) was written in LLL mainly because of the gas savings due to its size and the brevity of its code. It's the contract in the ENS system that's called more than any other.\n\nCheck out the github (https://github.com/ethereum/ens) for details about the LLL contracts as well as the Solidity counterparts.\n\n<hr><a href='https://d.tube/#!/v/goam/539ewdz0'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYbfaJomGaPNEUgUG9TPn9PvZ25bzx1gZnm5DQNVTMLfs'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #53: LLL\",\"snaphash\":\"QmTkbwq6hZwjBCrSFJriVgQXLCctkQX4wJSfSiX3Qrt4Zz\",\"author\":\"goam\",\"permlink\":\"539ewdz0\",\"duration\":84.752834,\"filesize\":8943271,\"spritehash\":\"QmUb9n9PGGRj2byjBt4jozBuE3V2rZXA28bUwVgac2j95W\"},\"content\":{\"videohash\":\"QmYbfaJomGaPNEUgUG9TPn9PvZ25bzx1gZnm5DQNVTMLfs\",\"description\":\"Let’s start by diving right into an abstruse example of the low-level lisp-like language (LLL).\\n\\n { \\n [[69]] (caller ) \\n (return 0 (lll \\n (when (= (caller) @@69) \\n (for {} (< @i (calldatasize)) [i](+ @i 64) \\n [[ (calldataload @i) ]] (calldataload (+ @i 32)) \\n ) \\n ) \\n 0)) \\n } \\n\\nAs the name suggests, LLL is a low level language. It operates more closely to the EVM bytecode than higher level languages like Solidity or Vyper.\\n\\nLLL has direct access to storage and memory of the EVM so you can determine exactly where your data sits. When you use an EVM opcode in LLL, it translates directly to the bytecode representation of that opcode. In fact, all EVM opcodes are available to LLL.\\n\\nIt produces smaller binaries that Solidity. As an example, reimplementing uPort's registry contract in LLL. The Solidity implementation comes in at 591 bytes, compiled with the optimize flag. Admittedly, this is pretty small. But the LLL implementation compiles to 171 bytes. So in this case the LLL version is about 70% smaller than the Solidity version. That matters a lot when a contract will be accessed many times. It also makes deployment less costly. This is an extreme case, of course. Generally LLL binaries are about 30 to 40% smaller than the equivalent in Solidity.\\n\\nLLL is considered lisp like because of its syntax. There are many parenthesis compared to other smart contract languages. LLL uses symbolic expression. Symbolic expressions are a notation for nested list data.\\n\\nLisp developers generally use indentation to indicate code blocks.\\n\\nLLL also uses prefix notation, where operators are placed to the left of their operands. Infix notation is the more familiar notation (2 + 3), which looks like (+ 2 3) in prefix notation. The expression (+ @i 64) adds i and 64.\\n\\n“Symbolic expressions are a means of representing semistructured data in human readable text form mostly composed of symbols and lists and extensively used in the Lisp programming language.” -yourdictionary.com\\n\\n# An example of LLL\\n\\n;; check that the caller is the node owner \\n\\n(def ‘only-node-owner (node) \\n \\t(when (!= caller) (get-owner-node)) \\n (panic)) \\n\\nLLL uses semicolons for comments.\\n\\ndef starts the definition of an LLL macro. Macros can be used to clarify your code. They aren't even close to the power of Lisp macros. They're more like the C macro system. They do a simple substitution.\\n\\nHere we're defining a macro called only-node-owner. This will be used as a modifier to ensure that only the node owner can execute a block of code. So when only-node-owner is used in the source, the macro will be looked up and its definition will be compiled into the bytecode.\\n\\nMacros can take parameters. In this case the node's ID.\\n\\nThe rest of the code is what will be substituted at compile time when the macro is invoked. Here you can see the use of symbolic expressions and prefix notation. Everything is composed of lists defined within matching parentheses. Prefix notation can be seen with the use of !=. That operator comes first, and its operands follow. One of the != operands uses another macro I defined that's not shown here, called get-owner. So you can see that it's easy to build up complex code but keep things clear with the use of macros.\\n\\nThere is actually an LLL contract deployed on the mainnet. The registry contract of the Ethereum Name service (ENS) was written in LLL mainly because of the gas savings due to its size and the brevity of its code. It's the contract in the ENS system that's called more than any other.\\n\\nCheck out the github (https://github.com/ethereum/ens) for details about the LLL contracts as well as the Solidity counterparts.\",\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\"],\"video240hash\":\"QmVcmwo6guCHajyaJJdMopssie3gUr1pLzcvXD6sjJHW3W\",\"video480hash\":\"QmZutwFXqcXaULNwyUU2kaMQLCstS4p6PijuPfLNbH2xBd\"}},\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "539ewdz0",
"title": "Ethereum #53: LLL"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:40:12",
"trx_id": "05e26cd22d95f1031111420da1766ec129566ab8",
"trx_in_block": 34,
"virtual_op": 0
}2018/06/29 04:35:03
2018/06/29 04:35:03
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | o416ruwy |
| Transaction Info | Block #23736928/Trx cfb6b9a0e766a74731499d4d7f57feea962910b9 |
View Raw JSON Data
{
"block": 23736928,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "o416ruwy"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:35:03",
"trx_id": "cfb6b9a0e766a74731499d4d7f57feea962910b9",
"trx_in_block": 6,
"virtual_op": 0
}2018/06/29 04:35:03
2018/06/29 04:35:03
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/o416ruwy'><img src='https://ipfs.io/ipfs/QmeiE7bfzUFuxRFtVa7wSU5mUn1hHifwCencTghspJyyLc'></a></center><hr> # Formal Verification There is a dire need for more secure methods of smart contract development within the blockchain community. There have been hundreds of millions of dollars worth of crypto assets lost or stolen due to insecure smart contracts, and there are thousands of smart contracts on the blockchain with known vulnerabilities. Part of the problem is due to the current state of developer tools and programming languages such as Solidity. The goal is to make writing secure smart contracts as easy and accessible as possible. One route to this goal is via formal verification. From Wikipedia, formal verification is the act of proving or disproving the correctness of intended algorithms underlying a system with respect to a certain formal specification or property, using formal methods of mathematics. Said another way, it is a way to prove that a program is correct for all inputs. This can ensure that a hacker cannot modify the contract to an unintended state. Using formal verification, smart contract proofs can be checked by machines. Verification requires specific programming languages and features that are not currently present in the Ethereum ecosystem. Read more about formal verification as it applies to computer science more generally on Wikipedia: https://en.wikipedia.org/wiki/Formal_verification https://ethereum.stackexchange.com/questions/11092/what-is-formal-verification-and-why-is-it-important-for-smart-contracts https://github.com/pirapira/ethereum-formal-verification-overview https://ethereum.stackexchange.com/questions/11092/what-is-formal-verification-and-why-is-it-important-for-smart-contracts https://github.com/pirapira/ethereum-formal-verification-overview https://securify.ch/ <hr><a href='https://d.tube/#!/v/goam/o416ruwy'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmXDt8uMFJBd2Kby5gwbyDFnBuqB16NHHMJ7oNzxVURVg1'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #52: Formal Verification","snaphash":"QmYGtxs44yhdSu8QXvETse7LUSkDcviU5pPJAJPfXCzYVq","author":"goam","permlink":"o416ruwy","duration":53.823855,"filesize":4577276,"spritehash":"QmSmHTnhidj6TyW7dDUrGUjb2bTP7oj6R6kw3KQzaYpAwj"},"content":{"videohash":"QmXDt8uMFJBd2Kby5gwbyDFnBuqB16NHHMJ7oNzxVURVg1","description":"# Formal Verification\n\nThere is a dire need for more secure methods of smart contract development within the blockchain community. \n\nThere have been hundreds of millions of dollars worth of crypto assets lost or stolen due to insecure smart contracts, and there are thousands of smart contracts on the blockchain with known vulnerabilities.\n\nPart of the problem is due to the current state of developer tools and programming languages such as Solidity. \n\nThe goal is to make writing secure smart contracts as easy and accessible as possible. One route to this goal is via formal verification. \n\nFrom Wikipedia, formal verification is the act of proving or disproving the correctness of intended algorithms underlying a system with respect to a certain formal specification or property, using formal methods of mathematics.\n \nSaid another way, it is a way to prove that a program is correct for all inputs. This can ensure that a hacker cannot modify the contract to an unintended state.\n\nUsing formal verification, smart contract proofs can be checked by machines. Verification requires specific programming languages and features that are not currently present in the Ethereum ecosystem. \n\nRead more about formal verification as it applies to computer science more generally on Wikipedia: https://en.wikipedia.org/wiki/Formal_verification\n\nhttps://ethereum.stackexchange.com/questions/11092/what-is-formal-verification-and-why-is-it-important-for-smart-contracts\nhttps://github.com/pirapira/ethereum-formal-verification-overview\nhttps://ethereum.stackexchange.com/questions/11092/what-is-formal-verification-and-why-is-it-important-for-smart-contracts\nhttps://github.com/pirapira/ethereum-formal-verification-overview\nhttps://securify.ch/","tags":["ethereum","developer","education","blockchain"],"video240hash":"QmUaqXdzgUR8yaQqsxnr6F39SFpB5SJVr8dEpRp3gPNe2k","video480hash":"QmYt8qvM8FBr3DNECEyHkasTtfAmKyZpZr4xcuWQKKCpAY"}},"tags":["ethereum","developer","education","blockchain","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | o416ruwy |
| title | Ethereum #52: Formal Verification |
| Transaction Info | Block #23736928/Trx cfb6b9a0e766a74731499d4d7f57feea962910b9 |
View Raw JSON Data
{
"block": 23736928,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/o416ruwy'><img src='https://ipfs.io/ipfs/QmeiE7bfzUFuxRFtVa7wSU5mUn1hHifwCencTghspJyyLc'></a></center><hr>\n\n# Formal Verification\n\nThere is a dire need for more secure methods of smart contract development within the blockchain community. \n\nThere have been hundreds of millions of dollars worth of crypto assets lost or stolen due to insecure smart contracts, and there are thousands of smart contracts on the blockchain with known vulnerabilities.\n\nPart of the problem is due to the current state of developer tools and programming languages such as Solidity. \n\nThe goal is to make writing secure smart contracts as easy and accessible as possible. One route to this goal is via formal verification. \n\nFrom Wikipedia, formal verification is the act of proving or disproving the correctness of intended algorithms underlying a system with respect to a certain formal specification or property, using formal methods of mathematics.\n \nSaid another way, it is a way to prove that a program is correct for all inputs. This can ensure that a hacker cannot modify the contract to an unintended state.\n\nUsing formal verification, smart contract proofs can be checked by machines. Verification requires specific programming languages and features that are not currently present in the Ethereum ecosystem. \n\nRead more about formal verification as it applies to computer science more generally on Wikipedia: https://en.wikipedia.org/wiki/Formal_verification\n\nhttps://ethereum.stackexchange.com/questions/11092/what-is-formal-verification-and-why-is-it-important-for-smart-contracts\nhttps://github.com/pirapira/ethereum-formal-verification-overview\nhttps://ethereum.stackexchange.com/questions/11092/what-is-formal-verification-and-why-is-it-important-for-smart-contracts\nhttps://github.com/pirapira/ethereum-formal-verification-overview\nhttps://securify.ch/\n\n<hr><a href='https://d.tube/#!/v/goam/o416ruwy'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmXDt8uMFJBd2Kby5gwbyDFnBuqB16NHHMJ7oNzxVURVg1'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #52: Formal Verification\",\"snaphash\":\"QmYGtxs44yhdSu8QXvETse7LUSkDcviU5pPJAJPfXCzYVq\",\"author\":\"goam\",\"permlink\":\"o416ruwy\",\"duration\":53.823855,\"filesize\":4577276,\"spritehash\":\"QmSmHTnhidj6TyW7dDUrGUjb2bTP7oj6R6kw3KQzaYpAwj\"},\"content\":{\"videohash\":\"QmXDt8uMFJBd2Kby5gwbyDFnBuqB16NHHMJ7oNzxVURVg1\",\"description\":\"# Formal Verification\\n\\nThere is a dire need for more secure methods of smart contract development within the blockchain community. \\n\\nThere have been hundreds of millions of dollars worth of crypto assets lost or stolen due to insecure smart contracts, and there are thousands of smart contracts on the blockchain with known vulnerabilities.\\n\\nPart of the problem is due to the current state of developer tools and programming languages such as Solidity. \\n\\nThe goal is to make writing secure smart contracts as easy and accessible as possible. One route to this goal is via formal verification. \\n\\nFrom Wikipedia, formal verification is the act of proving or disproving the correctness of intended algorithms underlying a system with respect to a certain formal specification or property, using formal methods of mathematics.\\n \\nSaid another way, it is a way to prove that a program is correct for all inputs. This can ensure that a hacker cannot modify the contract to an unintended state.\\n\\nUsing formal verification, smart contract proofs can be checked by machines. Verification requires specific programming languages and features that are not currently present in the Ethereum ecosystem. \\n\\nRead more about formal verification as it applies to computer science more generally on Wikipedia: https://en.wikipedia.org/wiki/Formal_verification\\n\\nhttps://ethereum.stackexchange.com/questions/11092/what-is-formal-verification-and-why-is-it-important-for-smart-contracts\\nhttps://github.com/pirapira/ethereum-formal-verification-overview\\nhttps://ethereum.stackexchange.com/questions/11092/what-is-formal-verification-and-why-is-it-important-for-smart-contracts\\nhttps://github.com/pirapira/ethereum-formal-verification-overview\\nhttps://securify.ch/\",\"tags\":[\"ethereum\",\"developer\",\"education\",\"blockchain\"],\"video240hash\":\"QmUaqXdzgUR8yaQqsxnr6F39SFpB5SJVr8dEpRp3gPNe2k\",\"video480hash\":\"QmYt8qvM8FBr3DNECEyHkasTtfAmKyZpZr4xcuWQKKCpAY\"}},\"tags\":[\"ethereum\",\"developer\",\"education\",\"blockchain\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "o416ruwy",
"title": "Ethereum #52: Formal Verification"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:35:03",
"trx_id": "cfb6b9a0e766a74731499d4d7f57feea962910b9",
"trx_in_block": 6,
"virtual_op": 0
}2018/06/29 04:34:57
2018/06/29 04:34:57
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/1nw1q9sw'><img src='https://ipfs.io/ipfs/QmXTjNmE2rbTGgHANkBvN23GeBJv9kJYMQpFJ4fEf8sZg7'></a></center><hr> There are several design patterns and best practices that have been developed. # Fail early and fail loud //Bad code, do not emulate function silentFailIfZero(uint num) public view returns (uint){ if(num != 0){ return num; } } This function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not. function throwsErrorIfZero(uint num) public view returns (uint){ require(num != 0); return num; } This function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown. # Restricting Access You cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information. You can restrict other contracts’ access to the state by making state variables private. contract C1 { uint private internalNum; } You can restrict function access so that only specific addresses are permitted to execute functions. This is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. https://i.imgur.com/1L2eAn0.png It can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system. # Auto Deprecation https://i.imgur.com/JfXhR0R.png The auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. This can be useful when running alpha or beta testing for your smart contracts. Remember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. # Mortal https://i.imgur.com/4tXBASn.png Implementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain. You can destroy a contract using the selfdestruct keyword. The function to do it is often called kill. It takes one parameter which is the address that will receive all of the funds that the contract currently holds. As an irreversible action, restricting access to this function is important. # Pull over Push Payments Navigate to this fund splitter contract on github. There are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account. This pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson. # Circuit Breaker Circuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented. Circuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds. contract CircuitBreaker { bool public stopped = false; modifier stopInEmergency { require(!stopped); _; } modifier onlyInEmergency { require(stopped); _; } function deposit() stopInEmergency public { … } function withdraw() onlyInEmergency public { … } } In a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins. # State Machine Contracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time. The Colony token weighted voting protocol implemented this design pattern to manage the poll state. https://i.imgur.com/GCfGdZx.png Admins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached. # Speed Bump Speed bumps slow down actions so that if malicious actions occur, there is time to recover. https://i.imgur.com/tzY3GYg.png For example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery. https://solidity.readthedocs.io/en/develop/common-patterns.html https://github.com/cjgdev/smart-contract-patterns https://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da <hr><a href='https://d.tube/#!/v/goam/1nw1q9sw'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #50: Design Patterns","snaphash":"QmQ2bomN9MREqyaG6rGEKscRUYJccyBHMTBGgYAiL3mBmS","author":"goam","permlink":"1nw1q9sw","duration":101.215782,"filesize":9966972,"spritehash":"QmULXzFNvujDfuSC6Cxrt5VRoXaCSiUuzKr6HTQe2zRB3G"},"content":{"videohash":"QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ","description":"There are several design patterns and best practices that have been developed.\n\n# Fail early and fail loud\n\n //Bad code, do not emulate\n function silentFailIfZero(uint num) public view returns (uint){\n if(num != 0){\n return num;\n }\n }\n\nThis function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not.\n\n function throwsErrorIfZero(uint num) public view returns (uint){\n require(num != 0);\n return num;\n }\n\nThis function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown.\n\n# Restricting Access\n\nYou cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information.\n\nYou can restrict other contracts’ access to the state by making state variables private.\n\ncontract C1 {\n uint private internalNum;\n}\n\nYou can restrict function access so that only specific addresses are permitted to execute functions.\n\nThis is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. \n\nhttps://i.imgur.com/1L2eAn0.png\n\nIt can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system.\n\n# Auto Deprecation\n\nhttps://i.imgur.com/JfXhR0R.png\n\nThe auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. \n\nThis can be useful when running alpha or beta testing for your smart contracts.\n\nRemember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. \n\n# Mortal\n\nhttps://i.imgur.com/4tXBASn.png\n\nImplementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain.\n\nYou can destroy a contract using the selfdestruct keyword. The function to do it is often called kill.\n\nIt takes one parameter which is the address that will receive all of the funds that the contract currently holds.\n\nAs an irreversible action, restricting access to this function is important.\n\n# Pull over Push Payments\n\nNavigate to this fund splitter contract on github.\n\nThere are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account.\n\nThis pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson.\n\n# Circuit Breaker\n\nCircuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented.\n\nCircuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds.\n\ncontract CircuitBreaker {\n bool public stopped = false;\n modifier stopInEmergency { require(!stopped); _; }\n modifier onlyInEmergency { require(stopped); _; }\n function deposit() stopInEmergency public { … }\n function withdraw() onlyInEmergency public { … } \n}\n\nIn a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins.\n\n# State Machine\n\nContracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time.\n\nThe Colony token weighted voting protocol implemented this design pattern to manage the poll state.\n\nhttps://i.imgur.com/GCfGdZx.png\n\nAdmins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached.\n\n# Speed Bump\n\nSpeed bumps slow down actions so that if malicious actions occur, there is time to recover. \n\nhttps://i.imgur.com/tzY3GYg.png\n\nFor example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery.\n\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html\nhttps://github.com/cjgdev/smart-contract-patterns\nhttps://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmdUY2rQr3bC9ZBjRVgPSHYdttPH27XAu6r2hiBtdZKQBE","video480hash":"QmVSKzS9vbytcXCPvASJoVp2hT9yH8unKKWxPHPiQ43Dpz"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 1nw1q9sw |
| title | Ethereum #50: Design Patterns |
| Transaction Info | Block #23736926/Trx 61eb8f42cb539a8734209738d621515ba403c866 |
View Raw JSON Data
{
"block": 23736926,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/1nw1q9sw'><img src='https://ipfs.io/ipfs/QmXTjNmE2rbTGgHANkBvN23GeBJv9kJYMQpFJ4fEf8sZg7'></a></center><hr>\n\nThere are several design patterns and best practices that have been developed.\n\n# Fail early and fail loud\n\n //Bad code, do not emulate\n function silentFailIfZero(uint num) public view returns (uint){\n if(num != 0){\n return num;\n }\n }\n\nThis function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not.\n\n function throwsErrorIfZero(uint num) public view returns (uint){\n require(num != 0);\n return num;\n }\n\nThis function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown.\n\n# Restricting Access\n\nYou cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information.\n\nYou can restrict other contracts’ access to the state by making state variables private.\n\ncontract C1 {\n uint private internalNum;\n}\n\nYou can restrict function access so that only specific addresses are permitted to execute functions.\n\nThis is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. \n\nhttps://i.imgur.com/1L2eAn0.png\n\nIt can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system.\n\n# Auto Deprecation\n\nhttps://i.imgur.com/JfXhR0R.png\n\nThe auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. \n\nThis can be useful when running alpha or beta testing for your smart contracts.\n\nRemember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. \n\n# Mortal\n\nhttps://i.imgur.com/4tXBASn.png\n\nImplementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain.\n\nYou can destroy a contract using the selfdestruct keyword. The function to do it is often called kill.\n\nIt takes one parameter which is the address that will receive all of the funds that the contract currently holds.\n\nAs an irreversible action, restricting access to this function is important.\n\n# Pull over Push Payments\n\nNavigate to this fund splitter contract on github.\n\nThere are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account.\n\nThis pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson.\n\n# Circuit Breaker\n\nCircuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented.\n\nCircuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds.\n\ncontract CircuitBreaker {\n bool public stopped = false;\n modifier stopInEmergency { require(!stopped); _; }\n modifier onlyInEmergency { require(stopped); _; }\n function deposit() stopInEmergency public { … }\n function withdraw() onlyInEmergency public { … } \n}\n\nIn a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins.\n\n# State Machine\n\nContracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time.\n\nThe Colony token weighted voting protocol implemented this design pattern to manage the poll state.\n\nhttps://i.imgur.com/GCfGdZx.png\n\nAdmins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached.\n\n# Speed Bump\n\nSpeed bumps slow down actions so that if malicious actions occur, there is time to recover. \n\nhttps://i.imgur.com/tzY3GYg.png\n\nFor example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery.\n\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html\nhttps://github.com/cjgdev/smart-contract-patterns\nhttps://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da\n\n<hr><a href='https://d.tube/#!/v/goam/1nw1q9sw'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #50: Design Patterns\",\"snaphash\":\"QmQ2bomN9MREqyaG6rGEKscRUYJccyBHMTBGgYAiL3mBmS\",\"author\":\"goam\",\"permlink\":\"1nw1q9sw\",\"duration\":101.215782,\"filesize\":9966972,\"spritehash\":\"QmULXzFNvujDfuSC6Cxrt5VRoXaCSiUuzKr6HTQe2zRB3G\"},\"content\":{\"videohash\":\"QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ\",\"description\":\"There are several design patterns and best practices that have been developed.\\n\\n# Fail early and fail loud\\n\\n //Bad code, do not emulate\\n function silentFailIfZero(uint num) public view returns (uint){\\n if(num != 0){\\n return num;\\n }\\n }\\n\\nThis function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not.\\n\\n function throwsErrorIfZero(uint num) public view returns (uint){\\n require(num != 0);\\n return num;\\n }\\n\\nThis function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown.\\n\\n# Restricting Access\\n\\nYou cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information.\\n\\nYou can restrict other contracts’ access to the state by making state variables private.\\n\\ncontract C1 {\\n uint private internalNum;\\n}\\n\\nYou can restrict function access so that only specific addresses are permitted to execute functions.\\n\\nThis is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. \\n\\nhttps://i.imgur.com/1L2eAn0.png\\n\\nIt can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system.\\n\\n# Auto Deprecation\\n\\nhttps://i.imgur.com/JfXhR0R.png\\n\\nThe auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. \\n\\nThis can be useful when running alpha or beta testing for your smart contracts.\\n\\nRemember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. \\n\\n# Mortal\\n\\nhttps://i.imgur.com/4tXBASn.png\\n\\nImplementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain.\\n\\nYou can destroy a contract using the selfdestruct keyword. The function to do it is often called kill.\\n\\nIt takes one parameter which is the address that will receive all of the funds that the contract currently holds.\\n\\nAs an irreversible action, restricting access to this function is important.\\n\\n# Pull over Push Payments\\n\\nNavigate to this fund splitter contract on github.\\n\\nThere are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account.\\n\\nThis pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson.\\n\\n# Circuit Breaker\\n\\nCircuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented.\\n\\nCircuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds.\\n\\ncontract CircuitBreaker {\\n bool public stopped = false;\\n modifier stopInEmergency { require(!stopped); _; }\\n modifier onlyInEmergency { require(stopped); _; }\\n function deposit() stopInEmergency public { … }\\n function withdraw() onlyInEmergency public { … } \\n}\\n\\nIn a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins.\\n\\n# State Machine\\n\\nContracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time.\\n\\nThe Colony token weighted voting protocol implemented this design pattern to manage the poll state.\\n\\nhttps://i.imgur.com/GCfGdZx.png\\n\\nAdmins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached.\\n\\n# Speed Bump\\n\\nSpeed bumps slow down actions so that if malicious actions occur, there is time to recover. \\n\\nhttps://i.imgur.com/tzY3GYg.png\\n\\nFor example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery.\\n\\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html\\nhttps://github.com/cjgdev/smart-contract-patterns\\nhttps://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmdUY2rQr3bC9ZBjRVgPSHYdttPH27XAu6r2hiBtdZKQBE\",\"video480hash\":\"QmVSKzS9vbytcXCPvASJoVp2hT9yH8unKKWxPHPiQ43Dpz\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "1nw1q9sw",
"title": "Ethereum #50: Design Patterns"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:34:57",
"trx_id": "61eb8f42cb539a8734209738d621515ba403c866",
"trx_in_block": 36,
"virtual_op": 0
}goamupdated their account properties2018/06/29 04:32:48
goamupdated their account properties
2018/06/29 04:32:48
| account | goam |
| json metadata | {"profile":{"profile_image":"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg","cover_image":"https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG","name":"Ethereum Dev Course"}} |
| memo key | STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL |
| Transaction Info | Block #23736883/Trx 7ee5a55cc92880d7fe3b9aef9028d87939a581c4 |
View Raw JSON Data
{
"block": 23736883,
"op": [
"account_update",
{
"account": "goam",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg\",\"cover_image\":\"https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG\",\"name\":\"Ethereum Dev Course\"}}",
"memo_key": "STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:32:48",
"trx_id": "7ee5a55cc92880d7fe3b9aef9028d87939a581c4",
"trx_in_block": 32,
"virtual_op": 0
}2018/06/29 04:29:42
2018/06/29 04:29:42
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | vxss8el8 |
| Transaction Info | Block #23736821/Trx ecd8e290834d98c5cf02788958b9c9cb53460d5c |
View Raw JSON Data
{
"block": 23736821,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "vxss8el8"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:29:42",
"trx_id": "ecd8e290834d98c5cf02788958b9c9cb53460d5c",
"trx_in_block": 11,
"virtual_op": 0
}2018/06/29 04:29:42
2018/06/29 04:29:42
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/vxss8el8'><img src='https://ipfs.io/ipfs/QmXh5g4bJJ8aRQDTmawSwVeU3toXYPLmQQU6V7Gn3PmB4r'></a></center><hr> The first set of dangers that we are going to look at fall in the class of race conditions. Reentrancy attacks can be problematic because calling external contracts passes control flow to them. The called contract may end up calling the smart contract function again in a recursive manner. // INSECURE mapping (address => uint) private userBalances; function withdrawBalance() public { uint amountToWithdraw = userBalances[msg.sender]; require(msg.sender.call.value(amountToWithdraw)()); // At this point, the caller's code is executed, and can call withdrawBalance again userBalances[msg.sender] = 0; } This is the type of attack that destroyed the DAO in mid 2016. If you can’t remove the external call, the next simplest way to prevent this attack is to do the internal work before making the external function call. mapping (address => uint) private userBalances; function withdrawBalance() public { uint amountToWithdraw = userBalances[msg.sender]; userBalances[msg.sender] = 0; require(msg.sender.call.value(amountToWithdraw)()); // The user's balance is already 0, so future invocations won't withdraw anything } Or to use the withdrawal design pattern and separate the contract accounting logic and the transfer logic. Another thing to be aware of is potential cross function race conditions. This can be problematic if your contract has multiple functions that modify the same state. // INSECURE mapping (address => uint) private userBalances; function transfer(address to, uint amount) { if (userBalances[msg.sender] >= amount) { userBalances[to] += amount; userBalances[msg.sender] -= amount; } } function withdrawBalance() public { uint amountToWithdraw = userBalances[msg.sender]; require(msg.sender.call.value(amountToWithdraw)()); // At this point, the caller's code is executed, and can call transfer() userBalances[msg.sender] = 0; } Ask yourself, if multiple contract functions are called, what happens? There are several ways to mitigate these problems. It is generally a good idea to handle your internal contract state changes before calling external contracts, such as in the withdrawal design pattern. Use battle tested design patterns and learn from other people’s mistakes and heed their advice. A more complex solution could implement mutual exclusion, or a mutex. This allows you to lock a state and only allow changes by the owner of the lock. You can dig deeper into known attacks such as these here: https://consensys.github.io/smart-contract-best-practices/known_attacks/#race-conditions42 # Transaction Ordering and Timestamp Dependence The previous examples of race conditions involved an attacker executing malicious code in a single transaction. Here we focus on how transactions are included in the blockchain and considerations around the process. Transactions that are broadcast to the network but have not yet been included in a block are in the mempool. Miners choose the order in which to include transactions from the mempool into a block that they are mining. Also, since transactions are in the mempool before they make it into a block, anyone can know what transactions are about to occur on the network. https://i.imgur.com/I2WfEwL.png This can be problematic for things like decentralized markets. Protecting against this is difficult and you will likely need to devise contract specific solutions. Decentralized markets can mitigate concerns by implementing batch auctions or using a pre-commit scheme, where the details are submitted after the transaction is committed. # Integer Overflow and Underflow Integers can underflow or overflow in the EVM. The max value for an unsigned integer is 2 ^ 256 - 1, which is roughly 1.15 times 10 ^ 77. If an integer overflows, the value will go back to 0. For example, a variable called score of type uint8 storing a value of 255 that is incremented by 1 will now be storing the value 0. You may or may not have to worry about integer overflow depending on your smart contract. A variable that can be set by user input may need to check against overflow, whereas it is infeasible that a variable that is incremented will ever approach this max value. Underflow is a similar situation, but when a uint goes below its minimum value it will be set to its maximum value. Be careful with smaller data types like uint8, uint16, etc… they can more easily reach their maximum value # Denial of Service https://i.imgur.com/OPAYpA3.png Another danger of passing execution to another contract is a denial of service attack. In the provided example, the highestBidder could be another contract and transferring funds to the contract triggers the contract’s fallback function. If the contract’s fallback always reverts, the Auction contract’s bid function becomes unusable - it will always revert. The bid function requires the transfer operation to succeed to fully execute. The contract at the provided address throws an exception, execution halts and the exception is passed into the calling contract and prevents further execution. This problem is avoidable using the withdrawal pattern. # Force Sending Ether Another danger is using logic that depends on the contract balance. Be aware that it is possible to send ether to a contract without triggering its fallback function. Using the selfdestruct function on another contract and using the target contract as the recipient will force the destroyed contract’s funds to be sent to the target. It is also possible to precompute a contracts address and send ether to the address before the contract is deployed. The contract’s balance will be greater than 0 when it is finally deployed. https://eprint.iacr.org/2016/1007.pdf https://solidity.readthedocs.io/en/develop/bugs.html https://medium.freecodecamp.org/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce <hr><a href='https://d.tube/#!/v/goam/vxss8el8'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmRBajdRTbkDHSVfEupjJNuwhWr2rGRUDAuNbxs283X3p6'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #51: Exploits and Dangers","snaphash":"QmbD2DD7QC8UeXAM7x6JJipxid6zyiv11MbxVggFMVGsms","author":"goam","permlink":"vxss8el8","duration":105.627574,"filesize":10840919,"spritehash":"Qmb9jWn4LB8uvu3U32q9BFBe4XJj56ieu1t2s9PbqMRrL7"},"content":{"videohash":"QmRBajdRTbkDHSVfEupjJNuwhWr2rGRUDAuNbxs283X3p6","description":"The first set of dangers that we are going to look at fall in the class of race conditions.\n\nReentrancy attacks can be problematic because calling external contracts passes control flow to them. The called contract may end up calling the smart contract function again in a recursive manner.\n\n// INSECURE\nmapping (address => uint) private userBalances;\n\nfunction withdrawBalance() public {\n uint amountToWithdraw = userBalances[msg.sender];\n require(msg.sender.call.value(amountToWithdraw)()); // At this point, the caller's code is executed, and can call withdrawBalance again\n userBalances[msg.sender] = 0;\n}\n\nThis is the type of attack that destroyed the DAO in mid 2016. \n\nIf you can’t remove the external call, the next simplest way to prevent this attack is to do the internal work before making the external function call. \n\nmapping (address => uint) private userBalances;\n\nfunction withdrawBalance() public {\n uint amountToWithdraw = userBalances[msg.sender];\n userBalances[msg.sender] = 0;\n require(msg.sender.call.value(amountToWithdraw)()); // The user's balance is already 0, so future invocations won't withdraw anything\n}\n\nOr to use the withdrawal design pattern and separate the contract accounting logic and the transfer logic.\n\nAnother thing to be aware of is potential cross function race conditions. This can be problematic if your contract has multiple functions that modify the same state.\n\n// INSECURE\nmapping (address => uint) private userBalances;\n\nfunction transfer(address to, uint amount) {\n if (userBalances[msg.sender] >= amount) {\n userBalances[to] += amount;\n userBalances[msg.sender] -= amount;\n }\n}\n\nfunction withdrawBalance() public {\n uint amountToWithdraw = userBalances[msg.sender];\n require(msg.sender.call.value(amountToWithdraw)()); // At this point, the caller's code is executed, and can call transfer()\n userBalances[msg.sender] = 0;\n}\n\nAsk yourself, if multiple contract functions are called, what happens?\n\nThere are several ways to mitigate these problems.\n\nIt is generally a good idea to handle your internal contract state changes before calling external contracts, such as in the withdrawal design pattern. Use battle tested design patterns and learn from other people’s mistakes and heed their advice.\n\nA more complex solution could implement mutual exclusion, or a mutex. This allows you to lock a state and only allow changes by the owner of the lock.\n\nYou can dig deeper into known attacks such as these here: https://consensys.github.io/smart-contract-best-practices/known_attacks/#race-conditions42\n\n# Transaction Ordering and Timestamp Dependence\n\nThe previous examples of race conditions involved an attacker executing malicious code in a single transaction. Here we focus on how transactions are included in the blockchain and considerations around the process.\n\nTransactions that are broadcast to the network but have not yet been included in a block are in the mempool.\n\nMiners choose the order in which to include transactions from the mempool into a block that they are mining.\n\nAlso, since transactions are in the mempool before they make it into a block, anyone can know what transactions are about to occur on the network. \n https://i.imgur.com/I2WfEwL.png\n\nThis can be problematic for things like decentralized markets.\n\nProtecting against this is difficult and you will likely need to devise contract specific solutions.\n\nDecentralized markets can mitigate concerns by implementing batch auctions or using a pre-commit scheme, where the details are submitted after the transaction is committed. \n\n# Integer Overflow and Underflow\n\nIntegers can underflow or overflow in the EVM.\n\nThe max value for an unsigned integer is 2 ^ 256 - 1, which is roughly 1.15 times 10 ^ 77. If an integer overflows, the value will go back to 0. For example, a variable called score of type uint8 storing a value of 255 that is incremented by 1 will now be storing the value 0.\n\nYou may or may not have to worry about integer overflow depending on your smart contract.\n\nA variable that can be set by user input may need to check against overflow, whereas it is infeasible that a variable that is incremented will ever approach this max value.\n\nUnderflow is a similar situation, but when a uint goes below its minimum value it will be set to its maximum value.\n\nBe careful with smaller data types like uint8, uint16, etc… they can more easily reach their maximum value\n\n# Denial of Service\n\nhttps://i.imgur.com/OPAYpA3.png\n\nAnother danger of passing execution to another contract is a denial of service attack.\n\nIn the provided example, the highestBidder could be another contract and transferring funds to the contract triggers the contract’s fallback function. If the contract’s fallback always reverts, the Auction contract’s bid function becomes unusable - it will always revert. The bid function requires the transfer operation to succeed to fully execute.\n\nThe contract at the provided address throws an exception, execution halts and the exception is passed into the calling contract and prevents further execution.\n\nThis problem is avoidable using the withdrawal pattern.\n\n# Force Sending Ether\n\nAnother danger is using logic that depends on the contract balance. \n\nBe aware that it is possible to send ether to a contract without triggering its fallback function. \n\nUsing the selfdestruct function on another contract and using the target contract as the recipient will force the destroyed contract’s funds to be sent to the target.\n\nIt is also possible to precompute a contracts address and send ether to the address before the contract is deployed.\n\nThe contract’s balance will be greater than 0 when it is finally deployed.\n\nhttps://eprint.iacr.org/2016/1007.pdf\nhttps://solidity.readthedocs.io/en/develop/bugs.html\nhttps://medium.freecodecamp.org/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmU6dW4dSEFQvfk47Ynqbd67UJSnn7pzuBgZsmFuAqjNcF","video480hash":"QmQ8wY5z7Htr9L6k9xb4YeZTzsjDWpFmLBpYC1fARNL2A1"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | vxss8el8 |
| title | Ethereum #51: Exploits and Dangers |
| Transaction Info | Block #23736821/Trx ecd8e290834d98c5cf02788958b9c9cb53460d5c |
View Raw JSON Data
{
"block": 23736821,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/vxss8el8'><img src='https://ipfs.io/ipfs/QmXh5g4bJJ8aRQDTmawSwVeU3toXYPLmQQU6V7Gn3PmB4r'></a></center><hr>\n\nThe first set of dangers that we are going to look at fall in the class of race conditions.\n\nReentrancy attacks can be problematic because calling external contracts passes control flow to them. The called contract may end up calling the smart contract function again in a recursive manner.\n\n// INSECURE\nmapping (address => uint) private userBalances;\n\nfunction withdrawBalance() public {\n uint amountToWithdraw = userBalances[msg.sender];\n require(msg.sender.call.value(amountToWithdraw)()); // At this point, the caller's code is executed, and can call withdrawBalance again\n userBalances[msg.sender] = 0;\n}\n\nThis is the type of attack that destroyed the DAO in mid 2016. \n\nIf you can’t remove the external call, the next simplest way to prevent this attack is to do the internal work before making the external function call. \n\nmapping (address => uint) private userBalances;\n\nfunction withdrawBalance() public {\n uint amountToWithdraw = userBalances[msg.sender];\n userBalances[msg.sender] = 0;\n require(msg.sender.call.value(amountToWithdraw)()); // The user's balance is already 0, so future invocations won't withdraw anything\n}\n\nOr to use the withdrawal design pattern and separate the contract accounting logic and the transfer logic.\n\nAnother thing to be aware of is potential cross function race conditions. This can be problematic if your contract has multiple functions that modify the same state.\n\n// INSECURE\nmapping (address => uint) private userBalances;\n\nfunction transfer(address to, uint amount) {\n if (userBalances[msg.sender] >= amount) {\n userBalances[to] += amount;\n userBalances[msg.sender] -= amount;\n }\n}\n\nfunction withdrawBalance() public {\n uint amountToWithdraw = userBalances[msg.sender];\n require(msg.sender.call.value(amountToWithdraw)()); // At this point, the caller's code is executed, and can call transfer()\n userBalances[msg.sender] = 0;\n}\n\nAsk yourself, if multiple contract functions are called, what happens?\n\nThere are several ways to mitigate these problems.\n\nIt is generally a good idea to handle your internal contract state changes before calling external contracts, such as in the withdrawal design pattern. Use battle tested design patterns and learn from other people’s mistakes and heed their advice.\n\nA more complex solution could implement mutual exclusion, or a mutex. This allows you to lock a state and only allow changes by the owner of the lock.\n\nYou can dig deeper into known attacks such as these here: https://consensys.github.io/smart-contract-best-practices/known_attacks/#race-conditions42\n\n# Transaction Ordering and Timestamp Dependence\n\nThe previous examples of race conditions involved an attacker executing malicious code in a single transaction. Here we focus on how transactions are included in the blockchain and considerations around the process.\n\nTransactions that are broadcast to the network but have not yet been included in a block are in the mempool.\n\nMiners choose the order in which to include transactions from the mempool into a block that they are mining.\n\nAlso, since transactions are in the mempool before they make it into a block, anyone can know what transactions are about to occur on the network. \n https://i.imgur.com/I2WfEwL.png\n\nThis can be problematic for things like decentralized markets.\n\nProtecting against this is difficult and you will likely need to devise contract specific solutions.\n\nDecentralized markets can mitigate concerns by implementing batch auctions or using a pre-commit scheme, where the details are submitted after the transaction is committed. \n\n# Integer Overflow and Underflow\n\nIntegers can underflow or overflow in the EVM.\n\nThe max value for an unsigned integer is 2 ^ 256 - 1, which is roughly 1.15 times 10 ^ 77. If an integer overflows, the value will go back to 0. For example, a variable called score of type uint8 storing a value of 255 that is incremented by 1 will now be storing the value 0.\n\nYou may or may not have to worry about integer overflow depending on your smart contract.\n\nA variable that can be set by user input may need to check against overflow, whereas it is infeasible that a variable that is incremented will ever approach this max value.\n\nUnderflow is a similar situation, but when a uint goes below its minimum value it will be set to its maximum value.\n\nBe careful with smaller data types like uint8, uint16, etc… they can more easily reach their maximum value\n\n# Denial of Service\n\nhttps://i.imgur.com/OPAYpA3.png\n\nAnother danger of passing execution to another contract is a denial of service attack.\n\nIn the provided example, the highestBidder could be another contract and transferring funds to the contract triggers the contract’s fallback function. If the contract’s fallback always reverts, the Auction contract’s bid function becomes unusable - it will always revert. The bid function requires the transfer operation to succeed to fully execute.\n\nThe contract at the provided address throws an exception, execution halts and the exception is passed into the calling contract and prevents further execution.\n\nThis problem is avoidable using the withdrawal pattern.\n\n# Force Sending Ether\n\nAnother danger is using logic that depends on the contract balance. \n\nBe aware that it is possible to send ether to a contract without triggering its fallback function. \n\nUsing the selfdestruct function on another contract and using the target contract as the recipient will force the destroyed contract’s funds to be sent to the target.\n\nIt is also possible to precompute a contracts address and send ether to the address before the contract is deployed.\n\nThe contract’s balance will be greater than 0 when it is finally deployed.\n\nhttps://eprint.iacr.org/2016/1007.pdf\nhttps://solidity.readthedocs.io/en/develop/bugs.html\nhttps://medium.freecodecamp.org/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce\n\n<hr><a href='https://d.tube/#!/v/goam/vxss8el8'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmRBajdRTbkDHSVfEupjJNuwhWr2rGRUDAuNbxs283X3p6'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #51: Exploits and Dangers\",\"snaphash\":\"QmbD2DD7QC8UeXAM7x6JJipxid6zyiv11MbxVggFMVGsms\",\"author\":\"goam\",\"permlink\":\"vxss8el8\",\"duration\":105.627574,\"filesize\":10840919,\"spritehash\":\"Qmb9jWn4LB8uvu3U32q9BFBe4XJj56ieu1t2s9PbqMRrL7\"},\"content\":{\"videohash\":\"QmRBajdRTbkDHSVfEupjJNuwhWr2rGRUDAuNbxs283X3p6\",\"description\":\"The first set of dangers that we are going to look at fall in the class of race conditions.\\n\\nReentrancy attacks can be problematic because calling external contracts passes control flow to them. The called contract may end up calling the smart contract function again in a recursive manner.\\n\\n// INSECURE\\nmapping (address => uint) private userBalances;\\n\\nfunction withdrawBalance() public {\\n uint amountToWithdraw = userBalances[msg.sender];\\n require(msg.sender.call.value(amountToWithdraw)()); // At this point, the caller's code is executed, and can call withdrawBalance again\\n userBalances[msg.sender] = 0;\\n}\\n\\nThis is the type of attack that destroyed the DAO in mid 2016. \\n\\nIf you can’t remove the external call, the next simplest way to prevent this attack is to do the internal work before making the external function call. \\n\\nmapping (address => uint) private userBalances;\\n\\nfunction withdrawBalance() public {\\n uint amountToWithdraw = userBalances[msg.sender];\\n userBalances[msg.sender] = 0;\\n require(msg.sender.call.value(amountToWithdraw)()); // The user's balance is already 0, so future invocations won't withdraw anything\\n}\\n\\nOr to use the withdrawal design pattern and separate the contract accounting logic and the transfer logic.\\n\\nAnother thing to be aware of is potential cross function race conditions. This can be problematic if your contract has multiple functions that modify the same state.\\n\\n// INSECURE\\nmapping (address => uint) private userBalances;\\n\\nfunction transfer(address to, uint amount) {\\n if (userBalances[msg.sender] >= amount) {\\n userBalances[to] += amount;\\n userBalances[msg.sender] -= amount;\\n }\\n}\\n\\nfunction withdrawBalance() public {\\n uint amountToWithdraw = userBalances[msg.sender];\\n require(msg.sender.call.value(amountToWithdraw)()); // At this point, the caller's code is executed, and can call transfer()\\n userBalances[msg.sender] = 0;\\n}\\n\\nAsk yourself, if multiple contract functions are called, what happens?\\n\\nThere are several ways to mitigate these problems.\\n\\nIt is generally a good idea to handle your internal contract state changes before calling external contracts, such as in the withdrawal design pattern. Use battle tested design patterns and learn from other people’s mistakes and heed their advice.\\n\\nA more complex solution could implement mutual exclusion, or a mutex. This allows you to lock a state and only allow changes by the owner of the lock.\\n\\nYou can dig deeper into known attacks such as these here: https://consensys.github.io/smart-contract-best-practices/known_attacks/#race-conditions42\\n\\n# Transaction Ordering and Timestamp Dependence\\n\\nThe previous examples of race conditions involved an attacker executing malicious code in a single transaction. Here we focus on how transactions are included in the blockchain and considerations around the process.\\n\\nTransactions that are broadcast to the network but have not yet been included in a block are in the mempool.\\n\\nMiners choose the order in which to include transactions from the mempool into a block that they are mining.\\n\\nAlso, since transactions are in the mempool before they make it into a block, anyone can know what transactions are about to occur on the network. \\n https://i.imgur.com/I2WfEwL.png\\n\\nThis can be problematic for things like decentralized markets.\\n\\nProtecting against this is difficult and you will likely need to devise contract specific solutions.\\n\\nDecentralized markets can mitigate concerns by implementing batch auctions or using a pre-commit scheme, where the details are submitted after the transaction is committed. \\n\\n# Integer Overflow and Underflow\\n\\nIntegers can underflow or overflow in the EVM.\\n\\nThe max value for an unsigned integer is 2 ^ 256 - 1, which is roughly 1.15 times 10 ^ 77. If an integer overflows, the value will go back to 0. For example, a variable called score of type uint8 storing a value of 255 that is incremented by 1 will now be storing the value 0.\\n\\nYou may or may not have to worry about integer overflow depending on your smart contract.\\n\\nA variable that can be set by user input may need to check against overflow, whereas it is infeasible that a variable that is incremented will ever approach this max value.\\n\\nUnderflow is a similar situation, but when a uint goes below its minimum value it will be set to its maximum value.\\n\\nBe careful with smaller data types like uint8, uint16, etc… they can more easily reach their maximum value\\n\\n# Denial of Service\\n\\nhttps://i.imgur.com/OPAYpA3.png\\n\\nAnother danger of passing execution to another contract is a denial of service attack.\\n\\nIn the provided example, the highestBidder could be another contract and transferring funds to the contract triggers the contract’s fallback function. If the contract’s fallback always reverts, the Auction contract’s bid function becomes unusable - it will always revert. The bid function requires the transfer operation to succeed to fully execute.\\n\\nThe contract at the provided address throws an exception, execution halts and the exception is passed into the calling contract and prevents further execution.\\n\\nThis problem is avoidable using the withdrawal pattern.\\n\\n# Force Sending Ether\\n\\nAnother danger is using logic that depends on the contract balance. \\n\\nBe aware that it is possible to send ether to a contract without triggering its fallback function. \\n\\nUsing the selfdestruct function on another contract and using the target contract as the recipient will force the destroyed contract’s funds to be sent to the target.\\n\\nIt is also possible to precompute a contracts address and send ether to the address before the contract is deployed.\\n\\nThe contract’s balance will be greater than 0 when it is finally deployed.\\n\\nhttps://eprint.iacr.org/2016/1007.pdf\\nhttps://solidity.readthedocs.io/en/develop/bugs.html\\nhttps://medium.freecodecamp.org/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmU6dW4dSEFQvfk47Ynqbd67UJSnn7pzuBgZsmFuAqjNcF\",\"video480hash\":\"QmQ8wY5z7Htr9L6k9xb4YeZTzsjDWpFmLBpYC1fARNL2A1\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "vxss8el8",
"title": "Ethereum #51: Exploits and Dangers"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:29:42",
"trx_id": "ecd8e290834d98c5cf02788958b9c9cb53460d5c",
"trx_in_block": 11,
"virtual_op": 0
}2018/06/29 04:28:18
2018/06/29 04:28:18
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/1nw1q9sw'><img src='https://ipfs.io/ipfs/QmXTjNmE2rbTGgHANkBvN23GeBJv9kJYMQpFJ4fEf8sZg7'></a></center><hr> There are several design patterns and best practices that have been developed. # Fail early and fail loud //Bad code, do not emulate function silentFailIfZero(uint num) public view returns (uint){ if(num != 0){ return num; } } This function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not. function throwsErrorIfZero(uint num) public view returns (uint){ require(num != 0); return num; } This function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown. # Restricting Access You cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information. You can restrict other contracts’ access to the state by making state variables private. contract C1 { uint private internalNum; } You can restrict function access so that only specific addresses are permitted to execute functions. This is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. https://i.imgur.com/1L2eAn0.png It can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system. # Auto Deprecation https://i.imgur.com/JfXhR0R.png The auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. This can be useful when running alpha or beta testing for your smart contracts. Remember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. # Mortal https://i.imgur.com/4tXBASn.png Implementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain. You can destroy a contract using the selfdestruct keyword. The function to do it is often called kill. It takes one parameter which is the address that will receive all of the funds that the contract currently holds. As an irreversible action, restricting access to this function is important. # Pull over Push Payments Navigate to this fund splitter contract on github. There are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account. This pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson. # Circuit Breaker Circuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented. Circuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds. contract CircuitBreaker { bool public stopped = false; modifier stopInEmergency { require(!stopped); _; } modifier onlyInEmergency { require(stopped); _; } function deposit() stopInEmergency public { … } function withdraw() onlyInEmergency public { … } } In a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins. # State Machine Contracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time. The Colony token weighted voting protocol implemented this design pattern to manage the poll state. https://i.imgur.com/GCfGdZx.png Admins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached. # Speed Bump Speed bumps slow down actions so that if malicious actions occur, there is time to recover. https://i.imgur.com/tzY3GYg.png For example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery. https://solidity.readthedocs.io/en/develop/common-patterns.html https://github.com/cjgdev/smart-contract-patterns https://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da <hr><a href='https://d.tube/#!/v/goam/1nw1q9sw'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #50: Design Patterns","snaphash":"QmQ2bomN9MREqyaG6rGEKscRUYJccyBHMTBGgYAiL3mBmS","author":"goam","permlink":"1nw1q9sw","duration":101.215782,"filesize":9966972,"spritehash":"QmULXzFNvujDfuSC6Cxrt5VRoXaCSiUuzKr6HTQe2zRB3G"},"content":{"videohash":"QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ","description":"There are several design patterns and best practices that have been developed.\n\n<strong># Fail early and fail loud</strong>\n\n //Bad code, do not emulate\n function silentFailIfZero(uint num) public view returns (uint){\n if(num != 0){\n return num;\n }\n }\n\nThis function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not.\n\n function throwsErrorIfZero(uint num) public view returns (uint){\n require(num != 0);\n return num;\n }\n\nThis function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown.\n\n# Restricting Access\n\nYou cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information.\n\nYou can restrict other contracts’ access to the state by making state variables private.\n\ncontract C1 {\n uint private internalNum;\n}\n\nYou can restrict function access so that only specific addresses are permitted to execute functions.\n\nThis is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. \n\nhttps://i.imgur.com/1L2eAn0.png\n\nIt can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system.\n\n# Auto Deprecation\n\nhttps://i.imgur.com/JfXhR0R.png\n\nThe auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. \n\nThis can be useful when running alpha or beta testing for your smart contracts.\n\nRemember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. \n\n# Mortal\n\nhttps://i.imgur.com/4tXBASn.png\n\nImplementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain.\n\nYou can destroy a contract using the selfdestruct keyword. The function to do it is often called kill.\n\nIt takes one parameter which is the address that will receive all of the funds that the contract currently holds.\n\nAs an irreversible action, restricting access to this function is important.\n\n# Pull over Push Payments\n\nNavigate to this fund splitter contract on github.\n\nThere are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account.\n\nThis pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson.\n\n# Circuit Breaker\n\nCircuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented.\n\nCircuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds.\n\ncontract CircuitBreaker {\n bool public stopped = false;\n modifier stopInEmergency { require(!stopped); _; }\n modifier onlyInEmergency { require(stopped); _; }\n function deposit() stopInEmergency public { … }\n function withdraw() onlyInEmergency public { … } \n}\n\nIn a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins.\n\n# State Machine\n\nContracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time.\n\nThe Colony token weighted voting protocol implemented this design pattern to manage the poll state.\n\nhttps://i.imgur.com/GCfGdZx.png\n\nAdmins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached.\n\n# Speed Bump\n\nSpeed bumps slow down actions so that if malicious actions occur, there is time to recover. \n\nhttps://i.imgur.com/tzY3GYg.png\n\nFor example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery.\n\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html\nhttps://github.com/cjgdev/smart-contract-patterns\nhttps://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmdUY2rQr3bC9ZBjRVgPSHYdttPH27XAu6r2hiBtdZKQBE","video480hash":"QmVSKzS9vbytcXCPvASJoVp2hT9yH8unKKWxPHPiQ43Dpz"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 1nw1q9sw |
| title | Ethereum #50: Design Patterns |
| Transaction Info | Block #23736793/Trx d3fa7c47a7c77f9b92f3aae9223616323e89eb21 |
View Raw JSON Data
{
"block": 23736793,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/1nw1q9sw'><img src='https://ipfs.io/ipfs/QmXTjNmE2rbTGgHANkBvN23GeBJv9kJYMQpFJ4fEf8sZg7'></a></center><hr>\n\nThere are several design patterns and best practices that have been developed.\n\n# Fail early and fail loud\n\n //Bad code, do not emulate\n function silentFailIfZero(uint num) public view returns (uint){\n if(num != 0){\n return num;\n }\n }\n\nThis function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not.\n\n function throwsErrorIfZero(uint num) public view returns (uint){\n require(num != 0);\n return num;\n }\n\nThis function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown.\n\n# Restricting Access\n\nYou cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information.\n\nYou can restrict other contracts’ access to the state by making state variables private.\n\ncontract C1 {\n uint private internalNum;\n}\n\nYou can restrict function access so that only specific addresses are permitted to execute functions.\n\nThis is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. \n\nhttps://i.imgur.com/1L2eAn0.png\n\nIt can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system.\n\n# Auto Deprecation\n\nhttps://i.imgur.com/JfXhR0R.png\n\nThe auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. \n\nThis can be useful when running alpha or beta testing for your smart contracts.\n\nRemember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. \n\n# Mortal\n\nhttps://i.imgur.com/4tXBASn.png\n\nImplementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain.\n\nYou can destroy a contract using the selfdestruct keyword. The function to do it is often called kill.\n\nIt takes one parameter which is the address that will receive all of the funds that the contract currently holds.\n\nAs an irreversible action, restricting access to this function is important.\n\n# Pull over Push Payments\n\nNavigate to this fund splitter contract on github.\n\nThere are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account.\n\nThis pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson.\n\n# Circuit Breaker\n\nCircuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented.\n\nCircuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds.\n\ncontract CircuitBreaker {\n bool public stopped = false;\n modifier stopInEmergency { require(!stopped); _; }\n modifier onlyInEmergency { require(stopped); _; }\n function deposit() stopInEmergency public { … }\n function withdraw() onlyInEmergency public { … } \n}\n\nIn a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins.\n\n# State Machine\n\nContracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time.\n\nThe Colony token weighted voting protocol implemented this design pattern to manage the poll state.\n\nhttps://i.imgur.com/GCfGdZx.png\n\nAdmins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached.\n\n# Speed Bump\n\nSpeed bumps slow down actions so that if malicious actions occur, there is time to recover. \n\nhttps://i.imgur.com/tzY3GYg.png\n\nFor example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery.\n\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html\nhttps://github.com/cjgdev/smart-contract-patterns\nhttps://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da\n\n<hr><a href='https://d.tube/#!/v/goam/1nw1q9sw'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #50: Design Patterns\",\"snaphash\":\"QmQ2bomN9MREqyaG6rGEKscRUYJccyBHMTBGgYAiL3mBmS\",\"author\":\"goam\",\"permlink\":\"1nw1q9sw\",\"duration\":101.215782,\"filesize\":9966972,\"spritehash\":\"QmULXzFNvujDfuSC6Cxrt5VRoXaCSiUuzKr6HTQe2zRB3G\"},\"content\":{\"videohash\":\"QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ\",\"description\":\"There are several design patterns and best practices that have been developed.\\n\\n<strong># Fail early and fail loud</strong>\\n\\n //Bad code, do not emulate\\n function silentFailIfZero(uint num) public view returns (uint){\\n if(num != 0){\\n return num;\\n }\\n }\\n\\nThis function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not.\\n\\n function throwsErrorIfZero(uint num) public view returns (uint){\\n require(num != 0);\\n return num;\\n }\\n\\nThis function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown.\\n\\n# Restricting Access\\n\\nYou cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information.\\n\\nYou can restrict other contracts’ access to the state by making state variables private.\\n\\ncontract C1 {\\n uint private internalNum;\\n}\\n\\nYou can restrict function access so that only specific addresses are permitted to execute functions.\\n\\nThis is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. \\n\\nhttps://i.imgur.com/1L2eAn0.png\\n\\nIt can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system.\\n\\n# Auto Deprecation\\n\\nhttps://i.imgur.com/JfXhR0R.png\\n\\nThe auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. \\n\\nThis can be useful when running alpha or beta testing for your smart contracts.\\n\\nRemember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. \\n\\n# Mortal\\n\\nhttps://i.imgur.com/4tXBASn.png\\n\\nImplementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain.\\n\\nYou can destroy a contract using the selfdestruct keyword. The function to do it is often called kill.\\n\\nIt takes one parameter which is the address that will receive all of the funds that the contract currently holds.\\n\\nAs an irreversible action, restricting access to this function is important.\\n\\n# Pull over Push Payments\\n\\nNavigate to this fund splitter contract on github.\\n\\nThere are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account.\\n\\nThis pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson.\\n\\n# Circuit Breaker\\n\\nCircuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented.\\n\\nCircuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds.\\n\\ncontract CircuitBreaker {\\n bool public stopped = false;\\n modifier stopInEmergency { require(!stopped); _; }\\n modifier onlyInEmergency { require(stopped); _; }\\n function deposit() stopInEmergency public { … }\\n function withdraw() onlyInEmergency public { … } \\n}\\n\\nIn a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins.\\n\\n# State Machine\\n\\nContracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time.\\n\\nThe Colony token weighted voting protocol implemented this design pattern to manage the poll state.\\n\\nhttps://i.imgur.com/GCfGdZx.png\\n\\nAdmins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached.\\n\\n# Speed Bump\\n\\nSpeed bumps slow down actions so that if malicious actions occur, there is time to recover. \\n\\nhttps://i.imgur.com/tzY3GYg.png\\n\\nFor example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery.\\n\\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html\\nhttps://github.com/cjgdev/smart-contract-patterns\\nhttps://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmdUY2rQr3bC9ZBjRVgPSHYdttPH27XAu6r2hiBtdZKQBE\",\"video480hash\":\"QmVSKzS9vbytcXCPvASJoVp2hT9yH8unKKWxPHPiQ43Dpz\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "1nw1q9sw",
"title": "Ethereum #50: Design Patterns"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:28:18",
"trx_id": "d3fa7c47a7c77f9b92f3aae9223616323e89eb21",
"trx_in_block": 11,
"virtual_op": 0
}2018/06/29 04:24:39
2018/06/29 04:24:39
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | 1nw1q9sw |
| Transaction Info | Block #23736720/Trx 29f5143a2dc4e5e164c88e41fa767655c603ec15 |
View Raw JSON Data
{
"block": 23736720,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "1nw1q9sw"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:24:39",
"trx_id": "29f5143a2dc4e5e164c88e41fa767655c603ec15",
"trx_in_block": 1,
"virtual_op": 0
}2018/06/29 04:24:39
2018/06/29 04:24:39
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/1nw1q9sw'><img src='https://ipfs.io/ipfs/QmXTjNmE2rbTGgHANkBvN23GeBJv9kJYMQpFJ4fEf8sZg7'></a></center><hr> There are several design patterns and best practices that have been developed. # Fail early and fail loud //Bad code, do not emulate function silentFailIfZero(uint num) public view returns (uint){ if(num != 0){ return num; } } This function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not. function throwsErrorIfZero(uint num) public view returns (uint){ require(num != 0); return num; } This function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown. # Restricting Access You cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information. You can restrict other contracts’ access to the state by making state variables private. contract C1 { uint private internalNum; } You can restrict function access so that only specific addresses are permitted to execute functions. This is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. https://i.imgur.com/1L2eAn0.png It can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system. # Auto Deprecation https://i.imgur.com/JfXhR0R.png The auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. This can be useful when running alpha or beta testing for your smart contracts. Remember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. # Mortal https://i.imgur.com/4tXBASn.png Implementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain. You can destroy a contract using the selfdestruct keyword. The function to do it is often called kill. It takes one parameter which is the address that will receive all of the funds that the contract currently holds. As an irreversible action, restricting access to this function is important. # Pull over Push Payments Navigate to this fund splitter contract on github. There are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account. This pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson. # Circuit Breaker Circuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented. Circuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds. contract CircuitBreaker { bool public stopped = false; modifier stopInEmergency { require(!stopped); _; } modifier onlyInEmergency { require(stopped); _; } function deposit() stopInEmergency public { … } function withdraw() onlyInEmergency public { … } } In a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins. # State Machine Contracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time. The Colony token weighted voting protocol implemented this design pattern to manage the poll state. https://i.imgur.com/GCfGdZx.png Admins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached. # Speed Bump Speed bumps slow down actions so that if malicious actions occur, there is time to recover. https://i.imgur.com/tzY3GYg.png For example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery. https://solidity.readthedocs.io/en/develop/common-patterns.html https://github.com/cjgdev/smart-contract-patterns https://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da <hr><a href='https://d.tube/#!/v/goam/1nw1q9sw'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #50: Design Patterns","snaphash":"QmQ2bomN9MREqyaG6rGEKscRUYJccyBHMTBGgYAiL3mBmS","author":"goam","permlink":"1nw1q9sw","duration":101.215782,"filesize":9966972,"spritehash":"QmULXzFNvujDfuSC6Cxrt5VRoXaCSiUuzKr6HTQe2zRB3G"},"content":{"videohash":"QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ","description":"There are several design patterns and best practices that have been developed.\n\n# Fail early and fail loud\n\n //Bad code, do not emulate\n function silentFailIfZero(uint num) public view returns (uint){\n if(num != 0){\n return num;\n }\n }\n\nThis function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not.\n\n function throwsErrorIfZero(uint num) public view returns (uint){\n require(num != 0);\n return num;\n }\n\nThis function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown.\n\n# Restricting Access\n\nYou cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information.\n\nYou can restrict other contracts’ access to the state by making state variables private.\n\ncontract C1 {\n uint private internalNum;\n}\n\nYou can restrict function access so that only specific addresses are permitted to execute functions.\n\nThis is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. \n\nhttps://i.imgur.com/1L2eAn0.png\n\nIt can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system.\n\n# Auto Deprecation\n\nhttps://i.imgur.com/JfXhR0R.png\n\nThe auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. \n\nThis can be useful when running alpha or beta testing for your smart contracts.\n\nRemember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. \n\n# Mortal\n\nhttps://i.imgur.com/4tXBASn.png\n\nImplementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain.\n\nYou can destroy a contract using the selfdestruct keyword. The function to do it is often called kill.\n\nIt takes one parameter which is the address that will receive all of the funds that the contract currently holds.\n\nAs an irreversible action, restricting access to this function is important.\n\n# Pull over Push Payments\n\nNavigate to this fund splitter contract on github.\n\nThere are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account.\n\nThis pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson.\n\n# Circuit Breaker\n\nCircuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented.\n\nCircuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds.\n\ncontract CircuitBreaker {\n bool public stopped = false;\n modifier stopInEmergency { require(!stopped); _; }\n modifier onlyInEmergency { require(stopped); _; }\n function deposit() stopInEmergency public { … }\n function withdraw() onlyInEmergency public { … } \n}\n\nIn a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins.\n\n# State Machine\n\nContracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time.\n\nThe Colony token weighted voting protocol implemented this design pattern to manage the poll state.\n\nhttps://i.imgur.com/GCfGdZx.png\n\nAdmins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached.\n\n# Speed Bump\n\nSpeed bumps slow down actions so that if malicious actions occur, there is time to recover. \n\nhttps://i.imgur.com/tzY3GYg.png\n\nFor example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery.\n\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html\nhttps://github.com/cjgdev/smart-contract-patterns\nhttps://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmdUY2rQr3bC9ZBjRVgPSHYdttPH27XAu6r2hiBtdZKQBE","video480hash":"QmVSKzS9vbytcXCPvASJoVp2hT9yH8unKKWxPHPiQ43Dpz"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 1nw1q9sw |
| title | Ethereum #50: Design Patterns |
| Transaction Info | Block #23736720/Trx 29f5143a2dc4e5e164c88e41fa767655c603ec15 |
View Raw JSON Data
{
"block": 23736720,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/1nw1q9sw'><img src='https://ipfs.io/ipfs/QmXTjNmE2rbTGgHANkBvN23GeBJv9kJYMQpFJ4fEf8sZg7'></a></center><hr>\n\nThere are several design patterns and best practices that have been developed.\n\n# Fail early and fail loud\n\n //Bad code, do not emulate\n function silentFailIfZero(uint num) public view returns (uint){\n if(num != 0){\n return num;\n }\n }\n\nThis function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not.\n\n function throwsErrorIfZero(uint num) public view returns (uint){\n require(num != 0);\n return num;\n }\n\nThis function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown.\n\n# Restricting Access\n\nYou cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information.\n\nYou can restrict other contracts’ access to the state by making state variables private.\n\ncontract C1 {\n uint private internalNum;\n}\n\nYou can restrict function access so that only specific addresses are permitted to execute functions.\n\nThis is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. \n\nhttps://i.imgur.com/1L2eAn0.png\n\nIt can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system.\n\n# Auto Deprecation\n\nhttps://i.imgur.com/JfXhR0R.png\n\nThe auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. \n\nThis can be useful when running alpha or beta testing for your smart contracts.\n\nRemember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. \n\n# Mortal\n\nhttps://i.imgur.com/4tXBASn.png\n\nImplementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain.\n\nYou can destroy a contract using the selfdestruct keyword. The function to do it is often called kill.\n\nIt takes one parameter which is the address that will receive all of the funds that the contract currently holds.\n\nAs an irreversible action, restricting access to this function is important.\n\n# Pull over Push Payments\n\nNavigate to this fund splitter contract on github.\n\nThere are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account.\n\nThis pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson.\n\n# Circuit Breaker\n\nCircuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented.\n\nCircuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds.\n\ncontract CircuitBreaker {\n bool public stopped = false;\n modifier stopInEmergency { require(!stopped); _; }\n modifier onlyInEmergency { require(stopped); _; }\n function deposit() stopInEmergency public { … }\n function withdraw() onlyInEmergency public { … } \n}\n\nIn a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins.\n\n# State Machine\n\nContracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time.\n\nThe Colony token weighted voting protocol implemented this design pattern to manage the poll state.\n\nhttps://i.imgur.com/GCfGdZx.png\n\nAdmins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached.\n\n# Speed Bump\n\nSpeed bumps slow down actions so that if malicious actions occur, there is time to recover. \n\nhttps://i.imgur.com/tzY3GYg.png\n\nFor example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery.\n\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html\nhttps://github.com/cjgdev/smart-contract-patterns\nhttps://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da\n\n<hr><a href='https://d.tube/#!/v/goam/1nw1q9sw'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #50: Design Patterns\",\"snaphash\":\"QmQ2bomN9MREqyaG6rGEKscRUYJccyBHMTBGgYAiL3mBmS\",\"author\":\"goam\",\"permlink\":\"1nw1q9sw\",\"duration\":101.215782,\"filesize\":9966972,\"spritehash\":\"QmULXzFNvujDfuSC6Cxrt5VRoXaCSiUuzKr6HTQe2zRB3G\"},\"content\":{\"videohash\":\"QmYq91ZRPXh8wbT8rTMMss3qEvSTe4fmiJUmd3KMLB3goQ\",\"description\":\"There are several design patterns and best practices that have been developed.\\n\\n# Fail early and fail loud\\n\\n //Bad code, do not emulate\\n function silentFailIfZero(uint num) public view returns (uint){\\n if(num != 0){\\n return num;\\n }\\n }\\n\\nThis function will fail without throwing an exception. This is a bad practice because it is not immediately clear whether the function executed properly or not.\\n\\n function throwsErrorIfZero(uint num) public view returns (uint){\\n require(num != 0);\\n return num;\\n }\\n\\nThis function checks the condition required for execution as early as possible in the function body and throws an exception if the condition is not met. This is a good practice to reduce unnecessary code execution in the event that an exception will be thrown.\\n\\n# Restricting Access\\n\\nYou cannot prevent people or computer programs from reading your contracts’ state. The state is publicly available information.\\n\\nYou can restrict other contracts’ access to the state by making state variables private.\\n\\ncontract C1 {\\n uint private internalNum;\\n}\\n\\nYou can restrict function access so that only specific addresses are permitted to execute functions.\\n\\nThis is useful for allowing only designated users, or other contracts to access administrative methods, such as changing ownership of a contract, implementing an upgrade or stopping the contract. \\n\\nhttps://i.imgur.com/1L2eAn0.png\\n\\nIt can be useful to restrict function access to owners, a more general admin class or to any stakeholder in the system.\\n\\n# Auto Deprecation\\n\\nhttps://i.imgur.com/JfXhR0R.png\\n\\nThe auto deprecation design pattern is a useful strategy for closing contracts that should expire after a certain amount of time. \\n\\nThis can be useful when running alpha or beta testing for your smart contracts.\\n\\nRemember that using timestamps such as the now keyword are subject to manipulation by the block miners in a 30-second window. \\n\\n# Mortal\\n\\nhttps://i.imgur.com/4tXBASn.png\\n\\nImplementing the mortal design pattern means including the ability to destroy the contract and remove it from the blockchain.\\n\\nYou can destroy a contract using the selfdestruct keyword. The function to do it is often called kill.\\n\\nIt takes one parameter which is the address that will receive all of the funds that the contract currently holds.\\n\\nAs an irreversible action, restricting access to this function is important.\\n\\n# Pull over Push Payments\\n\\nNavigate to this fund splitter contract on github.\\n\\nThere are a few key takeaways from this contract. There is a separation of function logic. The split() function handles the accounting and divides the msg.value sent with the transaction. Another function, withdraw(), allows accounts to transfer their balance from the contract to their account.\\n\\nThis pattern is also called the withdrawal pattern. It protects against re-entrancy and denial of service attacks that we will cover in the next lesson.\\n\\n# Circuit Breaker\\n\\nCircuit Breakers are design patterns that allow contract functionality to be stopped. This would be desirable in situations where there is a live contract where a bug has been detected. Freezing the contract would be beneficial for reducing harm before a fix can be implemented.\\n\\nCircuit breaker contracts can be set up to permit certain functions in certain situations. For example, if you are implementing a withdrawal pattern, you might want to stop people from depositing funds into the contract if a bug has been detected, while still allowing accounts with balances to withdraw their funds.\\n\\ncontract CircuitBreaker {\\n bool public stopped = false;\\n modifier stopInEmergency { require(!stopped); _; }\\n modifier onlyInEmergency { require(stopped); _; }\\n function deposit() stopInEmergency public { … }\\n function withdraw() onlyInEmergency public { … } \\n}\\n\\nIn a situation such as this, you would also want to restrict access to the accounts that can modify the stopped state variable, maybe to the contract owner (such as multisig wallet) or a set of admins.\\n\\n# State Machine\\n\\nContracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time.\\n\\nThe Colony token weighted voting protocol implemented this design pattern to manage the poll state.\\n\\nhttps://i.imgur.com/GCfGdZx.png\\n\\nAdmins can only add poll options in the poll creation stage. Votes can only be submitted when the poll was active. The poll can only be resolved after the poll close time has been reached.\\n\\n# Speed Bump\\n\\nSpeed bumps slow down actions so that if malicious actions occur, there is time to recover. \\n\\nhttps://i.imgur.com/tzY3GYg.png\\n\\nFor example, The DAO required 27 days between a successful request to split the DAO and the ability to do so. This ensured the funds were kept within the contract, increasing the likelihood of recovery.\\n\\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html\\nhttps://github.com/cjgdev/smart-contract-patterns\\nhttps://gist.github.com/critesjosh/80d41928db2310684bc7660aa45873da\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmdUY2rQr3bC9ZBjRVgPSHYdttPH27XAu6r2hiBtdZKQBE\",\"video480hash\":\"QmVSKzS9vbytcXCPvASJoVp2hT9yH8unKKWxPHPiQ43Dpz\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "1nw1q9sw",
"title": "Ethereum #50: Design Patterns"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:24:39",
"trx_id": "29f5143a2dc4e5e164c88e41fa767655c603ec15",
"trx_in_block": 1,
"virtual_op": 0
}sawant9171upvoted (100.00%) @goam / wmrgfcl72018/06/29 04:21:03
sawant9171upvoted (100.00%) @goam / wmrgfcl7
2018/06/29 04:21:03
| author | goam |
| permlink | wmrgfcl7 |
| voter | sawant9171 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23736648/Trx 79efe1b531868796dd50089d4a6fb1538e5894fd |
View Raw JSON Data
{
"block": 23736648,
"op": [
"vote",
{
"author": "goam",
"permlink": "wmrgfcl7",
"voter": "sawant9171",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:21:03",
"trx_id": "79efe1b531868796dd50089d4a6fb1538e5894fd",
"trx_in_block": 4,
"virtual_op": 0
}2018/06/29 04:19:30
2018/06/29 04:19:30
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | wmrgfcl7 |
| Transaction Info | Block #23736617/Trx cb03ae4dc9306179141e2022d0a9dd2a47d9e214 |
View Raw JSON Data
{
"block": 23736617,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "wmrgfcl7"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:19:30",
"trx_id": "cb03ae4dc9306179141e2022d0a9dd2a47d9e214",
"trx_in_block": 25,
"virtual_op": 0
}2018/06/29 04:19:30
2018/06/29 04:19:30
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/wmrgfcl7'><img src='https://ipfs.io/ipfs/Qmec2S6Tee3QvZp4SZzz52zXPChzkMhPyHVsQmXXUoL8G1'></a></center><hr> http://dapps.oraclize.it/browser-solidity/#gist=9817193e5b05206847ed1fcd1d16bd1d&version=soljson-v0.4.20+commit.3155dd80.js&version=soljson-v0.4.21+commit.dfe3193c.js http://docs.oraclize.it/ <hr><a href='https://d.tube/#!/v/goam/wmrgfcl7'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmdyeV8FFcYATjvS3E27QEdjXYYZ1iu39NKYrV4RCgL3Ny'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #49: Oracles","snaphash":"QmcpsK4yURyqeeX76A1udfAGFNek2Rv7FkxT2GBtDtufyj","author":"goam","permlink":"wmrgfcl7","duration":211.696327,"filesize":15848970,"spritehash":"QmQvSssU26PMCuK5zX3uBUSfpsMEmGWFaS8kfhsMe2obma"},"content":{"videohash":"QmdyeV8FFcYATjvS3E27QEdjXYYZ1iu39NKYrV4RCgL3Ny","description":"http://dapps.oraclize.it/browser-solidity/#gist=9817193e5b05206847ed1fcd1d16bd1d&version=soljson-v0.4.20+commit.3155dd80.js&version=soljson-v0.4.21+commit.dfe3193c.js\nhttp://docs.oraclize.it/","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmatDVm9uz5t2XfqifFB6f1jh1Pgarm2Y3nAn4ZeW2hRFf","video480hash":"QmaN3wU6DMY1EDWK5UpgQozERoFwYmQCDNZ2P8BAojLopE"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | wmrgfcl7 |
| title | Ethereum #49: Oracles |
| Transaction Info | Block #23736617/Trx cb03ae4dc9306179141e2022d0a9dd2a47d9e214 |
View Raw JSON Data
{
"block": 23736617,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/wmrgfcl7'><img src='https://ipfs.io/ipfs/Qmec2S6Tee3QvZp4SZzz52zXPChzkMhPyHVsQmXXUoL8G1'></a></center><hr>\n\nhttp://dapps.oraclize.it/browser-solidity/#gist=9817193e5b05206847ed1fcd1d16bd1d&version=soljson-v0.4.20+commit.3155dd80.js&version=soljson-v0.4.21+commit.dfe3193c.js\nhttp://docs.oraclize.it/\n\n<hr><a href='https://d.tube/#!/v/goam/wmrgfcl7'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmdyeV8FFcYATjvS3E27QEdjXYYZ1iu39NKYrV4RCgL3Ny'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #49: Oracles\",\"snaphash\":\"QmcpsK4yURyqeeX76A1udfAGFNek2Rv7FkxT2GBtDtufyj\",\"author\":\"goam\",\"permlink\":\"wmrgfcl7\",\"duration\":211.696327,\"filesize\":15848970,\"spritehash\":\"QmQvSssU26PMCuK5zX3uBUSfpsMEmGWFaS8kfhsMe2obma\"},\"content\":{\"videohash\":\"QmdyeV8FFcYATjvS3E27QEdjXYYZ1iu39NKYrV4RCgL3Ny\",\"description\":\"http://dapps.oraclize.it/browser-solidity/#gist=9817193e5b05206847ed1fcd1d16bd1d&version=soljson-v0.4.20+commit.3155dd80.js&version=soljson-v0.4.21+commit.dfe3193c.js\\nhttp://docs.oraclize.it/\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmatDVm9uz5t2XfqifFB6f1jh1Pgarm2Y3nAn4ZeW2hRFf\",\"video480hash\":\"QmaN3wU6DMY1EDWK5UpgQozERoFwYmQCDNZ2P8BAojLopE\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "wmrgfcl7",
"title": "Ethereum #49: Oracles"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:19:30",
"trx_id": "cb03ae4dc9306179141e2022d0a9dd2a47d9e214",
"trx_in_block": 25,
"virtual_op": 0
}2018/06/29 04:14:27
2018/06/29 04:14:27
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | ycn250j3 |
| Transaction Info | Block #23736516/Trx 1a5c57690f68aee4d239c92f46d9a82890161dae |
View Raw JSON Data
{
"block": 23736516,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "ycn250j3"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:14:27",
"trx_id": "1a5c57690f68aee4d239c92f46d9a82890161dae",
"trx_in_block": 40,
"virtual_op": 0
}2018/06/29 04:14:27
2018/06/29 04:14:27
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/ycn250j3'><img src='https://ipfs.io/ipfs/Qmb6SbacUYPf9Atc1k6nrD69yHNDkg61aEUEeLqEp91grw'></a></center><hr> https://blog.colony.io/writing-upgradeable-contracts-in-solidity-6743f0eecc88 https://consensys.github.io/smart-contract-best-practices/software_engineering/ https://medium.com/aigang-network/upgradable-smart-contracts-what-weve-learned-at-aigang-b181d3d4b668 https://blog.indorse.io/ethereum-upgradeable-smart-contract-strategies-456350d0557c https://0xproject.com/wiki#Architecture <hr><a href='https://d.tube/#!/v/goam/ycn250j3'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmZnyjbP14Atc9oUWDiKr4Hu3Rvjrk6jZc2eaez3P8eMmu'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #48: Upgradable Contracts","snaphash":"QmVUmqUJAqC5FDgNnE9WoX91t9Kg7Z7aEsRRVg7Fnkxjvi","author":"goam","permlink":"ycn250j3","duration":128.568889,"filesize":10730433,"spritehash":"Qmbfg4fN7PVjf8kDbFAg3DvbK4bKVJbGRHupCdxuxNXY9H"},"content":{"videohash":"QmZnyjbP14Atc9oUWDiKr4Hu3Rvjrk6jZc2eaez3P8eMmu","description":"https://blog.colony.io/writing-upgradeable-contracts-in-solidity-6743f0eecc88\nhttps://consensys.github.io/smart-contract-best-practices/software_engineering/\nhttps://medium.com/aigang-network/upgradable-smart-contracts-what-weve-learned-at-aigang-b181d3d4b668\nhttps://blog.indorse.io/ethereum-upgradeable-smart-contract-strategies-456350d0557c\nhttps://0xproject.com/wiki#Architecture","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmWbqMe5fN1C6D5NDZjTcAw2G3xBWJ7FUcfMnZQ5ACtrdB","video480hash":"QmWb3vvoocCH4HTJ6GbsXs93zLMaTTE7Cryhs8UiMsGogz"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | ycn250j3 |
| title | Ethereum #48: Upgradable Contracts |
| Transaction Info | Block #23736516/Trx 1a5c57690f68aee4d239c92f46d9a82890161dae |
View Raw JSON Data
{
"block": 23736516,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/ycn250j3'><img src='https://ipfs.io/ipfs/Qmb6SbacUYPf9Atc1k6nrD69yHNDkg61aEUEeLqEp91grw'></a></center><hr>\n\nhttps://blog.colony.io/writing-upgradeable-contracts-in-solidity-6743f0eecc88\nhttps://consensys.github.io/smart-contract-best-practices/software_engineering/\nhttps://medium.com/aigang-network/upgradable-smart-contracts-what-weve-learned-at-aigang-b181d3d4b668\nhttps://blog.indorse.io/ethereum-upgradeable-smart-contract-strategies-456350d0557c\nhttps://0xproject.com/wiki#Architecture\n\n<hr><a href='https://d.tube/#!/v/goam/ycn250j3'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmZnyjbP14Atc9oUWDiKr4Hu3Rvjrk6jZc2eaez3P8eMmu'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #48: Upgradable Contracts\",\"snaphash\":\"QmVUmqUJAqC5FDgNnE9WoX91t9Kg7Z7aEsRRVg7Fnkxjvi\",\"author\":\"goam\",\"permlink\":\"ycn250j3\",\"duration\":128.568889,\"filesize\":10730433,\"spritehash\":\"Qmbfg4fN7PVjf8kDbFAg3DvbK4bKVJbGRHupCdxuxNXY9H\"},\"content\":{\"videohash\":\"QmZnyjbP14Atc9oUWDiKr4Hu3Rvjrk6jZc2eaez3P8eMmu\",\"description\":\"https://blog.colony.io/writing-upgradeable-contracts-in-solidity-6743f0eecc88\\nhttps://consensys.github.io/smart-contract-best-practices/software_engineering/\\nhttps://medium.com/aigang-network/upgradable-smart-contracts-what-weve-learned-at-aigang-b181d3d4b668\\nhttps://blog.indorse.io/ethereum-upgradeable-smart-contract-strategies-456350d0557c\\nhttps://0xproject.com/wiki#Architecture\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmWbqMe5fN1C6D5NDZjTcAw2G3xBWJ7FUcfMnZQ5ACtrdB\",\"video480hash\":\"QmWb3vvoocCH4HTJ6GbsXs93zLMaTTE7Cryhs8UiMsGogz\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "ycn250j3",
"title": "Ethereum #48: Upgradable Contracts"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:14:27",
"trx_id": "1a5c57690f68aee4d239c92f46d9a82890161dae",
"trx_in_block": 40,
"virtual_op": 0
}2018/06/29 04:09:21
2018/06/29 04:09:21
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | gmoryu1s |
| Transaction Info | Block #23736414/Trx f7901976ddc853cebabe87ba286538a168e72751 |
View Raw JSON Data
{
"block": 23736414,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "gmoryu1s"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:09:21",
"trx_id": "f7901976ddc853cebabe87ba286538a168e72751",
"trx_in_block": 12,
"virtual_op": 0
}2018/06/29 04:09:21
2018/06/29 04:09:21
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/gmoryu1s'><img src='https://ipfs.io/ipfs/Qmd7ksEyLy3KfwoU7qFwwjmhJZfVorpM45iUPXVDZyjJ9g'></a></center><hr> https://ipfs.io/ https://www.youtube.com/watch?v=8CMxDNuuAiQ https://ipfs.io/docs/ https://medium.com/@ConsenSys/an-introduction-to-ipfs-9bba4860abd0 <hr><a href='https://d.tube/#!/v/goam/gmoryu1s'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmbCiDu1aoqAxn7EgmdvaYUA4NNDiyYDvp4h3kF8svFEbz'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #47: Introduction to IPFS","snaphash":"QmPSnMuMWhyiwonUAveyNuSSfVB2XdPX7dzUP21GGAfyq4","author":"goam","permlink":"gmoryu1s","duration":102.051701,"filesize":6776452,"spritehash":"QmWw1gZWjMshmndJTfdT4TZbwuH8xfigpvPtCpRzx2TDKq"},"content":{"videohash":"QmbCiDu1aoqAxn7EgmdvaYUA4NNDiyYDvp4h3kF8svFEbz","description":"https://ipfs.io/\nhttps://www.youtube.com/watch?v=8CMxDNuuAiQ\nhttps://ipfs.io/docs/\nhttps://medium.com/@ConsenSys/an-introduction-to-ipfs-9bba4860abd0","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmZhfAr9WLGQaUZTAGH5r28KcLkkuSwRnxfCagGz5eFhWo","video480hash":"QmYCgQKBG3fhgDGP92F54x7qDxYugWtQa41LQGziRTtgtd"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | gmoryu1s |
| title | Ethereum #47: Introduction to IPFS |
| Transaction Info | Block #23736414/Trx f7901976ddc853cebabe87ba286538a168e72751 |
View Raw JSON Data
{
"block": 23736414,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/gmoryu1s'><img src='https://ipfs.io/ipfs/Qmd7ksEyLy3KfwoU7qFwwjmhJZfVorpM45iUPXVDZyjJ9g'></a></center><hr>\n\nhttps://ipfs.io/\nhttps://www.youtube.com/watch?v=8CMxDNuuAiQ\nhttps://ipfs.io/docs/\nhttps://medium.com/@ConsenSys/an-introduction-to-ipfs-9bba4860abd0\n\n<hr><a href='https://d.tube/#!/v/goam/gmoryu1s'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmbCiDu1aoqAxn7EgmdvaYUA4NNDiyYDvp4h3kF8svFEbz'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #47: Introduction to IPFS\",\"snaphash\":\"QmPSnMuMWhyiwonUAveyNuSSfVB2XdPX7dzUP21GGAfyq4\",\"author\":\"goam\",\"permlink\":\"gmoryu1s\",\"duration\":102.051701,\"filesize\":6776452,\"spritehash\":\"QmWw1gZWjMshmndJTfdT4TZbwuH8xfigpvPtCpRzx2TDKq\"},\"content\":{\"videohash\":\"QmbCiDu1aoqAxn7EgmdvaYUA4NNDiyYDvp4h3kF8svFEbz\",\"description\":\"https://ipfs.io/\\nhttps://www.youtube.com/watch?v=8CMxDNuuAiQ\\nhttps://ipfs.io/docs/\\nhttps://medium.com/@ConsenSys/an-introduction-to-ipfs-9bba4860abd0\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmZhfAr9WLGQaUZTAGH5r28KcLkkuSwRnxfCagGz5eFhWo\",\"video480hash\":\"QmYCgQKBG3fhgDGP92F54x7qDxYugWtQa41LQGziRTtgtd\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "gmoryu1s",
"title": "Ethereum #47: Introduction to IPFS"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:09:21",
"trx_id": "f7901976ddc853cebabe87ba286538a168e72751",
"trx_in_block": 12,
"virtual_op": 0
}2018/06/29 04:04:15
2018/06/29 04:04:15
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | 65z4i4ru |
| Transaction Info | Block #23736312/Trx 570451fdce1813775d445ef4b29393e24aee24e0 |
View Raw JSON Data
{
"block": 23736312,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "65z4i4ru"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:04:15",
"trx_id": "570451fdce1813775d445ef4b29393e24aee24e0",
"trx_in_block": 4,
"virtual_op": 0
}2018/06/29 04:04:15
2018/06/29 04:04:15
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/65z4i4ru'><img src='https://ipfs.io/ipfs/QmYYmyYv7A9kjbGVhFaSrJSVPmcJZoTavKfuNKRi2ZLn81'></a></center><hr> https://ens.domains/ https://docs.ens.domains/en/latest/introduction.html# <hr><a href='https://d.tube/#!/v/goam/65z4i4ru'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYfiJdA4xq7cbTur7TahT4h6TTJ3EvxTjrjEderaHwTte'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #46: The Ethereum Name Service","snaphash":"QmUkqFRjy5ywGBaX4jtRMTQE3o8cPXUSrjfPSwRUp3UwqP","author":"goam","permlink":"65z4i4ru","duration":139.946667,"filesize":10264054,"spritehash":"QmZknHhpvAvoy7e1keX5fmBZpTH8M4JnLBs5QT9VjbDb4B"},"content":{"videohash":"QmYfiJdA4xq7cbTur7TahT4h6TTJ3EvxTjrjEderaHwTte","description":"https://ens.domains/\nhttps://docs.ens.domains/en/latest/introduction.html#","tags":["ethereum","developer","blockchain","education"],"video240hash":"Qmf4GpcGiFYjNQxqEwGXGpNcH3C1EMYBHFFnJ88DrPwa7g","video480hash":"QmVjifpNTDwY5ccJeWzMmoB23VzdYjG7LygWAK6bdPpYEu"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 65z4i4ru |
| title | Ethereum #46: The Ethereum Name Service |
| Transaction Info | Block #23736312/Trx 570451fdce1813775d445ef4b29393e24aee24e0 |
View Raw JSON Data
{
"block": 23736312,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/65z4i4ru'><img src='https://ipfs.io/ipfs/QmYYmyYv7A9kjbGVhFaSrJSVPmcJZoTavKfuNKRi2ZLn81'></a></center><hr>\n\nhttps://ens.domains/\nhttps://docs.ens.domains/en/latest/introduction.html#\n\n<hr><a href='https://d.tube/#!/v/goam/65z4i4ru'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYfiJdA4xq7cbTur7TahT4h6TTJ3EvxTjrjEderaHwTte'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #46: The Ethereum Name Service\",\"snaphash\":\"QmUkqFRjy5ywGBaX4jtRMTQE3o8cPXUSrjfPSwRUp3UwqP\",\"author\":\"goam\",\"permlink\":\"65z4i4ru\",\"duration\":139.946667,\"filesize\":10264054,\"spritehash\":\"QmZknHhpvAvoy7e1keX5fmBZpTH8M4JnLBs5QT9VjbDb4B\"},\"content\":{\"videohash\":\"QmYfiJdA4xq7cbTur7TahT4h6TTJ3EvxTjrjEderaHwTte\",\"description\":\"https://ens.domains/\\nhttps://docs.ens.domains/en/latest/introduction.html#\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"Qmf4GpcGiFYjNQxqEwGXGpNcH3C1EMYBHFFnJ88DrPwa7g\",\"video480hash\":\"QmVjifpNTDwY5ccJeWzMmoB23VzdYjG7LygWAK6bdPpYEu\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "65z4i4ru",
"title": "Ethereum #46: The Ethereum Name Service"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T04:04:15",
"trx_id": "570451fdce1813775d445ef4b29393e24aee24e0",
"trx_in_block": 4,
"virtual_op": 0
}2018/06/29 03:59:39
2018/06/29 03:59:39
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/0g0qrgh5'><img src='https://ipfs.io/ipfs/QmU3Zo46inMi33x4vmDxZJDmEkcN8AsUgCdtQvSqmx3tfh'></a></center><hr> https://www.uport.me/ https://developer.uport.me/ https://hackernoon.com/launch-a-decentralized-identity-application-using-the-developer-friendly-uport-react-truffle-box-95d1ddf176ea <hr><a href='https://d.tube/#!/v/goam/0g0qrgh5'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmUZdS9AFMcaWkUmVY4Vv5cRBeEihN8jCZESfYjT8sn8jj'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #45: uPort Integration","snaphash":"QmSNdfKjC794hetizCWe4yyGNhhHKFjt7q5AhqroYsmCMM","author":"goam","permlink":"0g0qrgh5","duration":1254.20263,"filesize":116101291,"spritehash":"QmPPogiWJ9GmD3R5TVwDgjex1EmpARWaL24qtJDMB4RrCJ"},"content":{"videohash":"QmUZdS9AFMcaWkUmVY4Vv5cRBeEihN8jCZESfYjT8sn8jj","description":"https://www.uport.me/\nhttps://developer.uport.me/\nhttps://hackernoon.com/launch-a-decentralized-identity-application-using-the-developer-friendly-uport-react-truffle-box-95d1ddf176ea","tags":["ethereum","blockchain","developer","education"],"video240hash":"QmaYWKZ34JH4ZYaZ6ZFgym4Z1x9e6Posex73ozoVRdKvpz","video480hash":"QmbDTVgYxN7fdRi9q1jbcPKV4NMoBtunX4uVcM2gZjzoxc"}},"tags":["ethereum","blockchain","developer","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 0g0qrgh5 |
| title | Ethereum #45: uPort Integration |
| Transaction Info | Block #23736220/Trx 2287cb453daac628cda7165a4de84ef23826ed38 |
View Raw JSON Data
{
"block": 23736220,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/0g0qrgh5'><img src='https://ipfs.io/ipfs/QmU3Zo46inMi33x4vmDxZJDmEkcN8AsUgCdtQvSqmx3tfh'></a></center><hr>\n\nhttps://www.uport.me/\nhttps://developer.uport.me/\nhttps://hackernoon.com/launch-a-decentralized-identity-application-using-the-developer-friendly-uport-react-truffle-box-95d1ddf176ea\n\n<hr><a href='https://d.tube/#!/v/goam/0g0qrgh5'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmUZdS9AFMcaWkUmVY4Vv5cRBeEihN8jCZESfYjT8sn8jj'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #45: uPort Integration\",\"snaphash\":\"QmSNdfKjC794hetizCWe4yyGNhhHKFjt7q5AhqroYsmCMM\",\"author\":\"goam\",\"permlink\":\"0g0qrgh5\",\"duration\":1254.20263,\"filesize\":116101291,\"spritehash\":\"QmPPogiWJ9GmD3R5TVwDgjex1EmpARWaL24qtJDMB4RrCJ\"},\"content\":{\"videohash\":\"QmUZdS9AFMcaWkUmVY4Vv5cRBeEihN8jCZESfYjT8sn8jj\",\"description\":\"https://www.uport.me/\\nhttps://developer.uport.me/\\nhttps://hackernoon.com/launch-a-decentralized-identity-application-using-the-developer-friendly-uport-react-truffle-box-95d1ddf176ea\",\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\"],\"video240hash\":\"QmaYWKZ34JH4ZYaZ6ZFgym4Z1x9e6Posex73ozoVRdKvpz\",\"video480hash\":\"QmbDTVgYxN7fdRi9q1jbcPKV4NMoBtunX4uVcM2gZjzoxc\"}},\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "0g0qrgh5",
"title": "Ethereum #45: uPort Integration"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:59:39",
"trx_id": "2287cb453daac628cda7165a4de84ef23826ed38",
"trx_in_block": 25,
"virtual_op": 0
}2018/06/29 03:59:06
2018/06/29 03:59:06
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | 0g0qrgh5 |
| Transaction Info | Block #23736209/Trx 3cab5c67846aa959c7153940d5e7749bb075f056 |
View Raw JSON Data
{
"block": 23736209,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "0g0qrgh5"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:59:06",
"trx_id": "3cab5c67846aa959c7153940d5e7749bb075f056",
"trx_in_block": 23,
"virtual_op": 0
}2018/06/29 03:59:06
2018/06/29 03:59:06
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/0g0qrgh5'><img src='https://ipfs.io/ipfs/QmU3Zo46inMi33x4vmDxZJDmEkcN8AsUgCdtQvSqmx3tfh'></a></center><hr> https://www.uport.me/ https://developer.uport.me/ https://hackernoon.com/launch-a-decentralized-identity-application-using-the-developer-friendly-uport-react-truffle-box-95d1ddf176ea <hr><a href='https://d.tube/#!/v/goam/0g0qrgh5'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmUZdS9AFMcaWkUmVY4Vv5cRBeEihN8jCZESfYjT8sn8jj'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #44: uPort Integration","snaphash":"QmSNdfKjC794hetizCWe4yyGNhhHKFjt7q5AhqroYsmCMM","author":"goam","permlink":"0g0qrgh5","duration":1254.20263,"filesize":116101291,"spritehash":"QmPPogiWJ9GmD3R5TVwDgjex1EmpARWaL24qtJDMB4RrCJ"},"content":{"videohash":"QmUZdS9AFMcaWkUmVY4Vv5cRBeEihN8jCZESfYjT8sn8jj","description":"https://www.uport.me/\nhttps://developer.uport.me/\nhttps://hackernoon.com/launch-a-decentralized-identity-application-using-the-developer-friendly-uport-react-truffle-box-95d1ddf176ea","tags":["ethereum","blockchain","developer","education"],"video240hash":"QmaYWKZ34JH4ZYaZ6ZFgym4Z1x9e6Posex73ozoVRdKvpz","video480hash":"QmbDTVgYxN7fdRi9q1jbcPKV4NMoBtunX4uVcM2gZjzoxc"}},"tags":["ethereum","blockchain","developer","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 0g0qrgh5 |
| title | Ethereum #44: uPort Integration |
| Transaction Info | Block #23736209/Trx 3cab5c67846aa959c7153940d5e7749bb075f056 |
View Raw JSON Data
{
"block": 23736209,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/0g0qrgh5'><img src='https://ipfs.io/ipfs/QmU3Zo46inMi33x4vmDxZJDmEkcN8AsUgCdtQvSqmx3tfh'></a></center><hr>\n\nhttps://www.uport.me/\nhttps://developer.uport.me/\nhttps://hackernoon.com/launch-a-decentralized-identity-application-using-the-developer-friendly-uport-react-truffle-box-95d1ddf176ea\n\n<hr><a href='https://d.tube/#!/v/goam/0g0qrgh5'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmUZdS9AFMcaWkUmVY4Vv5cRBeEihN8jCZESfYjT8sn8jj'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #44: uPort Integration\",\"snaphash\":\"QmSNdfKjC794hetizCWe4yyGNhhHKFjt7q5AhqroYsmCMM\",\"author\":\"goam\",\"permlink\":\"0g0qrgh5\",\"duration\":1254.20263,\"filesize\":116101291,\"spritehash\":\"QmPPogiWJ9GmD3R5TVwDgjex1EmpARWaL24qtJDMB4RrCJ\"},\"content\":{\"videohash\":\"QmUZdS9AFMcaWkUmVY4Vv5cRBeEihN8jCZESfYjT8sn8jj\",\"description\":\"https://www.uport.me/\\nhttps://developer.uport.me/\\nhttps://hackernoon.com/launch-a-decentralized-identity-application-using-the-developer-friendly-uport-react-truffle-box-95d1ddf176ea\",\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\"],\"video240hash\":\"QmaYWKZ34JH4ZYaZ6ZFgym4Z1x9e6Posex73ozoVRdKvpz\",\"video480hash\":\"QmbDTVgYxN7fdRi9q1jbcPKV4NMoBtunX4uVcM2gZjzoxc\"}},\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "0g0qrgh5",
"title": "Ethereum #44: uPort Integration"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:59:06",
"trx_id": "3cab5c67846aa959c7153940d5e7749bb075f056",
"trx_in_block": 23,
"virtual_op": 0
}2018/06/29 03:51:48
2018/06/29 03:51:48
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | 3nsxdjtu |
| Transaction Info | Block #23736063/Trx 9e1a7ec482b6ac3dbe32bdc4d783dfb4916ffd43 |
View Raw JSON Data
{
"block": 23736063,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "3nsxdjtu"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:51:48",
"trx_id": "9e1a7ec482b6ac3dbe32bdc4d783dfb4916ffd43",
"trx_in_block": 24,
"virtual_op": 0
}2018/06/29 03:51:48
2018/06/29 03:51:48
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/3nsxdjtu'><img src='https://ipfs.io/ipfs/QmemHw2MLsK5p1MKjrT71uJfYUCUP9KDXh1dCqVK6cFbpc'></a></center><hr> https://www.kingoftheether.com/contract-safety-checklist.html http://hackingdistributed.com/2016/07/17/cross-chain-replay/ <hr><a href='https://d.tube/#!/v/goam/3nsxdjtu'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmcJCQeB5PEx7uPqtSnApgZ7aB2NkLM6pbE2c5p7sPFL9T'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #44: Safety Checklist","snaphash":"QmSu3DqbfnwNQz8zgpM5fpihMGVbHX7Wb4CXj8UmuD9KFR","author":"goam","permlink":"3nsxdjtu","duration":332.60263,"filesize":21361264,"spritehash":"QmTxTVNSt87cTH1XbrhfMmnvzBmjtg7husZuKuNwRi1LKP"},"content":{"videohash":"QmcJCQeB5PEx7uPqtSnApgZ7aB2NkLM6pbE2c5p7sPFL9T","description":"https://www.kingoftheether.com/contract-safety-checklist.html\nhttp://hackingdistributed.com/2016/07/17/cross-chain-replay/","tags":["ethereum","developer","education","blockchain"],"video240hash":"QmVCPnFpd4QzYkeKyMLcTq6jTAfPn7cWCFXqF7JiutfQeW","video480hash":"QmRhXK62U2eDhG42rDzAJerzURfa9gitGBSouLvEWx5GF1"}},"tags":["ethereum","developer","education","blockchain","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 3nsxdjtu |
| title | Ethereum #44: Safety Checklist |
| Transaction Info | Block #23736063/Trx 9e1a7ec482b6ac3dbe32bdc4d783dfb4916ffd43 |
View Raw JSON Data
{
"block": 23736063,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/3nsxdjtu'><img src='https://ipfs.io/ipfs/QmemHw2MLsK5p1MKjrT71uJfYUCUP9KDXh1dCqVK6cFbpc'></a></center><hr>\n\nhttps://www.kingoftheether.com/contract-safety-checklist.html\nhttp://hackingdistributed.com/2016/07/17/cross-chain-replay/\n\n<hr><a href='https://d.tube/#!/v/goam/3nsxdjtu'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmcJCQeB5PEx7uPqtSnApgZ7aB2NkLM6pbE2c5p7sPFL9T'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #44: Safety Checklist\",\"snaphash\":\"QmSu3DqbfnwNQz8zgpM5fpihMGVbHX7Wb4CXj8UmuD9KFR\",\"author\":\"goam\",\"permlink\":\"3nsxdjtu\",\"duration\":332.60263,\"filesize\":21361264,\"spritehash\":\"QmTxTVNSt87cTH1XbrhfMmnvzBmjtg7husZuKuNwRi1LKP\"},\"content\":{\"videohash\":\"QmcJCQeB5PEx7uPqtSnApgZ7aB2NkLM6pbE2c5p7sPFL9T\",\"description\":\"https://www.kingoftheether.com/contract-safety-checklist.html\\nhttp://hackingdistributed.com/2016/07/17/cross-chain-replay/\",\"tags\":[\"ethereum\",\"developer\",\"education\",\"blockchain\"],\"video240hash\":\"QmVCPnFpd4QzYkeKyMLcTq6jTAfPn7cWCFXqF7JiutfQeW\",\"video480hash\":\"QmRhXK62U2eDhG42rDzAJerzURfa9gitGBSouLvEWx5GF1\"}},\"tags\":[\"ethereum\",\"developer\",\"education\",\"blockchain\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "3nsxdjtu",
"title": "Ethereum #44: Safety Checklist"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:51:48",
"trx_id": "9e1a7ec482b6ac3dbe32bdc4d783dfb4916ffd43",
"trx_in_block": 24,
"virtual_op": 0
}2018/06/29 03:46:42
2018/06/29 03:46:42
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | 5xodz8vy |
| Transaction Info | Block #23735961/Trx 2b98b41df97fe3e0407949ee4d84e9ded7035729 |
View Raw JSON Data
{
"block": 23735961,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "5xodz8vy"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:46:42",
"trx_id": "2b98b41df97fe3e0407949ee4d84e9ded7035729",
"trx_in_block": 83,
"virtual_op": 0
}2018/06/29 03:46:42
2018/06/29 03:46:42
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/5xodz8vy'><img src='https://ipfs.io/ipfs/QmR2VduueFQ6y32tyzTyHnrqxsMgEGiT7nqmX3LHEEfPXH'></a></center><hr> https://consensys.github.io/smart-contract-best-practices/ https://consensys.github.io/smart-contract-best-practices/recommendations/ https://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/smart-contract-best-practices.html http://hackingdistributed.com/2017/08/28/submarine-sends/ <hr><a href='https://d.tube/#!/v/goam/5xodz8vy'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmfDmZFnu6iLqVaekJ1b5gaytUyRh2dgVc8Xpxx9tDiTMg'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #43: Smart Contract Best Practices","snaphash":"QmVe5T3nAo3Po3fWdFZfaoqenyjY6MjxM3VNSXemxUw5qA","author":"goam","permlink":"5xodz8vy","duration":233.848163,"filesize":14072100,"spritehash":"QmenVQELdZvbU6WV6AcJyfGxfMF4CxBU8AEMbBhkbdsZio"},"content":{"videohash":"QmfDmZFnu6iLqVaekJ1b5gaytUyRh2dgVc8Xpxx9tDiTMg","description":"https://consensys.github.io/smart-contract-best-practices/\nhttps://consensys.github.io/smart-contract-best-practices/recommendations/\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/smart-contract-best-practices.html\nhttp://hackingdistributed.com/2017/08/28/submarine-sends/","tags":["ethereum","developer","education","blockchain"],"video240hash":"QmXRrF2wC5HnFFhg5t2A1omTeVwnkZkbr3gqZJcbeM6J3s","video480hash":"QmZTiCPM2Qugcg3eU4r2mNCkSitaU4ZmZ4YNGWFsCMd2fV"}},"tags":["ethereum","developer","education","blockchain","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 5xodz8vy |
| title | Ethereum #43: Smart Contract Best Practices |
| Transaction Info | Block #23735961/Trx 2b98b41df97fe3e0407949ee4d84e9ded7035729 |
View Raw JSON Data
{
"block": 23735961,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/5xodz8vy'><img src='https://ipfs.io/ipfs/QmR2VduueFQ6y32tyzTyHnrqxsMgEGiT7nqmX3LHEEfPXH'></a></center><hr>\n\nhttps://consensys.github.io/smart-contract-best-practices/\nhttps://consensys.github.io/smart-contract-best-practices/recommendations/\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/smart-contract-best-practices.html\nhttp://hackingdistributed.com/2017/08/28/submarine-sends/\n\n<hr><a href='https://d.tube/#!/v/goam/5xodz8vy'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmfDmZFnu6iLqVaekJ1b5gaytUyRh2dgVc8Xpxx9tDiTMg'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #43: Smart Contract Best Practices\",\"snaphash\":\"QmVe5T3nAo3Po3fWdFZfaoqenyjY6MjxM3VNSXemxUw5qA\",\"author\":\"goam\",\"permlink\":\"5xodz8vy\",\"duration\":233.848163,\"filesize\":14072100,\"spritehash\":\"QmenVQELdZvbU6WV6AcJyfGxfMF4CxBU8AEMbBhkbdsZio\"},\"content\":{\"videohash\":\"QmfDmZFnu6iLqVaekJ1b5gaytUyRh2dgVc8Xpxx9tDiTMg\",\"description\":\"https://consensys.github.io/smart-contract-best-practices/\\nhttps://consensys.github.io/smart-contract-best-practices/recommendations/\\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/smart-contract-best-practices.html\\nhttp://hackingdistributed.com/2017/08/28/submarine-sends/\",\"tags\":[\"ethereum\",\"developer\",\"education\",\"blockchain\"],\"video240hash\":\"QmXRrF2wC5HnFFhg5t2A1omTeVwnkZkbr3gqZJcbeM6J3s\",\"video480hash\":\"QmZTiCPM2Qugcg3eU4r2mNCkSitaU4ZmZ4YNGWFsCMd2fV\"}},\"tags\":[\"ethereum\",\"developer\",\"education\",\"blockchain\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "5xodz8vy",
"title": "Ethereum #43: Smart Contract Best Practices"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:46:42",
"trx_id": "2b98b41df97fe3e0407949ee4d84e9ded7035729",
"trx_in_block": 83,
"virtual_op": 0
}2018/06/29 03:41:39
2018/06/29 03:41:39
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | wtae7zw6 |
| Transaction Info | Block #23735860/Trx 6ee1480d103c670d859aada3fcd1621e5ed042c2 |
View Raw JSON Data
{
"block": 23735860,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "wtae7zw6"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:41:39",
"trx_id": "6ee1480d103c670d859aada3fcd1621e5ed042c2",
"trx_in_block": 16,
"virtual_op": 0
}2018/06/29 03:41:39
2018/06/29 03:41:39
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/wtae7zw6'><img src='https://ipfs.io/ipfs/Qmd5QadNJws9o4Rfg2WX3rhtwrwNAmamP68KJ8yF56PiwB'></a></center><hr> https://truffleframework.com/docs/getting_started/solidity-tests/ https://truffleframework.com/tutorials/testing-for-throws-in-solidity-tests/ <hr><a href='https://d.tube/#!/v/goam/wtae7zw6'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmdvbJCZfPuiM2nNUHbfvuMXpMDJegBQPLc25co3z9LVzo'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #42: Writing Tests","snaphash":"QmPcNws2pcS2KfayosxJ6nEaQTdPLyMSoJdgGQc3m96EZZ","author":"goam","permlink":"wtae7zw6","duration":256.02322,"filesize":21854566,"spritehash":"QmUmQ8SjdutE3vj2Qqnaqs8dJHuPHCF6PoiLB5DY6EPjnr"},"content":{"videohash":"QmdvbJCZfPuiM2nNUHbfvuMXpMDJegBQPLc25co3z9LVzo","description":"https://truffleframework.com/docs/getting_started/solidity-tests/\nhttps://truffleframework.com/tutorials/testing-for-throws-in-solidity-tests/","tags":["ethereum","blockchain","developer","education"],"video240hash":"QmY4i3ouHTiJUxC9oPCWK2snHPGwv1Z2KJzhosJV2G8AMY","video480hash":"QmTwjUoKK4L36TViJFYPXPHUuAKBMWYdgYkTjNirBS9Hsd"}},"tags":["ethereum","blockchain","developer","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | wtae7zw6 |
| title | Ethereum #42: Writing Tests |
| Transaction Info | Block #23735860/Trx 6ee1480d103c670d859aada3fcd1621e5ed042c2 |
View Raw JSON Data
{
"block": 23735860,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/wtae7zw6'><img src='https://ipfs.io/ipfs/Qmd5QadNJws9o4Rfg2WX3rhtwrwNAmamP68KJ8yF56PiwB'></a></center><hr>\n\nhttps://truffleframework.com/docs/getting_started/solidity-tests/\nhttps://truffleframework.com/tutorials/testing-for-throws-in-solidity-tests/\n\n<hr><a href='https://d.tube/#!/v/goam/wtae7zw6'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmdvbJCZfPuiM2nNUHbfvuMXpMDJegBQPLc25co3z9LVzo'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #42: Writing Tests\",\"snaphash\":\"QmPcNws2pcS2KfayosxJ6nEaQTdPLyMSoJdgGQc3m96EZZ\",\"author\":\"goam\",\"permlink\":\"wtae7zw6\",\"duration\":256.02322,\"filesize\":21854566,\"spritehash\":\"QmUmQ8SjdutE3vj2Qqnaqs8dJHuPHCF6PoiLB5DY6EPjnr\"},\"content\":{\"videohash\":\"QmdvbJCZfPuiM2nNUHbfvuMXpMDJegBQPLc25co3z9LVzo\",\"description\":\"https://truffleframework.com/docs/getting_started/solidity-tests/\\nhttps://truffleframework.com/tutorials/testing-for-throws-in-solidity-tests/\",\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\"],\"video240hash\":\"QmY4i3ouHTiJUxC9oPCWK2snHPGwv1Z2KJzhosJV2G8AMY\",\"video480hash\":\"QmTwjUoKK4L36TViJFYPXPHUuAKBMWYdgYkTjNirBS9Hsd\"}},\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "wtae7zw6",
"title": "Ethereum #42: Writing Tests"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:41:39",
"trx_id": "6ee1480d103c670d859aada3fcd1621e5ed042c2",
"trx_in_block": 16,
"virtual_op": 0
}2018/06/29 03:35:54
2018/06/29 03:35:54
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | v6xgx0dn |
| Transaction Info | Block #23735745/Trx 4e0b425299d2691354fa2048354a0dda2d22d6c5 |
View Raw JSON Data
{
"block": 23735745,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "v6xgx0dn"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:35:54",
"trx_id": "4e0b425299d2691354fa2048354a0dda2d22d6c5",
"trx_in_block": 7,
"virtual_op": 0
}2018/06/29 03:35:54
2018/06/29 03:35:54
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/v6xgx0dn'><img src='https://ipfs.io/ipfs/QmUqZet9UJ7JvU21ZCxfw5zowLVb6WCoEhcgbZEEB2DzQW'></a></center><hr> https://truffleframework.com/boxes/react/ https://truffleframework.com/docs/drizzle/getting-started/ https://levelup.gitconnected.com/https-medium-com-zubairnahmed-react-ethereum-getting-started-with-the-minimum-toolset-required-part-1-of-4-9562efa23d18 <hr><a href='https://d.tube/#!/v/goam/v6xgx0dn'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmNydbyD3wNFTJcb7fJ64LisJ38ctg56ydKvqcP5wyTnQA'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #41: Integrating With React","snaphash":"QmNRJXairxmgByMAQisrgRRLJef6ESevcBUa6nPRHk9q3V","author":"goam","permlink":"v6xgx0dn","duration":242.114467,"filesize":20305389,"spritehash":"QmWKbHrizQGm7Z5Gt9rjPfUBAUzbks8bxSao8w6gwFDf5G"},"content":{"videohash":"QmNydbyD3wNFTJcb7fJ64LisJ38ctg56ydKvqcP5wyTnQA","description":"https://truffleframework.com/boxes/react/\nhttps://truffleframework.com/docs/drizzle/getting-started/\nhttps://levelup.gitconnected.com/https-medium-com-zubairnahmed-react-ethereum-getting-started-with-the-minimum-toolset-required-part-1-of-4-9562efa23d18","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmaR9WtnhS2xRrKCwdNnwYXAPhbWUiETKLAE49YG8mNv7a","video480hash":"QmZdfKdEpNyA7rv8kP7tZifTKKpDajcpMqWBeSNoU92sv5"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | v6xgx0dn |
| title | Ethereum #41: Integrating With React |
| Transaction Info | Block #23735745/Trx 4e0b425299d2691354fa2048354a0dda2d22d6c5 |
View Raw JSON Data
{
"block": 23735745,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/v6xgx0dn'><img src='https://ipfs.io/ipfs/QmUqZet9UJ7JvU21ZCxfw5zowLVb6WCoEhcgbZEEB2DzQW'></a></center><hr>\n\nhttps://truffleframework.com/boxes/react/\nhttps://truffleframework.com/docs/drizzle/getting-started/\nhttps://levelup.gitconnected.com/https-medium-com-zubairnahmed-react-ethereum-getting-started-with-the-minimum-toolset-required-part-1-of-4-9562efa23d18\n\n<hr><a href='https://d.tube/#!/v/goam/v6xgx0dn'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmNydbyD3wNFTJcb7fJ64LisJ38ctg56ydKvqcP5wyTnQA'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #41: Integrating With React\",\"snaphash\":\"QmNRJXairxmgByMAQisrgRRLJef6ESevcBUa6nPRHk9q3V\",\"author\":\"goam\",\"permlink\":\"v6xgx0dn\",\"duration\":242.114467,\"filesize\":20305389,\"spritehash\":\"QmWKbHrizQGm7Z5Gt9rjPfUBAUzbks8bxSao8w6gwFDf5G\"},\"content\":{\"videohash\":\"QmNydbyD3wNFTJcb7fJ64LisJ38ctg56ydKvqcP5wyTnQA\",\"description\":\"https://truffleframework.com/boxes/react/\\nhttps://truffleframework.com/docs/drizzle/getting-started/\\nhttps://levelup.gitconnected.com/https-medium-com-zubairnahmed-react-ethereum-getting-started-with-the-minimum-toolset-required-part-1-of-4-9562efa23d18\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmaR9WtnhS2xRrKCwdNnwYXAPhbWUiETKLAE49YG8mNv7a\",\"video480hash\":\"QmZdfKdEpNyA7rv8kP7tZifTKKpDajcpMqWBeSNoU92sv5\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "v6xgx0dn",
"title": "Ethereum #41: Integrating With React"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:35:54",
"trx_id": "4e0b425299d2691354fa2048354a0dda2d22d6c5",
"trx_in_block": 7,
"virtual_op": 0
}goamupdated their account properties2018/06/29 03:32:45
goamupdated their account properties
2018/06/29 03:32:45
| account | goam |
| json metadata | {"profile":{"profile_image":"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg","cover_image":"https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG","name":"GOAM"}} |
| memo key | STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL |
| Transaction Info | Block #23735682/Trx 3a9d8fdd4ba703e3bcd2c95ad0c287e2cd2ab703 |
View Raw JSON Data
{
"block": 23735682,
"op": [
"account_update",
{
"account": "goam",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg\",\"cover_image\":\"https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG\",\"name\":\"GOAM\"}}",
"memo_key": "STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:32:45",
"trx_id": "3a9d8fdd4ba703e3bcd2c95ad0c287e2cd2ab703",
"trx_in_block": 27,
"virtual_op": 0
}2018/06/29 03:30:42
2018/06/29 03:30:42
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | xvwldsow |
| Transaction Info | Block #23735641/Trx bfe27f0dbd7a59f33434f6621c7d1c1e79abacc1 |
View Raw JSON Data
{
"block": 23735641,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "xvwldsow"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:30:42",
"trx_id": "bfe27f0dbd7a59f33434f6621c7d1c1e79abacc1",
"trx_in_block": 1,
"virtual_op": 0
}2018/06/29 03:30:42
2018/06/29 03:30:42
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/xvwldsow'><img src='https://ipfs.io/ipfs/QmUFkmWeJoCKwrBirJP9LpjvqCWwLb7oZbp4nAyoHgpeW1'></a></center><hr> https://truffleframework.com/tutorials/pet-shop#creating-a-ui-to-interact-with-our-smart-contract <hr><a href='https://d.tube/#!/v/goam/xvwldsow'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmdQbjoqYVmMxGK32tStRe2YTQiwgXSyM2r9DgSkivXWL8'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #40: Building Truffle For The Web","snaphash":"QmTXocfiKZqTu9TWNDSbftSSy5eoXU6aq4mgSWpDf4asED","author":"goam","permlink":"xvwldsow","duration":217.361995,"filesize":22558358,"spritehash":"QmRsgVe1sKCrDAacE7GVUfCQPe7PHA1ymi5rontMJ5s55J"},"content":{"videohash":"QmdQbjoqYVmMxGK32tStRe2YTQiwgXSyM2r9DgSkivXWL8","description":"https://truffleframework.com/tutorials/pet-shop#creating-a-ui-to-interact-with-our-smart-contract","tags":["ethereum","developer","blockchain","education"],"video240hash":"Qma7VkLgnko2aPFritv2GSQbY2bNoJnzRfgjwaQ7hRhfq1","video480hash":"QmNurAeD4rmgqYfVgurkT9R8nrFuz1ac8KJzQPx5eZDcbo"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | xvwldsow |
| title | Ethereum #40: Building Truffle For The Web |
| Transaction Info | Block #23735641/Trx bfe27f0dbd7a59f33434f6621c7d1c1e79abacc1 |
View Raw JSON Data
{
"block": 23735641,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/xvwldsow'><img src='https://ipfs.io/ipfs/QmUFkmWeJoCKwrBirJP9LpjvqCWwLb7oZbp4nAyoHgpeW1'></a></center><hr>\n\nhttps://truffleframework.com/tutorials/pet-shop#creating-a-ui-to-interact-with-our-smart-contract\n\n<hr><a href='https://d.tube/#!/v/goam/xvwldsow'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmdQbjoqYVmMxGK32tStRe2YTQiwgXSyM2r9DgSkivXWL8'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #40: Building Truffle For The Web\",\"snaphash\":\"QmTXocfiKZqTu9TWNDSbftSSy5eoXU6aq4mgSWpDf4asED\",\"author\":\"goam\",\"permlink\":\"xvwldsow\",\"duration\":217.361995,\"filesize\":22558358,\"spritehash\":\"QmRsgVe1sKCrDAacE7GVUfCQPe7PHA1ymi5rontMJ5s55J\"},\"content\":{\"videohash\":\"QmdQbjoqYVmMxGK32tStRe2YTQiwgXSyM2r9DgSkivXWL8\",\"description\":\"https://truffleframework.com/tutorials/pet-shop#creating-a-ui-to-interact-with-our-smart-contract\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"Qma7VkLgnko2aPFritv2GSQbY2bNoJnzRfgjwaQ7hRhfq1\",\"video480hash\":\"QmNurAeD4rmgqYfVgurkT9R8nrFuz1ac8KJzQPx5eZDcbo\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "xvwldsow",
"title": "Ethereum #40: Building Truffle For The Web"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:30:42",
"trx_id": "bfe27f0dbd7a59f33434f6621c7d1c1e79abacc1",
"trx_in_block": 1,
"virtual_op": 0
}goamupdated their account properties2018/06/29 03:30:33
goamupdated their account properties
2018/06/29 03:30:33
| account | goam |
| json metadata | {"profile":{"profile_image":"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg","cover_image":"https://cdn.steemitimages.com/DQmeR2Ef2N9AFoLsiX4u5NBAQoN1Ne1bF4yXHFsTDoEem6m/cover.png","name":"GOAM"}} |
| memo key | STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL |
| Transaction Info | Block #23735638/Trx 4e7143852ac5f8f47452bbbb5a646f751099222f |
View Raw JSON Data
{
"block": 23735638,
"op": [
"account_update",
{
"account": "goam",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg\",\"cover_image\":\"https://cdn.steemitimages.com/DQmeR2Ef2N9AFoLsiX4u5NBAQoN1Ne1bF4yXHFsTDoEem6m/cover.png\",\"name\":\"GOAM\"}}",
"memo_key": "STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:30:33",
"trx_id": "4e7143852ac5f8f47452bbbb5a646f751099222f",
"trx_in_block": 24,
"virtual_op": 0
}goamupdated their account properties2018/06/29 03:28:33
goamupdated their account properties
2018/06/29 03:28:33
| account | goam |
| json metadata | {"profile":{"profile_image":"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg","cover_image":"https://cdn.steemitimages.com/DQmZA6uDiprjgqc3xBgy8RmrxSNx76VLrUNHvBXManbsHfw/Background#01.jpg","name":"GOAM"}} |
| memo key | STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL |
| Transaction Info | Block #23735598/Trx 02ddcf191a4150f3cc5cd4b7faa0ca1e4878372d |
View Raw JSON Data
{
"block": 23735598,
"op": [
"account_update",
{
"account": "goam",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg\",\"cover_image\":\"https://cdn.steemitimages.com/DQmZA6uDiprjgqc3xBgy8RmrxSNx76VLrUNHvBXManbsHfw/Background#01.jpg\",\"name\":\"GOAM\"}}",
"memo_key": "STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:28:33",
"trx_id": "02ddcf191a4150f3cc5cd4b7faa0ca1e4878372d",
"trx_in_block": 20,
"virtual_op": 0
}goamupdated their account properties2018/06/29 03:26:21
goamupdated their account properties
2018/06/29 03:26:21
| account | goam |
| json metadata | {"profile":{"profile_image":"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg","cover_image":"https://cdn.steemitimages.com/DQmQrpjFuyQjWz2zNmg8oXzBBQdyvLzGNSzCEZm5fPB7sgy/55321c305e25f628367ce0dda5695902.jpg","name":"GOAM"}} |
| memo key | STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL |
| Transaction Info | Block #23735554/Trx 4343e9e94e90b1b65d95e54a2a6e431237682dd7 |
View Raw JSON Data
{
"block": 23735554,
"op": [
"account_update",
{
"account": "goam",
"json_metadata": "{\"profile\":{\"profile_image\":\"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg\",\"cover_image\":\"https://cdn.steemitimages.com/DQmQrpjFuyQjWz2zNmg8oXzBBQdyvLzGNSzCEZm5fPB7sgy/55321c305e25f628367ce0dda5695902.jpg\",\"name\":\"GOAM\"}}",
"memo_key": "STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:26:21",
"trx_id": "4343e9e94e90b1b65d95e54a2a6e431237682dd7",
"trx_in_block": 1,
"virtual_op": 0
}2018/06/29 03:25:36
2018/06/29 03:25:36
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | kghazlv4 |
| Transaction Info | Block #23735539/Trx 76bb42e171da5ff0d294954a520e89ff2fa521b6 |
View Raw JSON Data
{
"block": 23735539,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "kghazlv4"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:25:36",
"trx_id": "76bb42e171da5ff0d294954a520e89ff2fa521b6",
"trx_in_block": 0,
"virtual_op": 0
}2018/06/29 03:25:36
2018/06/29 03:25:36
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/kghazlv4'><img src='https://ipfs.io/ipfs/QmWyBJ2WyufUfCq9Bi9xcGcHitZzSqR9kHtcTu7NoQwXAB'></a></center><hr> https://media.consensys.net/a-warm-welcome-to-web3-89d49e61a7c5 https://web3js.readthedocs.io/en/1.0/# <hr><a href='https://d.tube/#!/v/goam/kghazlv4'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmVUkYeUMo34khJ7aWphh3gGcTreQFKZznGWqqp8H61yTj'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #39: Introduction to Web3","snaphash":"QmTtRbaCL34fkLzzELj7GBPETBCVgy1ZH4MAdRn9KqbqTY","author":"goam","permlink":"kghazlv4","duration":254.769342,"filesize":36804689,"spritehash":"QmSMK34Y2Xtv9RkYnUfUcsgvTf2idvaaLTHAR1yYdExmie"},"content":{"videohash":"QmVUkYeUMo34khJ7aWphh3gGcTreQFKZznGWqqp8H61yTj","description":"https://media.consensys.net/a-warm-welcome-to-web3-89d49e61a7c5\nhttps://web3js.readthedocs.io/en/1.0/#","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmY23G85onyBEqRGg2WpgJTwbbzoSp6UDRNwMoyqGsxSjQ","video480hash":"QmcdJALBsVHtfJBesc6LhAHofhV9HjvVnweJaHw6e52LRo"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | kghazlv4 |
| title | Ethereum #39: Introduction to Web3 |
| Transaction Info | Block #23735539/Trx 76bb42e171da5ff0d294954a520e89ff2fa521b6 |
View Raw JSON Data
{
"block": 23735539,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/kghazlv4'><img src='https://ipfs.io/ipfs/QmWyBJ2WyufUfCq9Bi9xcGcHitZzSqR9kHtcTu7NoQwXAB'></a></center><hr>\n\nhttps://media.consensys.net/a-warm-welcome-to-web3-89d49e61a7c5\nhttps://web3js.readthedocs.io/en/1.0/#\n\n<hr><a href='https://d.tube/#!/v/goam/kghazlv4'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmVUkYeUMo34khJ7aWphh3gGcTreQFKZznGWqqp8H61yTj'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #39: Introduction to Web3\",\"snaphash\":\"QmTtRbaCL34fkLzzELj7GBPETBCVgy1ZH4MAdRn9KqbqTY\",\"author\":\"goam\",\"permlink\":\"kghazlv4\",\"duration\":254.769342,\"filesize\":36804689,\"spritehash\":\"QmSMK34Y2Xtv9RkYnUfUcsgvTf2idvaaLTHAR1yYdExmie\"},\"content\":{\"videohash\":\"QmVUkYeUMo34khJ7aWphh3gGcTreQFKZznGWqqp8H61yTj\",\"description\":\"https://media.consensys.net/a-warm-welcome-to-web3-89d49e61a7c5\\nhttps://web3js.readthedocs.io/en/1.0/#\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmY23G85onyBEqRGg2WpgJTwbbzoSp6UDRNwMoyqGsxSjQ\",\"video480hash\":\"QmcdJALBsVHtfJBesc6LhAHofhV9HjvVnweJaHw6e52LRo\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "kghazlv4",
"title": "Ethereum #39: Introduction to Web3"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:25:36",
"trx_id": "76bb42e171da5ff0d294954a520e89ff2fa521b6",
"trx_in_block": 0,
"virtual_op": 0
}2018/06/29 03:20:30
2018/06/29 03:20:30
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | fo16en0n |
| Transaction Info | Block #23735437/Trx 96a80b7d58b3eca7bc5479bf441b9d1f4185c8df |
View Raw JSON Data
{
"block": 23735437,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "fo16en0n"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:20:30",
"trx_id": "96a80b7d58b3eca7bc5479bf441b9d1f4185c8df",
"trx_in_block": 8,
"virtual_op": 0
}2018/06/29 03:20:30
2018/06/29 03:20:30
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/fo16en0n'><img src='https://ipfs.io/ipfs/QmRfGbhQ55Cgpv4b1jdGcuqqqoALVbgAa8Vczy9UCaoX7U'></a></center><hr> https://blog.colony.io/towards-better-ethereum-voting-protocols-7e54cb5a0119 https://blog.colony.io/token-weighted-voting-implementation-part-1-72f836b5423b https://blog.colony.io/token-weighted-voting-implementation-part-2-13e490fe1b8a https://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/writing-smart-contracts/other-uses-of-commit-reveal.html <hr><a href='https://d.tube/#!/v/goam/fo16en0n'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmPnZj4cZnMgKeM9ZifHLC6oh3pKUH9L1i4NecrfzuqwdH'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #38: Smart Contract System Design","snaphash":"Qmdg1aKhZ2ZGCwsvdfatNJrpW5p9Q4z6Dwx4PG8t8FEorx","author":"goam","permlink":"fo16en0n","duration":461.566259,"filesize":35202560,"spritehash":"QmQTpqoTPTFnwTgbgyZCCVaT5DDm5B7UvGn1VyawDndjzE"},"content":{"videohash":"QmPnZj4cZnMgKeM9ZifHLC6oh3pKUH9L1i4NecrfzuqwdH","description":"https://blog.colony.io/towards-better-ethereum-voting-protocols-7e54cb5a0119\nhttps://blog.colony.io/token-weighted-voting-implementation-part-1-72f836b5423b\nhttps://blog.colony.io/token-weighted-voting-implementation-part-2-13e490fe1b8a\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/writing-smart-contracts/other-uses-of-commit-reveal.html","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmaouTACjXAbZ6o4jYVhmLVm6M8ecoAV1D7zCuEwmnovWg","video480hash":"QmcWrWaAHztzAa7f64qDy1cdEp8RDUTqNy6DYfKAYgMqdE"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | fo16en0n |
| title | Ethereum #38: Smart Contract System Design |
| Transaction Info | Block #23735437/Trx 96a80b7d58b3eca7bc5479bf441b9d1f4185c8df |
View Raw JSON Data
{
"block": 23735437,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/fo16en0n'><img src='https://ipfs.io/ipfs/QmRfGbhQ55Cgpv4b1jdGcuqqqoALVbgAa8Vczy9UCaoX7U'></a></center><hr>\n\nhttps://blog.colony.io/towards-better-ethereum-voting-protocols-7e54cb5a0119\nhttps://blog.colony.io/token-weighted-voting-implementation-part-1-72f836b5423b\nhttps://blog.colony.io/token-weighted-voting-implementation-part-2-13e490fe1b8a\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/writing-smart-contracts/other-uses-of-commit-reveal.html\n\n<hr><a href='https://d.tube/#!/v/goam/fo16en0n'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmPnZj4cZnMgKeM9ZifHLC6oh3pKUH9L1i4NecrfzuqwdH'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #38: Smart Contract System Design\",\"snaphash\":\"Qmdg1aKhZ2ZGCwsvdfatNJrpW5p9Q4z6Dwx4PG8t8FEorx\",\"author\":\"goam\",\"permlink\":\"fo16en0n\",\"duration\":461.566259,\"filesize\":35202560,\"spritehash\":\"QmQTpqoTPTFnwTgbgyZCCVaT5DDm5B7UvGn1VyawDndjzE\"},\"content\":{\"videohash\":\"QmPnZj4cZnMgKeM9ZifHLC6oh3pKUH9L1i4NecrfzuqwdH\",\"description\":\"https://blog.colony.io/towards-better-ethereum-voting-protocols-7e54cb5a0119\\nhttps://blog.colony.io/token-weighted-voting-implementation-part-1-72f836b5423b\\nhttps://blog.colony.io/token-weighted-voting-implementation-part-2-13e490fe1b8a\\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/writing-smart-contracts/other-uses-of-commit-reveal.html\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmaouTACjXAbZ6o4jYVhmLVm6M8ecoAV1D7zCuEwmnovWg\",\"video480hash\":\"QmcWrWaAHztzAa7f64qDy1cdEp8RDUTqNy6DYfKAYgMqdE\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "fo16en0n",
"title": "Ethereum #38: Smart Contract System Design"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:20:30",
"trx_id": "96a80b7d58b3eca7bc5479bf441b9d1f4185c8df",
"trx_in_block": 8,
"virtual_op": 0
}2018/06/29 03:15:15
2018/06/29 03:15:15
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | nbzjwnhg |
| Transaction Info | Block #23735333/Trx 9583d93ff44cb1e0aa1f3b87f76caf0ac33148c5 |
View Raw JSON Data
{
"block": 23735333,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "nbzjwnhg"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:15:15",
"trx_id": "9583d93ff44cb1e0aa1f3b87f76caf0ac33148c5",
"trx_in_block": 21,
"virtual_op": 0
}2018/06/29 03:15:15
2018/06/29 03:15:15
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/nbzjwnhg'><img src='https://ipfs.io/ipfs/QmbcECw75mVTueg58TALvd2nQSLugYeCzcbGeFHx6hV8mz'></a></center><hr> https://ethereumdev.io/inheritance-in-solidity/ https://solidity.readthedocs.io/en/develop/contracts.html#inheritance -------------------------------------------------------------- Libraries and The Ethereum Package Manager -------------------------------------------------------------- Solidity development has some drawbacks. First of all, just by the nature of the Ethereum system, every node has to execute and verify every transaction. This can be expensive and users of the system pay for this with gas. Also, there are few standard libraries for Solidity, managing and manipulating arrays and strings can be painful. Blockchains are isolated environments. It is relatively difficult to get verified data into the blockchain, there are not APIs like we are used to in traditional web development. You have to use services called oracles to get external data into the blockchain. Also, the immutability of deployed contracts makes upgrading contracts more difficult than upgrades in other systems. We can design systems in such a way to enable upgradability, we just have to pay extra attention to this. How can we address some of these drawbacks? Libraries can help. What are libraries? Libraries are contracts that do not have storage, they cannot hold ether and they cannot inherit or be inherited by other contracts. Libraries can be seen as implicit base contracts of the contracts that use them. They exist for the purpose of code reuse. So contracts can call library functions without having to implement or deploy the functions for itself. This enables developers to use code that has already been audited and battle-tested in the wild. To create a library contract we simply use the library keyword in place of the contract keyword. You will notice in this example that no storage variables are defined. Remember that libraries do not have a state, although it is possible for libraries to modify the calling contracts’ state. We will get to that in a moment. Once you have defined a library, you can import it with an import statement at the top of the solidity file. Now you can call the functions defined in the library as methods on the library name. You can also use the 'using for' syntax shown, which allows you to call the library function as a method on the first parameter defined in the library’s function. Libraries use the DELEGATECALL opcode of the EVM which preserves the context of the contract from which the library method is being called. This allows libraries to modify the state of calling contracts. The library can define the struct data type, but it will not be saved in storage until it is actually implemented in a contract. This implemented struct can be passed to the library and modified, and the modifications will persist in the contracts’ storage. This is a seldom-used feature of libraries in solidity, but it is good to be aware of. Libraries offer some other benefits in terms of contract system design. In the contract factory design pattern a contract might be deploying several additional contracts. Reducing the size of the factory output contracts can save a lot of gas in deployment costs over the lifetime of the contract. Moving functions that are referenced by the factory output contract to a library can reduce the size of the factory output contract. Calling library functions from the factory output contracts is a bit more expensive than calling internal functions, so there is a tradeoff to consider. If the factory output contract functions are frequently called, it may be better to pay the higher deployment cost to get cheaper function calls. You will have to determine which is best for your use case. To connect to a library, you need the library contract as well as the address of the deployed instance. Oftentimes you will deploy the library yourself, so the address management will be handled by truffle. Otherwise, the address of the deployed library has to be added to the bytecode by a linker. You can do this manually in your truffle project by adding the library contract to your contracts directory and compiling to get the artifact. You can modify the truffle artifact to specify the correct network and address that the library is deployed at. Library and contract package management can be simplified by using EthPM. EthPM is essentially npm for Ethereum contracts. Truffle has support for EthPM so you can install a package with truffle install and the package name. You can go to ethpm.com to browse the available packages. You should add an ethpm.json file to your project to track which packages and versions you are using. Importing an ethpm package into a solidity file simply requires the file path reference at the top of your solidity file. Truffle comes with an option for migrating contracts that enables you to only deploy contracts if there isn’t already a deployed instance. You should reference the truffle docs for specific implementation details. https://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736 https://solidity.readthedocs.io/en/develop/contracts.html#libraries https://ethereum.stackexchange.com/questions/6927/what-are-the-steps-to-compile-and-deploy-a-library-in-solidity https://truffleframework.com/docs/getting_started/packages-ethpm http://blog.ethereum-alarm-clock.com/blog/2015/10/25/one-reason-to-start-using-libraries <hr><a href='https://d.tube/#!/v/goam/nbzjwnhg'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmX9Na1PUyPCPgYdse6Rs8hhd27wGdS59y1R3PyaTMf16i'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #37: Inheritance","snaphash":"QmNsUNfEJFw5UAjUoxUP8zfns9KJeW7NRhDQThuKdvBydV","author":"goam","permlink":"nbzjwnhg","duration":205.589478,"filesize":18170779,"spritehash":"QmfDTY1tvgsYnVrmy1yPpZLMFXq27eASd3rCGbbCssHiDS"},"content":{"videohash":"QmX9Na1PUyPCPgYdse6Rs8hhd27wGdS59y1R3PyaTMf16i","description":"https://ethereumdev.io/inheritance-in-solidity/\nhttps://solidity.readthedocs.io/en/develop/contracts.html#inheritance\n\n--------------------------------------------------------------\nLibraries and The Ethereum Package Manager\n--------------------------------------------------------------\n\nSolidity development has some drawbacks.\n\nFirst of all, just by the nature of the Ethereum system, every node has to execute and verify every transaction. This can be expensive and users of the system pay for this with gas.\n\nAlso, there are few standard libraries for Solidity, managing and manipulating arrays and strings can be painful.\n\nBlockchains are isolated environments. It is relatively difficult to get verified data into the blockchain, there are not APIs like we are used to in traditional web development. You have to use services called oracles to get external data into the blockchain.\n\nAlso, the immutability of deployed contracts makes upgrading contracts more difficult than upgrades in other systems. We can design systems in such a way to enable upgradability, we just have to pay extra attention to this.\n\nHow can we address some of these drawbacks? Libraries can help.\n\nWhat are libraries?\n\nLibraries are contracts that do not have storage, they cannot hold ether and they cannot inherit or be inherited by other contracts. Libraries can be seen as implicit base contracts of the contracts that use them.\n\nThey exist for the purpose of code reuse. So contracts can call library functions without having to implement or deploy the functions for itself. This enables developers to use code that has already been audited and battle-tested in the wild.\n\nTo create a library contract we simply use the library keyword in place of the contract keyword. You will notice in this example that no storage variables are defined. Remember that libraries do not have a state, although it is possible for libraries to modify the calling contracts’ state. We will get to that in a moment.\n\nOnce you have defined a library, you can import it with an import statement at the top of the solidity file. Now you can call the functions defined in the library as methods on the library name. You can also use the 'using for' syntax shown, which allows you to call the library function as a method on the first parameter defined in the library’s function.\n\nLibraries use the DELEGATECALL opcode of the EVM which preserves the context of the contract from which the library method is being called. This allows libraries to modify the state of calling contracts. The library can define the struct data type, but it will not be saved in storage until it is actually implemented in a contract. This implemented struct can be passed to the library and modified, and the modifications will persist in the contracts’ storage. This is a seldom-used feature of libraries in solidity, but it is good to be aware of.\n\nLibraries offer some other benefits in terms of contract system design.\n\nIn the contract factory design pattern a contract might be deploying several additional contracts. Reducing the size of the factory output contracts can save a lot of gas in deployment costs over the lifetime of the contract.\n\nMoving functions that are referenced by the factory output contract to a library can reduce the size of the factory output contract.\n\nCalling library functions from the factory output contracts is a bit more expensive than calling internal functions, so there is a tradeoff to consider.\n\nIf the factory output contract functions are frequently called, it may be better to pay the higher deployment cost to get cheaper function calls. You will have to determine which is best for your use case.\n\nTo connect to a library, you need the library contract as well as the address of the deployed instance.\n\nOftentimes you will deploy the library yourself, so the address management will be handled by truffle.\n\nOtherwise, the address of the deployed library has to be added to the bytecode by a linker.\n\nYou can do this manually in your truffle project by adding the library contract to your contracts directory and compiling to get the artifact.\n\nYou can modify the truffle artifact to specify the correct network and address that the library is deployed at. \n\nLibrary and contract package management can be simplified by using EthPM. EthPM is essentially npm for Ethereum contracts. Truffle has support for EthPM so you can install a package with truffle install and the package name. You can go to ethpm.com to browse the available packages. You should add an ethpm.json file to your project to track which packages and versions you are using.\n\nImporting an ethpm package into a solidity file simply requires the file path reference at the top of your solidity file.\n\nTruffle comes with an option for migrating contracts that enables you to only deploy contracts if there isn’t already a deployed instance. You should reference the truffle docs for specific implementation details.\n\nhttps://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736\nhttps://solidity.readthedocs.io/en/develop/contracts.html#libraries\nhttps://ethereum.stackexchange.com/questions/6927/what-are-the-steps-to-compile-and-deploy-a-library-in-solidity\nhttps://truffleframework.com/docs/getting_started/packages-ethpm\nhttp://blog.ethereum-alarm-clock.com/blog/2015/10/25/one-reason-to-start-using-libraries","tags":["ethereum","developer","blockchain","education"],"video240hash":"Qmcd9XBmqyZHPf6bzmQSFnQVDRXz9dY6K7b3EbSojFvyrc","video480hash":"QmVhVfTKfA11x67LCpWcoDd9Faqz8xGZLj7mCdLqQpCMLn"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | nbzjwnhg |
| title | Ethereum #37: Inheritance |
| Transaction Info | Block #23735333/Trx 9583d93ff44cb1e0aa1f3b87f76caf0ac33148c5 |
View Raw JSON Data
{
"block": 23735333,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/nbzjwnhg'><img src='https://ipfs.io/ipfs/QmbcECw75mVTueg58TALvd2nQSLugYeCzcbGeFHx6hV8mz'></a></center><hr>\n\nhttps://ethereumdev.io/inheritance-in-solidity/\nhttps://solidity.readthedocs.io/en/develop/contracts.html#inheritance\n\n--------------------------------------------------------------\nLibraries and The Ethereum Package Manager\n--------------------------------------------------------------\n\nSolidity development has some drawbacks.\n\nFirst of all, just by the nature of the Ethereum system, every node has to execute and verify every transaction. This can be expensive and users of the system pay for this with gas.\n\nAlso, there are few standard libraries for Solidity, managing and manipulating arrays and strings can be painful.\n\nBlockchains are isolated environments. It is relatively difficult to get verified data into the blockchain, there are not APIs like we are used to in traditional web development. You have to use services called oracles to get external data into the blockchain.\n\nAlso, the immutability of deployed contracts makes upgrading contracts more difficult than upgrades in other systems. We can design systems in such a way to enable upgradability, we just have to pay extra attention to this.\n\nHow can we address some of these drawbacks? Libraries can help.\n\nWhat are libraries?\n\nLibraries are contracts that do not have storage, they cannot hold ether and they cannot inherit or be inherited by other contracts. Libraries can be seen as implicit base contracts of the contracts that use them.\n\nThey exist for the purpose of code reuse. So contracts can call library functions without having to implement or deploy the functions for itself. This enables developers to use code that has already been audited and battle-tested in the wild.\n\nTo create a library contract we simply use the library keyword in place of the contract keyword. You will notice in this example that no storage variables are defined. Remember that libraries do not have a state, although it is possible for libraries to modify the calling contracts’ state. We will get to that in a moment.\n\nOnce you have defined a library, you can import it with an import statement at the top of the solidity file. Now you can call the functions defined in the library as methods on the library name. You can also use the 'using for' syntax shown, which allows you to call the library function as a method on the first parameter defined in the library’s function.\n\nLibraries use the DELEGATECALL opcode of the EVM which preserves the context of the contract from which the library method is being called. This allows libraries to modify the state of calling contracts. The library can define the struct data type, but it will not be saved in storage until it is actually implemented in a contract. This implemented struct can be passed to the library and modified, and the modifications will persist in the contracts’ storage. This is a seldom-used feature of libraries in solidity, but it is good to be aware of.\n\nLibraries offer some other benefits in terms of contract system design.\n\nIn the contract factory design pattern a contract might be deploying several additional contracts. Reducing the size of the factory output contracts can save a lot of gas in deployment costs over the lifetime of the contract.\n\nMoving functions that are referenced by the factory output contract to a library can reduce the size of the factory output contract.\n\nCalling library functions from the factory output contracts is a bit more expensive than calling internal functions, so there is a tradeoff to consider.\n\nIf the factory output contract functions are frequently called, it may be better to pay the higher deployment cost to get cheaper function calls. You will have to determine which is best for your use case.\n\nTo connect to a library, you need the library contract as well as the address of the deployed instance.\n\nOftentimes you will deploy the library yourself, so the address management will be handled by truffle.\n\nOtherwise, the address of the deployed library has to be added to the bytecode by a linker.\n\nYou can do this manually in your truffle project by adding the library contract to your contracts directory and compiling to get the artifact.\n\nYou can modify the truffle artifact to specify the correct network and address that the library is deployed at. \n\nLibrary and contract package management can be simplified by using EthPM. EthPM is essentially npm for Ethereum contracts. Truffle has support for EthPM so you can install a package with truffle install and the package name. You can go to ethpm.com to browse the available packages. You should add an ethpm.json file to your project to track which packages and versions you are using.\n\nImporting an ethpm package into a solidity file simply requires the file path reference at the top of your solidity file.\n\nTruffle comes with an option for migrating contracts that enables you to only deploy contracts if there isn’t already a deployed instance. You should reference the truffle docs for specific implementation details.\n\nhttps://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736\nhttps://solidity.readthedocs.io/en/develop/contracts.html#libraries\nhttps://ethereum.stackexchange.com/questions/6927/what-are-the-steps-to-compile-and-deploy-a-library-in-solidity\nhttps://truffleframework.com/docs/getting_started/packages-ethpm\nhttp://blog.ethereum-alarm-clock.com/blog/2015/10/25/one-reason-to-start-using-libraries\n\n<hr><a href='https://d.tube/#!/v/goam/nbzjwnhg'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmX9Na1PUyPCPgYdse6Rs8hhd27wGdS59y1R3PyaTMf16i'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #37: Inheritance\",\"snaphash\":\"QmNsUNfEJFw5UAjUoxUP8zfns9KJeW7NRhDQThuKdvBydV\",\"author\":\"goam\",\"permlink\":\"nbzjwnhg\",\"duration\":205.589478,\"filesize\":18170779,\"spritehash\":\"QmfDTY1tvgsYnVrmy1yPpZLMFXq27eASd3rCGbbCssHiDS\"},\"content\":{\"videohash\":\"QmX9Na1PUyPCPgYdse6Rs8hhd27wGdS59y1R3PyaTMf16i\",\"description\":\"https://ethereumdev.io/inheritance-in-solidity/\\nhttps://solidity.readthedocs.io/en/develop/contracts.html#inheritance\\n\\n--------------------------------------------------------------\\nLibraries and The Ethereum Package Manager\\n--------------------------------------------------------------\\n\\nSolidity development has some drawbacks.\\n\\nFirst of all, just by the nature of the Ethereum system, every node has to execute and verify every transaction. This can be expensive and users of the system pay for this with gas.\\n\\nAlso, there are few standard libraries for Solidity, managing and manipulating arrays and strings can be painful.\\n\\nBlockchains are isolated environments. It is relatively difficult to get verified data into the blockchain, there are not APIs like we are used to in traditional web development. You have to use services called oracles to get external data into the blockchain.\\n\\nAlso, the immutability of deployed contracts makes upgrading contracts more difficult than upgrades in other systems. We can design systems in such a way to enable upgradability, we just have to pay extra attention to this.\\n\\nHow can we address some of these drawbacks? Libraries can help.\\n\\nWhat are libraries?\\n\\nLibraries are contracts that do not have storage, they cannot hold ether and they cannot inherit or be inherited by other contracts. Libraries can be seen as implicit base contracts of the contracts that use them.\\n\\nThey exist for the purpose of code reuse. So contracts can call library functions without having to implement or deploy the functions for itself. This enables developers to use code that has already been audited and battle-tested in the wild.\\n\\nTo create a library contract we simply use the library keyword in place of the contract keyword. You will notice in this example that no storage variables are defined. Remember that libraries do not have a state, although it is possible for libraries to modify the calling contracts’ state. We will get to that in a moment.\\n\\nOnce you have defined a library, you can import it with an import statement at the top of the solidity file. Now you can call the functions defined in the library as methods on the library name. You can also use the 'using for' syntax shown, which allows you to call the library function as a method on the first parameter defined in the library’s function.\\n\\nLibraries use the DELEGATECALL opcode of the EVM which preserves the context of the contract from which the library method is being called. This allows libraries to modify the state of calling contracts. The library can define the struct data type, but it will not be saved in storage until it is actually implemented in a contract. This implemented struct can be passed to the library and modified, and the modifications will persist in the contracts’ storage. This is a seldom-used feature of libraries in solidity, but it is good to be aware of.\\n\\nLibraries offer some other benefits in terms of contract system design.\\n\\nIn the contract factory design pattern a contract might be deploying several additional contracts. Reducing the size of the factory output contracts can save a lot of gas in deployment costs over the lifetime of the contract.\\n\\nMoving functions that are referenced by the factory output contract to a library can reduce the size of the factory output contract.\\n\\nCalling library functions from the factory output contracts is a bit more expensive than calling internal functions, so there is a tradeoff to consider.\\n\\nIf the factory output contract functions are frequently called, it may be better to pay the higher deployment cost to get cheaper function calls. You will have to determine which is best for your use case.\\n\\nTo connect to a library, you need the library contract as well as the address of the deployed instance.\\n\\nOftentimes you will deploy the library yourself, so the address management will be handled by truffle.\\n\\nOtherwise, the address of the deployed library has to be added to the bytecode by a linker.\\n\\nYou can do this manually in your truffle project by adding the library contract to your contracts directory and compiling to get the artifact.\\n\\nYou can modify the truffle artifact to specify the correct network and address that the library is deployed at. \\n\\nLibrary and contract package management can be simplified by using EthPM. EthPM is essentially npm for Ethereum contracts. Truffle has support for EthPM so you can install a package with truffle install and the package name. You can go to ethpm.com to browse the available packages. You should add an ethpm.json file to your project to track which packages and versions you are using.\\n\\nImporting an ethpm package into a solidity file simply requires the file path reference at the top of your solidity file.\\n\\nTruffle comes with an option for migrating contracts that enables you to only deploy contracts if there isn’t already a deployed instance. You should reference the truffle docs for specific implementation details.\\n\\nhttps://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736\\nhttps://solidity.readthedocs.io/en/develop/contracts.html#libraries\\nhttps://ethereum.stackexchange.com/questions/6927/what-are-the-steps-to-compile-and-deploy-a-library-in-solidity\\nhttps://truffleframework.com/docs/getting_started/packages-ethpm\\nhttp://blog.ethereum-alarm-clock.com/blog/2015/10/25/one-reason-to-start-using-libraries\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"Qmcd9XBmqyZHPf6bzmQSFnQVDRXz9dY6K7b3EbSojFvyrc\",\"video480hash\":\"QmVhVfTKfA11x67LCpWcoDd9Faqz8xGZLj7mCdLqQpCMLn\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "nbzjwnhg",
"title": "Ethereum #37: Inheritance"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:15:15",
"trx_id": "9583d93ff44cb1e0aa1f3b87f76caf0ac33148c5",
"trx_in_block": 21,
"virtual_op": 0
}2018/06/29 03:10:06
2018/06/29 03:10:06
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | 87azzy2d |
| Transaction Info | Block #23735230/Trx a01e961e87d8e78a87b195cd7fdf9fc4c5c22bf4 |
View Raw JSON Data
{
"block": 23735230,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "87azzy2d"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:10:06",
"trx_id": "a01e961e87d8e78a87b195cd7fdf9fc4c5c22bf4",
"trx_in_block": 0,
"virtual_op": 0
}2018/06/29 03:10:06
2018/06/29 03:10:06
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/87azzy2d'><img src='https://ipfs.io/ipfs/QmPVn3XwFcLrzS8vD7mwjDisLkj51qS7gFNUGx588pqhBu'></a></center><hr> https://gist.github.com/critesjosh/50eb7f243cf960ebf6240fae52c14e63 https://gist.github.com/critesjosh/68593429fd2f84f8f55d4ff7b74f0323 https://ethereum.stackexchange.com/questions/3667/difference-between-call-callcode-and-delegatecall https://dappsforbeginners.wordpress.com/tutorials/interactions-between-contracts/ <hr><a href='https://d.tube/#!/v/goam/87azzy2d'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYQSL9ocnVd7QEhfW8MNnxXGLZMdw2vyYbT81V2ui5FWC'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #36: Inter-Contract Execution","snaphash":"QmTzT142zzRajmxrSGXbGsncCc3kr8hx3ZPMmAEKZiRGjK","author":"goam","permlink":"87azzy2d","duration":426.480907,"filesize":40932540,"spritehash":"QmUPgWEhU1UG9dNvUMtYVcnRkd1o9uH1rQG1TbfBgLGcug"},"content":{"videohash":"QmYQSL9ocnVd7QEhfW8MNnxXGLZMdw2vyYbT81V2ui5FWC","description":"https://gist.github.com/critesjosh/50eb7f243cf960ebf6240fae52c14e63\nhttps://gist.github.com/critesjosh/68593429fd2f84f8f55d4ff7b74f0323\nhttps://ethereum.stackexchange.com/questions/3667/difference-between-call-callcode-and-delegatecall\nhttps://dappsforbeginners.wordpress.com/tutorials/interactions-between-contracts/","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmUkH6B1Ujg23vQSc368Ff4rXo7uPU4aU784MJegtZj45V","video480hash":"QmdE1DEK7pfPxaFK15TYRbuNBikrk7g4W1viUcocyG5iX3"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 87azzy2d |
| title | Ethereum #36: Inter-Contract Execution |
| Transaction Info | Block #23735230/Trx a01e961e87d8e78a87b195cd7fdf9fc4c5c22bf4 |
View Raw JSON Data
{
"block": 23735230,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/87azzy2d'><img src='https://ipfs.io/ipfs/QmPVn3XwFcLrzS8vD7mwjDisLkj51qS7gFNUGx588pqhBu'></a></center><hr>\n\nhttps://gist.github.com/critesjosh/50eb7f243cf960ebf6240fae52c14e63\nhttps://gist.github.com/critesjosh/68593429fd2f84f8f55d4ff7b74f0323\nhttps://ethereum.stackexchange.com/questions/3667/difference-between-call-callcode-and-delegatecall\nhttps://dappsforbeginners.wordpress.com/tutorials/interactions-between-contracts/\n\n<hr><a href='https://d.tube/#!/v/goam/87azzy2d'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYQSL9ocnVd7QEhfW8MNnxXGLZMdw2vyYbT81V2ui5FWC'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #36: Inter-Contract Execution\",\"snaphash\":\"QmTzT142zzRajmxrSGXbGsncCc3kr8hx3ZPMmAEKZiRGjK\",\"author\":\"goam\",\"permlink\":\"87azzy2d\",\"duration\":426.480907,\"filesize\":40932540,\"spritehash\":\"QmUPgWEhU1UG9dNvUMtYVcnRkd1o9uH1rQG1TbfBgLGcug\"},\"content\":{\"videohash\":\"QmYQSL9ocnVd7QEhfW8MNnxXGLZMdw2vyYbT81V2ui5FWC\",\"description\":\"https://gist.github.com/critesjosh/50eb7f243cf960ebf6240fae52c14e63\\nhttps://gist.github.com/critesjosh/68593429fd2f84f8f55d4ff7b74f0323\\nhttps://ethereum.stackexchange.com/questions/3667/difference-between-call-callcode-and-delegatecall\\nhttps://dappsforbeginners.wordpress.com/tutorials/interactions-between-contracts/\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmUkH6B1Ujg23vQSc368Ff4rXo7uPU4aU784MJegtZj45V\",\"video480hash\":\"QmdE1DEK7pfPxaFK15TYRbuNBikrk7g4W1viUcocyG5iX3\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "87azzy2d",
"title": "Ethereum #36: Inter-Contract Execution"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:10:06",
"trx_id": "a01e961e87d8e78a87b195cd7fdf9fc4c5c22bf4",
"trx_in_block": 0,
"virtual_op": 0
}2018/06/29 03:02:33
2018/06/29 03:02:33
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | mtqyok8s |
| Transaction Info | Block #23735079/Trx bd08aba302f3ab82e3aec9518cd6af0bc47ac887 |
View Raw JSON Data
{
"block": 23735079,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "mtqyok8s"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:02:33",
"trx_id": "bd08aba302f3ab82e3aec9518cd6af0bc47ac887",
"trx_in_block": 16,
"virtual_op": 0
}2018/06/29 03:02:33
2018/06/29 03:02:33
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/mtqyok8s'><img src='https://ipfs.io/ipfs/QmaooRqULNfF2TA7oRDiM7J4WyeaCLyAkG6pqcd3Q1Arr5'></a></center><hr> https://truffleframework.com/tutorials/pet-shop https://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/writing-smart-contracts/introductory-contracts.html <hr><a href='https://d.tube/#!/v/goam/mtqyok8s'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmbDtQBiat9anxWbcM67Z96q57bCpi6K2HaynbcNv3sk2G'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #35: Introductory Smart Contracts","snaphash":"QmT21fr5nNcSNbKcmWaEf6JkU9NWVsTMRM52Q7rhmfDSK7","author":"goam","permlink":"mtqyok8s","duration":406.186667,"filesize":29728494,"spritehash":"QmYvu5MGnoo5UHAPigpzEJJSGn3wTJKRwEZpfPFsrnqhRX"},"content":{"videohash":"QmbDtQBiat9anxWbcM67Z96q57bCpi6K2HaynbcNv3sk2G","description":"https://truffleframework.com/tutorials/pet-shop\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/writing-smart-contracts/introductory-contracts.html","tags":["ethereum","developer","education","blockchain"],"video240hash":"QmNLxg3hFKghswsaj1Y54XuzehesahLM7MXtd4DTR6gCV6","video480hash":"QmWLrFYxsu4f9p7xjJcAMpH5wtau3niJ7hrEvABsveypMX"}},"tags":["ethereum","developer","education","blockchain","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | mtqyok8s |
| title | Ethereum #35: Introductory Smart Contracts |
| Transaction Info | Block #23735079/Trx bd08aba302f3ab82e3aec9518cd6af0bc47ac887 |
View Raw JSON Data
{
"block": 23735079,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/mtqyok8s'><img src='https://ipfs.io/ipfs/QmaooRqULNfF2TA7oRDiM7J4WyeaCLyAkG6pqcd3Q1Arr5'></a></center><hr>\n\nhttps://truffleframework.com/tutorials/pet-shop\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/writing-smart-contracts/introductory-contracts.html\n\n<hr><a href='https://d.tube/#!/v/goam/mtqyok8s'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmbDtQBiat9anxWbcM67Z96q57bCpi6K2HaynbcNv3sk2G'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #35: Introductory Smart Contracts\",\"snaphash\":\"QmT21fr5nNcSNbKcmWaEf6JkU9NWVsTMRM52Q7rhmfDSK7\",\"author\":\"goam\",\"permlink\":\"mtqyok8s\",\"duration\":406.186667,\"filesize\":29728494,\"spritehash\":\"QmYvu5MGnoo5UHAPigpzEJJSGn3wTJKRwEZpfPFsrnqhRX\"},\"content\":{\"videohash\":\"QmbDtQBiat9anxWbcM67Z96q57bCpi6K2HaynbcNv3sk2G\",\"description\":\"https://truffleframework.com/tutorials/pet-shop\\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/writing-smart-contracts/introductory-contracts.html\",\"tags\":[\"ethereum\",\"developer\",\"education\",\"blockchain\"],\"video240hash\":\"QmNLxg3hFKghswsaj1Y54XuzehesahLM7MXtd4DTR6gCV6\",\"video480hash\":\"QmWLrFYxsu4f9p7xjJcAMpH5wtau3niJ7hrEvABsveypMX\"}},\"tags\":[\"ethereum\",\"developer\",\"education\",\"blockchain\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "mtqyok8s",
"title": "Ethereum #35: Introductory Smart Contracts"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T03:02:33",
"trx_id": "bd08aba302f3ab82e3aec9518cd6af0bc47ac887",
"trx_in_block": 16,
"virtual_op": 0
}2018/06/29 02:42:12
2018/06/29 02:42:12
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | zuoc0k1c |
| Transaction Info | Block #23734672/Trx 7bd437b856da0e399e8a799bf4b4e6b2ce53f491 |
View Raw JSON Data
{
"block": 23734672,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "zuoc0k1c"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:42:12",
"trx_id": "7bd437b856da0e399e8a799bf4b4e6b2ce53f491",
"trx_in_block": 1,
"virtual_op": 0
}2018/06/29 02:42:12
2018/06/29 02:42:12
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/zuoc0k1c'><img src='https://ipfs.io/ipfs/QmfHHpcQMbEoYi2NnD8NhRvTcfGmMNcvNBVkpLEBmaQEj9'></a></center><hr> <hr><a href='https://d.tube/#!/v/goam/zuoc0k1c'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmVJPZKCpN5HtFPib6BssRx85KKbtXndWkhu12ZUmPAXU4'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #34: Remix Deep Dive","snaphash":"QmaYmSUPA8Cxw86fLWPdHjBoHA34JS7WGR98pfyvmawdYb","author":"goam","permlink":"zuoc0k1c","duration":288.902676,"filesize":31645253,"spritehash":"QmT6XrNaHExkVMigLyeQNko9NoiS8XVyqHnMz3vtM1zcYL"},"content":{"videohash":"QmVJPZKCpN5HtFPib6BssRx85KKbtXndWkhu12ZUmPAXU4","description":"","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmdZ8cwjKarRfMgZ2iM6SPtAXwnoFR6FtL9dwwxa5u9vKg","video480hash":"QmaMX5Yr6m5VSD9S8rVMedmQeA8TUeXz9mduzhsYtXWGbQ"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | zuoc0k1c |
| title | Ethereum #34: Remix Deep Dive |
| Transaction Info | Block #23734672/Trx 7bd437b856da0e399e8a799bf4b4e6b2ce53f491 |
View Raw JSON Data
{
"block": 23734672,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/zuoc0k1c'><img src='https://ipfs.io/ipfs/QmfHHpcQMbEoYi2NnD8NhRvTcfGmMNcvNBVkpLEBmaQEj9'></a></center><hr>\n\n\n\n<hr><a href='https://d.tube/#!/v/goam/zuoc0k1c'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmVJPZKCpN5HtFPib6BssRx85KKbtXndWkhu12ZUmPAXU4'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #34: Remix Deep Dive\",\"snaphash\":\"QmaYmSUPA8Cxw86fLWPdHjBoHA34JS7WGR98pfyvmawdYb\",\"author\":\"goam\",\"permlink\":\"zuoc0k1c\",\"duration\":288.902676,\"filesize\":31645253,\"spritehash\":\"QmT6XrNaHExkVMigLyeQNko9NoiS8XVyqHnMz3vtM1zcYL\"},\"content\":{\"videohash\":\"QmVJPZKCpN5HtFPib6BssRx85KKbtXndWkhu12ZUmPAXU4\",\"description\":\"\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmdZ8cwjKarRfMgZ2iM6SPtAXwnoFR6FtL9dwwxa5u9vKg\",\"video480hash\":\"QmaMX5Yr6m5VSD9S8rVMedmQeA8TUeXz9mduzhsYtXWGbQ\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "zuoc0k1c",
"title": "Ethereum #34: Remix Deep Dive"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:42:12",
"trx_id": "7bd437b856da0e399e8a799bf4b4e6b2ce53f491",
"trx_in_block": 1,
"virtual_op": 0
}2018/06/29 02:38:24
2018/06/29 02:38:24
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/le8r6w6l'><img src='https://ipfs.io/ipfs/QmfGddwaeYDxc3zeYRk9bZQHmdDRvtGzzV9xFrdJNdDCN2'></a></center><hr> https://solidity.readthedocs.io/en/v0.4.21/abi-spec.html https://ethereum.stackexchange.com/questions/234/what-is-an-abi-and-why-is-it-needed-to-interact-with-contracts <hr><a href='https://d.tube/#!/v/goam/le8r6w6l'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmVjcUpEhDEntuk3jFyMiDs2GZZuaUwfouxEk4Mz2iW2ga'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #33: Smart Contract ABI","snaphash":"QmetxZuodhrAySbAfHb6hDvt2VdgQHupHnXe52EJqPCZAG","author":"goam","permlink":"le8r6w6l","duration":120.070385,"filesize":11048061,"spritehash":"QmNsKPxV9QnnGR1JaiBEUvexg95phE2y1nvEnpgsy1oQy5"},"content":{"videohash":"QmVjcUpEhDEntuk3jFyMiDs2GZZuaUwfouxEk4Mz2iW2ga","description":"https://solidity.readthedocs.io/en/v0.4.21/abi-spec.html\nhttps://ethereum.stackexchange.com/questions/234/what-is-an-abi-and-why-is-it-needed-to-interact-with-contracts\n\n------------------------\nEVENTS & LOGS\n------------------------\n\ncontract ExampleContract { \n event LogReturnValue(address indexed _from, int256 _value);\n function foo(int256 _value) returns (int256) {\n emit LogReturnValue(msg.sender, _value);\n return _value;\n }\n}\n \nThis is how you declare an event called LogReturnValue. Use the event keyword followed by the event name. \n\nA recent update to the Solidity compiler requires the ‘emit’ keyword before an event is logged. This helps further clarify when events are being logged in the contract code.\n\nDeclaring events require that you specify the parameter type as well as a name for the parameter. This parameter name is the name that will appear in the log, so make it descriptive and clear. \n\nYou can add the indexed keyword to event parameters. Up to three parameters can receive the indexed attribute. This increases the searchability of events. It is possible to filter for specific values of indexed arguments in the user interface.\n\nHere is a link to the solidity documentation on events: https://solidity.readthedocs.io/en/latest/contracts.html#events\n\nThe common uses for events can be broken down into three main use cases:\n\n1. Events can provide smart contract return values for the UI \n2. They can act as asynchronous triggers with data and \n3. They can act a cheaper form of storage.\n\nWhen a transaction is sent via web3.js, a transaction hash is returned, even if the contract functions specifies a return value. Transactions don’t return the contract value because transactions are not immediately mined and included in the blockchain - it takes time. You can use an event in the contract function in conjunction with an event watcher in the UI to observe a variable value when the transaction is mined.\n\nYou can use an event watcher as a trigger for application logic beyond just reading return values. You could take another action, display a message or update the UI when an event is observed.\n\nLogs, which are essentially the same as events (the context dictates which term is more appropriate) can also be used as a cheaper form of storage. Logs cost 8 gas per byte whereas contract storage costs 20,000 per 32 bytes, or 625 gas per byte. Logs are cheaper, but also cannot be accessed from any contracts. Even still, logs can be useful for aggregating historical reference data.\n\nEvents are inheritable members of contracts. You can call events of parent contracts from within child contracts.\n\nWhen called from within a contract, events cause arguments to be stored in the transaction log, a special data structure in the blockchain. The logs are associated with the address of the contract and will be incorporated into the blockchain, persisting as long as a block is accessible. In the current version of Ethereum (Byzantium), blocks are assumed to be accessible forever, but this may change in future versions, like Serenity, where earlier blocks may not always be available.\n\nLog and event data are not accessible from within contracts, not even from the contract that created the log. Events are useful when interacting with an application. They can provide notifications and confirmations of transactions happening in the smart contract. They are also useful for debugging purposes during development.\n\nLogs are not part of the blockchain per se since they are not required for consensus (they are just historical data), but they are verified by the blockchain as the transaction receipt hashes are stored inside the blocks.\n\nRemember that events are not emitted until the transaction has been successfully mined. \n\nLogging an event for every state change of the contract is a good heuristic for when you should use events. This allows you to track any and all updates to the state of the contract by setting up event watchers in your javascript files.\n\nhttps://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e\nhttps://solidity.readthedocs.io/en/develop/contracts.html#events\n\n---------------------------------\nFACTORY CONTRACTS\n---------------------------------\n\nSolidity is a contract-oriented programming language, which adopts many of the design principles of object-oriented programming languages.\n\nWe can implement a factory design pattern that will ensure that every contract deployed using the factory adheres to a certain standard. \n\nLet’s look at what a standard Ethereum token implementation might look like. \n\nTokens are a great case for a factory pattern because we want all of the token implementations to be compatible and convertible with one another.\n\nDefining a standard interface that all tokens should implement can ease development and benefit the entire ecosystem.\n\nhttps://i.imgur.com/afiqC6l.png\n\nHere is the start of a basic Token contract. You can imagine that we might want to store more data in our Token contract. This contract does not have functions implemented yet. \n\nAs we add functions and the contract increases in complexity, it will be more difficult to ensure that every Token contract is implementing the same interface and is bug-free.\n\nDeploying all of these standard compliant tokens through a token factory will abstract away many of the implementation details.\n\nWe can use the factory design pattern in solidity.\n\nIn the factory contract, we need to make the standardized token contract available by importing it. \n\nhttps://i.imgur.com/SegeSbF.png\n\nWhen we want to create a new token, we can pass the required constructor arguments for the Token contract into the token factory create token function.\n\nIn the create token function we specify that we are creating a new Token contract with the new keyword. \n\nThe token contract creation will return the address of the new contract. We know that this contract is of type token and we specify the type of the newToken variable.\n\nWe can store the creator of the new token, and transfer all of the newly minted tokens to the caller.\n\nThe function returns the address of the new token contract. This new contract has all of the state variables and functions that we specified in the token contract. \n\nThis is a useful design pattern that has numerous potential use cases.\n\nThe ConsenSys Github contains an implementation of the EIP20 interface, as well as an EIP20 token factory.\n\nhttps://ethereumdev.io/manage-several-contracts-with-factories/","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmbFpPcJ62nVXCG7o5EEfbJtYhPh7USjUGc4X8uyFnsr5E","video480hash":"Qmc6bAchuFHsqYh9cdKXcGSYy5birJ4ouMMy51QHG3MKiA"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | le8r6w6l |
| title | Ethereum #33: Smart Contract ABI |
| Transaction Info | Block #23734596/Trx d29437c717840905598aa27b348e09a42a1498dc |
View Raw JSON Data
{
"block": 23734596,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/le8r6w6l'><img src='https://ipfs.io/ipfs/QmfGddwaeYDxc3zeYRk9bZQHmdDRvtGzzV9xFrdJNdDCN2'></a></center><hr>\n\nhttps://solidity.readthedocs.io/en/v0.4.21/abi-spec.html\nhttps://ethereum.stackexchange.com/questions/234/what-is-an-abi-and-why-is-it-needed-to-interact-with-contracts\n\n<hr><a href='https://d.tube/#!/v/goam/le8r6w6l'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmVjcUpEhDEntuk3jFyMiDs2GZZuaUwfouxEk4Mz2iW2ga'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #33: Smart Contract ABI\",\"snaphash\":\"QmetxZuodhrAySbAfHb6hDvt2VdgQHupHnXe52EJqPCZAG\",\"author\":\"goam\",\"permlink\":\"le8r6w6l\",\"duration\":120.070385,\"filesize\":11048061,\"spritehash\":\"QmNsKPxV9QnnGR1JaiBEUvexg95phE2y1nvEnpgsy1oQy5\"},\"content\":{\"videohash\":\"QmVjcUpEhDEntuk3jFyMiDs2GZZuaUwfouxEk4Mz2iW2ga\",\"description\":\"https://solidity.readthedocs.io/en/v0.4.21/abi-spec.html\\nhttps://ethereum.stackexchange.com/questions/234/what-is-an-abi-and-why-is-it-needed-to-interact-with-contracts\\n\\n------------------------\\nEVENTS & LOGS\\n------------------------\\n\\ncontract ExampleContract { \\n event LogReturnValue(address indexed _from, int256 _value);\\n function foo(int256 _value) returns (int256) {\\n emit LogReturnValue(msg.sender, _value);\\n return _value;\\n }\\n}\\n \\nThis is how you declare an event called LogReturnValue. Use the event keyword followed by the event name. \\n\\nA recent update to the Solidity compiler requires the ‘emit’ keyword before an event is logged. This helps further clarify when events are being logged in the contract code.\\n\\nDeclaring events require that you specify the parameter type as well as a name for the parameter. This parameter name is the name that will appear in the log, so make it descriptive and clear. \\n\\nYou can add the indexed keyword to event parameters. Up to three parameters can receive the indexed attribute. This increases the searchability of events. It is possible to filter for specific values of indexed arguments in the user interface.\\n\\nHere is a link to the solidity documentation on events: https://solidity.readthedocs.io/en/latest/contracts.html#events\\n\\nThe common uses for events can be broken down into three main use cases:\\n\\n1. Events can provide smart contract return values for the UI \\n2. They can act as asynchronous triggers with data and \\n3. They can act a cheaper form of storage.\\n\\nWhen a transaction is sent via web3.js, a transaction hash is returned, even if the contract functions specifies a return value. Transactions don’t return the contract value because transactions are not immediately mined and included in the blockchain - it takes time. You can use an event in the contract function in conjunction with an event watcher in the UI to observe a variable value when the transaction is mined.\\n\\nYou can use an event watcher as a trigger for application logic beyond just reading return values. You could take another action, display a message or update the UI when an event is observed.\\n\\nLogs, which are essentially the same as events (the context dictates which term is more appropriate) can also be used as a cheaper form of storage. Logs cost 8 gas per byte whereas contract storage costs 20,000 per 32 bytes, or 625 gas per byte. Logs are cheaper, but also cannot be accessed from any contracts. Even still, logs can be useful for aggregating historical reference data.\\n\\nEvents are inheritable members of contracts. You can call events of parent contracts from within child contracts.\\n\\nWhen called from within a contract, events cause arguments to be stored in the transaction log, a special data structure in the blockchain. The logs are associated with the address of the contract and will be incorporated into the blockchain, persisting as long as a block is accessible. In the current version of Ethereum (Byzantium), blocks are assumed to be accessible forever, but this may change in future versions, like Serenity, where earlier blocks may not always be available.\\n\\nLog and event data are not accessible from within contracts, not even from the contract that created the log. Events are useful when interacting with an application. They can provide notifications and confirmations of transactions happening in the smart contract. They are also useful for debugging purposes during development.\\n\\nLogs are not part of the blockchain per se since they are not required for consensus (they are just historical data), but they are verified by the blockchain as the transaction receipt hashes are stored inside the blocks.\\n\\nRemember that events are not emitted until the transaction has been successfully mined. \\n\\nLogging an event for every state change of the contract is a good heuristic for when you should use events. This allows you to track any and all updates to the state of the contract by setting up event watchers in your javascript files.\\n\\nhttps://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e\\nhttps://solidity.readthedocs.io/en/develop/contracts.html#events\\n\\n---------------------------------\\nFACTORY CONTRACTS\\n---------------------------------\\n\\nSolidity is a contract-oriented programming language, which adopts many of the design principles of object-oriented programming languages.\\n\\nWe can implement a factory design pattern that will ensure that every contract deployed using the factory adheres to a certain standard. \\n\\nLet’s look at what a standard Ethereum token implementation might look like. \\n\\nTokens are a great case for a factory pattern because we want all of the token implementations to be compatible and convertible with one another.\\n\\nDefining a standard interface that all tokens should implement can ease development and benefit the entire ecosystem.\\n\\nhttps://i.imgur.com/afiqC6l.png\\n\\nHere is the start of a basic Token contract. You can imagine that we might want to store more data in our Token contract. This contract does not have functions implemented yet. \\n\\nAs we add functions and the contract increases in complexity, it will be more difficult to ensure that every Token contract is implementing the same interface and is bug-free.\\n\\nDeploying all of these standard compliant tokens through a token factory will abstract away many of the implementation details.\\n\\nWe can use the factory design pattern in solidity.\\n\\nIn the factory contract, we need to make the standardized token contract available by importing it. \\n\\nhttps://i.imgur.com/SegeSbF.png\\n\\nWhen we want to create a new token, we can pass the required constructor arguments for the Token contract into the token factory create token function.\\n\\nIn the create token function we specify that we are creating a new Token contract with the new keyword. \\n\\nThe token contract creation will return the address of the new contract. We know that this contract is of type token and we specify the type of the newToken variable.\\n\\nWe can store the creator of the new token, and transfer all of the newly minted tokens to the caller.\\n\\nThe function returns the address of the new token contract. This new contract has all of the state variables and functions that we specified in the token contract. \\n\\nThis is a useful design pattern that has numerous potential use cases.\\n\\nThe ConsenSys Github contains an implementation of the EIP20 interface, as well as an EIP20 token factory.\\n\\nhttps://ethereumdev.io/manage-several-contracts-with-factories/\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmbFpPcJ62nVXCG7o5EEfbJtYhPh7USjUGc4X8uyFnsr5E\",\"video480hash\":\"Qmc6bAchuFHsqYh9cdKXcGSYy5birJ4ouMMy51QHG3MKiA\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "le8r6w6l",
"title": "Ethereum #33: Smart Contract ABI"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:38:24",
"trx_id": "d29437c717840905598aa27b348e09a42a1498dc",
"trx_in_block": 4,
"virtual_op": 0
}2018/06/29 02:31:51
2018/06/29 02:31:51
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | le8r6w6l |
| Transaction Info | Block #23734465/Trx 22d3122fdee4d118ea73d117e15fc3b5ff190122 |
View Raw JSON Data
{
"block": 23734465,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "le8r6w6l"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:31:51",
"trx_id": "22d3122fdee4d118ea73d117e15fc3b5ff190122",
"trx_in_block": 25,
"virtual_op": 0
}2018/06/29 02:31:51
2018/06/29 02:31:51
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/le8r6w6l'><img src='https://ipfs.io/ipfs/QmfGddwaeYDxc3zeYRk9bZQHmdDRvtGzzV9xFrdJNdDCN2'></a></center><hr> https://solidity.readthedocs.io/en/v0.4.21/abi-spec.html https://ethereum.stackexchange.com/questions/234/what-is-an-abi-and-why-is-it-needed-to-interact-with-contracts <hr><a href='https://d.tube/#!/v/goam/le8r6w6l'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmVjcUpEhDEntuk3jFyMiDs2GZZuaUwfouxEk4Mz2iW2ga'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #33: Smart Contract ABI","snaphash":"QmetxZuodhrAySbAfHb6hDvt2VdgQHupHnXe52EJqPCZAG","author":"goam","permlink":"le8r6w6l","duration":120.070385,"filesize":11048061,"spritehash":"QmNsKPxV9QnnGR1JaiBEUvexg95phE2y1nvEnpgsy1oQy5"},"content":{"videohash":"QmVjcUpEhDEntuk3jFyMiDs2GZZuaUwfouxEk4Mz2iW2ga","description":"https://solidity.readthedocs.io/en/v0.4.21/abi-spec.html\nhttps://ethereum.stackexchange.com/questions/234/what-is-an-abi-and-why-is-it-needed-to-interact-with-contracts","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmbFpPcJ62nVXCG7o5EEfbJtYhPh7USjUGc4X8uyFnsr5E","video480hash":"Qmc6bAchuFHsqYh9cdKXcGSYy5birJ4ouMMy51QHG3MKiA"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | le8r6w6l |
| title | Ethereum #33: Smart Contract ABI |
| Transaction Info | Block #23734465/Trx 22d3122fdee4d118ea73d117e15fc3b5ff190122 |
View Raw JSON Data
{
"block": 23734465,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/le8r6w6l'><img src='https://ipfs.io/ipfs/QmfGddwaeYDxc3zeYRk9bZQHmdDRvtGzzV9xFrdJNdDCN2'></a></center><hr>\n\nhttps://solidity.readthedocs.io/en/v0.4.21/abi-spec.html\nhttps://ethereum.stackexchange.com/questions/234/what-is-an-abi-and-why-is-it-needed-to-interact-with-contracts\n\n<hr><a href='https://d.tube/#!/v/goam/le8r6w6l'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmVjcUpEhDEntuk3jFyMiDs2GZZuaUwfouxEk4Mz2iW2ga'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #33: Smart Contract ABI\",\"snaphash\":\"QmetxZuodhrAySbAfHb6hDvt2VdgQHupHnXe52EJqPCZAG\",\"author\":\"goam\",\"permlink\":\"le8r6w6l\",\"duration\":120.070385,\"filesize\":11048061,\"spritehash\":\"QmNsKPxV9QnnGR1JaiBEUvexg95phE2y1nvEnpgsy1oQy5\"},\"content\":{\"videohash\":\"QmVjcUpEhDEntuk3jFyMiDs2GZZuaUwfouxEk4Mz2iW2ga\",\"description\":\"https://solidity.readthedocs.io/en/v0.4.21/abi-spec.html\\nhttps://ethereum.stackexchange.com/questions/234/what-is-an-abi-and-why-is-it-needed-to-interact-with-contracts\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmbFpPcJ62nVXCG7o5EEfbJtYhPh7USjUGc4X8uyFnsr5E\",\"video480hash\":\"Qmc6bAchuFHsqYh9cdKXcGSYy5birJ4ouMMy51QHG3MKiA\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "le8r6w6l",
"title": "Ethereum #33: Smart Contract ABI"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:31:51",
"trx_id": "22d3122fdee4d118ea73d117e15fc3b5ff190122",
"trx_in_block": 25,
"virtual_op": 0
}2018/06/29 02:29:51
2018/06/29 02:29:51
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/n4f4sji0'><img src='https://ipfs.io/ipfs/QmSvWicZNQaKg4op3LeQ8wmNKiZioMEmNjiaZsA5HwuSCo'></a></center><hr> https://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/basic-practice-reading-contracts.html https://www.ethereum.org/greeter <hr><a href='https://d.tube/#!/v/goam/n4f4sji0'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/Qmf59Go22FgnERUtqSgWEXd81m3DLDj6CBaZvT2Sk7ctDZ'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #32: Reading Smart Contracts","snaphash":"QmSinCUiaE1JVvTiewD3Wnm2ES6TRGdzzwkXfc6ba2E6Xa","author":"goam","permlink":"n4f4sji0","duration":372.912472,"filesize":37655099,"spritehash":"QmX9HSFx6vxeQhGxYwmVkD4bVkMcYy2Mpjpm43gF5tQ5VU"},"content":{"videohash":"Qmf59Go22FgnERUtqSgWEXd81m3DLDj6CBaZvT2Sk7ctDZ","description":"https://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/basic-practice-reading-contracts.html\nhttps://www.ethereum.org/greeter","tags":["ethereum","developer","blockchain","education"],"video240hash":"Qmefsg9x99CTr8YtGA7r18kmbReikBUNnmUCRyHG8CS4vp","video480hash":"QmaaUyqx4MFjwWkh2nAw4RWsKKBQ72oMkWtjZaHS91P8X9"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | n4f4sji0 |
| title | Ethereum #32: Reading Smart Contracts |
| Transaction Info | Block #23734425/Trx 7a332007d50524c3b2ad2bfde80c42da8eac81b7 |
View Raw JSON Data
{
"block": 23734425,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/n4f4sji0'><img src='https://ipfs.io/ipfs/QmSvWicZNQaKg4op3LeQ8wmNKiZioMEmNjiaZsA5HwuSCo'></a></center><hr>\n\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/basic-practice-reading-contracts.html\nhttps://www.ethereum.org/greeter\n\n<hr><a href='https://d.tube/#!/v/goam/n4f4sji0'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/Qmf59Go22FgnERUtqSgWEXd81m3DLDj6CBaZvT2Sk7ctDZ'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #32: Reading Smart Contracts\",\"snaphash\":\"QmSinCUiaE1JVvTiewD3Wnm2ES6TRGdzzwkXfc6ba2E6Xa\",\"author\":\"goam\",\"permlink\":\"n4f4sji0\",\"duration\":372.912472,\"filesize\":37655099,\"spritehash\":\"QmX9HSFx6vxeQhGxYwmVkD4bVkMcYy2Mpjpm43gF5tQ5VU\"},\"content\":{\"videohash\":\"Qmf59Go22FgnERUtqSgWEXd81m3DLDj6CBaZvT2Sk7ctDZ\",\"description\":\"https://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/basic-practice-reading-contracts.html\\nhttps://www.ethereum.org/greeter\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"Qmefsg9x99CTr8YtGA7r18kmbReikBUNnmUCRyHG8CS4vp\",\"video480hash\":\"QmaaUyqx4MFjwWkh2nAw4RWsKKBQ72oMkWtjZaHS91P8X9\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "n4f4sji0",
"title": "Ethereum #32: Reading Smart Contracts"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:29:51",
"trx_id": "7a332007d50524c3b2ad2bfde80c42da8eac81b7",
"trx_in_block": 29,
"virtual_op": 0
}2018/06/29 02:15:45
2018/06/29 02:15:45
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | n4f4sji0 |
| Transaction Info | Block #23734143/Trx fd8b2f38c7b52475e968c1828d416918a88e743c |
View Raw JSON Data
{
"block": 23734143,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "n4f4sji0"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:15:45",
"trx_id": "fd8b2f38c7b52475e968c1828d416918a88e743c",
"trx_in_block": 1,
"virtual_op": 0
}2018/06/29 02:15:45
2018/06/29 02:15:45
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/n4f4sji0'><img src='https://ipfs.io/ipfs/QmSvWicZNQaKg4op3LeQ8wmNKiZioMEmNjiaZsA5HwuSCo'></a></center><hr> https://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/basic-practice-reading-contracts.html https://www.ethereum.org/greeter <hr><a href='https://d.tube/#!/v/goam/n4f4sji0'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/Qmf59Go22FgnERUtqSgWEXd81m3DLDj6CBaZvT2Sk7ctDZ'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #31: Reading Smart Contracts","snaphash":"QmSinCUiaE1JVvTiewD3Wnm2ES6TRGdzzwkXfc6ba2E6Xa","author":"goam","permlink":"n4f4sji0","duration":372.912472,"filesize":37655099,"spritehash":"QmX9HSFx6vxeQhGxYwmVkD4bVkMcYy2Mpjpm43gF5tQ5VU"},"content":{"videohash":"Qmf59Go22FgnERUtqSgWEXd81m3DLDj6CBaZvT2Sk7ctDZ","description":"https://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/basic-practice-reading-contracts.html\nhttps://www.ethereum.org/greeter","tags":["ethereum","developer","blockchain","education"],"video240hash":"Qmefsg9x99CTr8YtGA7r18kmbReikBUNnmUCRyHG8CS4vp","video480hash":"QmaaUyqx4MFjwWkh2nAw4RWsKKBQ72oMkWtjZaHS91P8X9"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | n4f4sji0 |
| title | Ethereum #31: Reading Smart Contracts |
| Transaction Info | Block #23734143/Trx fd8b2f38c7b52475e968c1828d416918a88e743c |
View Raw JSON Data
{
"block": 23734143,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/n4f4sji0'><img src='https://ipfs.io/ipfs/QmSvWicZNQaKg4op3LeQ8wmNKiZioMEmNjiaZsA5HwuSCo'></a></center><hr>\n\nhttps://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/basic-practice-reading-contracts.html\nhttps://www.ethereum.org/greeter\n\n<hr><a href='https://d.tube/#!/v/goam/n4f4sji0'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/Qmf59Go22FgnERUtqSgWEXd81m3DLDj6CBaZvT2Sk7ctDZ'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #31: Reading Smart Contracts\",\"snaphash\":\"QmSinCUiaE1JVvTiewD3Wnm2ES6TRGdzzwkXfc6ba2E6Xa\",\"author\":\"goam\",\"permlink\":\"n4f4sji0\",\"duration\":372.912472,\"filesize\":37655099,\"spritehash\":\"QmX9HSFx6vxeQhGxYwmVkD4bVkMcYy2Mpjpm43gF5tQ5VU\"},\"content\":{\"videohash\":\"Qmf59Go22FgnERUtqSgWEXd81m3DLDj6CBaZvT2Sk7ctDZ\",\"description\":\"https://sunnya97.gitbooks.io/a-beginner-s-guide-to-ethereum-and-dapp-developme/basic-practice-reading-contracts.html\\nhttps://www.ethereum.org/greeter\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"Qmefsg9x99CTr8YtGA7r18kmbReikBUNnmUCRyHG8CS4vp\",\"video480hash\":\"QmaaUyqx4MFjwWkh2nAw4RWsKKBQ72oMkWtjZaHS91P8X9\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "n4f4sji0",
"title": "Ethereum #31: Reading Smart Contracts"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:15:45",
"trx_id": "fd8b2f38c7b52475e968c1828d416918a88e743c",
"trx_in_block": 1,
"virtual_op": 0
}2018/06/29 02:10:30
2018/06/29 02:10:30
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | 84xseciy |
| Transaction Info | Block #23734038/Trx 154f522268ab2b69731037f4b4e355554d5551ea |
View Raw JSON Data
{
"block": 23734038,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "84xseciy"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:10:30",
"trx_id": "154f522268ab2b69731037f4b4e355554d5551ea",
"trx_in_block": 4,
"virtual_op": 0
}2018/06/29 02:10:30
2018/06/29 02:10:30
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/84xseciy'><img src='https://ipfs.io/ipfs/QmeFv4E7joysmLUV6RsVPpDeSJVA8KJQsFBM2XDmnA7nWo'></a></center><hr> https://solidity.readthedocs.io/en/develop/structure-of-a-contract.html https://solidity.readthedocs.io/en/develop/common-patterns.html?#state-machine <hr><a href='https://d.tube/#!/v/goam/84xseciy'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmeEcaCsgw8oan6zqR9RK6RSzxK7KqGwSqbcxr9Hm1nwoJ'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #31: Contract Structure","snaphash":"QmStvcnxv7BGCaekpNkKtk9pWkgcc5ZKgEn7RuhMzDK78Q","author":"goam","permlink":"84xseciy","duration":150.604626,"filesize":12062562,"spritehash":"QmWzdSWepxpwEFYsh8GyqLZApVhoBRMnLN8E2QPNtgUK8E"},"content":{"videohash":"QmeEcaCsgw8oan6zqR9RK6RSzxK7KqGwSqbcxr9Hm1nwoJ","description":"https://solidity.readthedocs.io/en/develop/structure-of-a-contract.html\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html?#state-machine","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmYCXeMePGYY44zER4krcJiTELTiH1VWMtaJVj5pYcFteJ","video480hash":"QmYApwRmPio2ZzW4zv7QaxMFSSDLc6TifC2JjUsT6dBcqL"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | 84xseciy |
| title | Ethereum #31: Contract Structure |
| Transaction Info | Block #23734038/Trx 154f522268ab2b69731037f4b4e355554d5551ea |
View Raw JSON Data
{
"block": 23734038,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/84xseciy'><img src='https://ipfs.io/ipfs/QmeFv4E7joysmLUV6RsVPpDeSJVA8KJQsFBM2XDmnA7nWo'></a></center><hr>\n\nhttps://solidity.readthedocs.io/en/develop/structure-of-a-contract.html\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html?#state-machine\n\n<hr><a href='https://d.tube/#!/v/goam/84xseciy'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmeEcaCsgw8oan6zqR9RK6RSzxK7KqGwSqbcxr9Hm1nwoJ'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #31: Contract Structure\",\"snaphash\":\"QmStvcnxv7BGCaekpNkKtk9pWkgcc5ZKgEn7RuhMzDK78Q\",\"author\":\"goam\",\"permlink\":\"84xseciy\",\"duration\":150.604626,\"filesize\":12062562,\"spritehash\":\"QmWzdSWepxpwEFYsh8GyqLZApVhoBRMnLN8E2QPNtgUK8E\"},\"content\":{\"videohash\":\"QmeEcaCsgw8oan6zqR9RK6RSzxK7KqGwSqbcxr9Hm1nwoJ\",\"description\":\"https://solidity.readthedocs.io/en/develop/structure-of-a-contract.html\\nhttps://solidity.readthedocs.io/en/develop/common-patterns.html?#state-machine\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmYCXeMePGYY44zER4krcJiTELTiH1VWMtaJVj5pYcFteJ\",\"video480hash\":\"QmYApwRmPio2ZzW4zv7QaxMFSSDLc6TifC2JjUsT6dBcqL\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "84xseciy",
"title": "Ethereum #31: Contract Structure"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:10:30",
"trx_id": "154f522268ab2b69731037f4b4e355554d5551ea",
"trx_in_block": 4,
"virtual_op": 0
}2018/06/29 02:05:48
2018/06/29 02:05:48
| author | goam |
| permlink | j7zynan3 |
| voter | ubg |
| weight | 100 (1.00%) |
| Transaction Info | Block #23733944/Trx 34a1e2cfbf36fa7cabe13080b458921d401154c9 |
View Raw JSON Data
{
"block": 23733944,
"op": [
"vote",
{
"author": "goam",
"permlink": "j7zynan3",
"voter": "ubg",
"weight": 100
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:05:48",
"trx_id": "34a1e2cfbf36fa7cabe13080b458921d401154c9",
"trx_in_block": 27,
"virtual_op": 0
}2018/06/29 02:04:27
2018/06/29 02:04:27
| allow curation rewards | true |
| allow votes | true |
| author | goam |
| extensions | [[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]] |
| max accepted payout | 1000000.000 SBD |
| percent steem dollars | 10000 |
| permlink | j7zynan3 |
| Transaction Info | Block #23733917/Trx 1c4c047099e1681d4c1db643ccb7116f83415acb |
View Raw JSON Data
{
"block": 23733917,
"op": [
"comment_options",
{
"allow_curation_rewards": true,
"allow_votes": true,
"author": "goam",
"extensions": [
[
0,
{
"beneficiaries": [
{
"account": "dtube",
"weight": 2500
}
]
}
]
],
"max_accepted_payout": "1000000.000 SBD",
"percent_steem_dollars": 10000,
"permlink": "j7zynan3"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:04:27",
"trx_id": "1c4c047099e1681d4c1db643ccb7116f83415acb",
"trx_in_block": 5,
"virtual_op": 0
}2018/06/29 02:04:27
2018/06/29 02:04:27
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/j7zynan3'><img src='https://ipfs.io/ipfs/Qmeuy9Yz88sFbwduW1N6HzHztwMoTxGtRRKar5s6M9WYM8'></a></center><hr> https://ethereum.stackexchange.com/questions/1232/difference-between-memory-and-storage https://solidity.readthedocs.io/en/v0.4.21/introduction-to-smart-contracts.html#storage-memory-and-the-stack https://solidity.readthedocs.io/en/v0.4.21/types.html#data-location <hr><a href='https://d.tube/#!/v/goam/j7zynan3'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmXhvkh9Fo1MrmpEN3Xv6JGxEXMv1tU4DxzZGGSPeFHLR8'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #30: Storage and Memory","snaphash":"QmUvAmDpVC2HzvzdJzhkK8iiQxzdffsuf64h4Y3B46Ky7q","author":"goam","permlink":"j7zynan3","duration":135.976054,"filesize":10247469,"spritehash":"QmWtddNkJKbeQTxcJMS5a8anyLV3mtfuP2WGXeWoyufdKz"},"content":{"videohash":"QmXhvkh9Fo1MrmpEN3Xv6JGxEXMv1tU4DxzZGGSPeFHLR8","description":"https://ethereum.stackexchange.com/questions/1232/difference-between-memory-and-storage\nhttps://solidity.readthedocs.io/en/v0.4.21/introduction-to-smart-contracts.html#storage-memory-and-the-stack\nhttps://solidity.readthedocs.io/en/v0.4.21/types.html#data-location","tags":["ethereum","blockchain","developer","education"],"video240hash":"QmZMoGSJnXUqSRj9ifwU2fzKRcrSvUdbeb44tajix4SPZD","video480hash":"QmVjko5nXXGTxfS5aZ7SbFuSoiQa8KNpP5RCHiPARdKaEX"}},"tags":["ethereum","blockchain","developer","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | j7zynan3 |
| title | Ethereum #30: Storage and Memory |
| Transaction Info | Block #23733917/Trx 1c4c047099e1681d4c1db643ccb7116f83415acb |
View Raw JSON Data
{
"block": 23733917,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/j7zynan3'><img src='https://ipfs.io/ipfs/Qmeuy9Yz88sFbwduW1N6HzHztwMoTxGtRRKar5s6M9WYM8'></a></center><hr>\n\nhttps://ethereum.stackexchange.com/questions/1232/difference-between-memory-and-storage\nhttps://solidity.readthedocs.io/en/v0.4.21/introduction-to-smart-contracts.html#storage-memory-and-the-stack\nhttps://solidity.readthedocs.io/en/v0.4.21/types.html#data-location\n\n<hr><a href='https://d.tube/#!/v/goam/j7zynan3'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmXhvkh9Fo1MrmpEN3Xv6JGxEXMv1tU4DxzZGGSPeFHLR8'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #30: Storage and Memory\",\"snaphash\":\"QmUvAmDpVC2HzvzdJzhkK8iiQxzdffsuf64h4Y3B46Ky7q\",\"author\":\"goam\",\"permlink\":\"j7zynan3\",\"duration\":135.976054,\"filesize\":10247469,\"spritehash\":\"QmWtddNkJKbeQTxcJMS5a8anyLV3mtfuP2WGXeWoyufdKz\"},\"content\":{\"videohash\":\"QmXhvkh9Fo1MrmpEN3Xv6JGxEXMv1tU4DxzZGGSPeFHLR8\",\"description\":\"https://ethereum.stackexchange.com/questions/1232/difference-between-memory-and-storage\\nhttps://solidity.readthedocs.io/en/v0.4.21/introduction-to-smart-contracts.html#storage-memory-and-the-stack\\nhttps://solidity.readthedocs.io/en/v0.4.21/types.html#data-location\",\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\"],\"video240hash\":\"QmZMoGSJnXUqSRj9ifwU2fzKRcrSvUdbeb44tajix4SPZD\",\"video480hash\":\"QmVjko5nXXGTxfS5aZ7SbFuSoiQa8KNpP5RCHiPARdKaEX\"}},\"tags\":[\"ethereum\",\"blockchain\",\"developer\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "j7zynan3",
"title": "Ethereum #30: Storage and Memory"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-29T02:04:27",
"trx_id": "1c4c047099e1681d4c1db643ccb7116f83415acb",
"trx_in_block": 5,
"virtual_op": 0
}2018/06/28 12:31:24
2018/06/28 12:31:24
| author | steemitboard |
| body | Congratulations @goam! You have completed some achievement on Steemit and have been rewarded with new badge(s) : [](http://steemitboard.com/@goam) You published 4 posts in one day <sub>_Click on the badge to view your Board of Honor._</sub> <sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub> **Do not miss the [last post](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-results-of-day-14) from @steemitboard!** --- **Participate in the [SteemitBoard World Cup Contest](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-collect-badges-and-win-free-sbd)!** Collect World Cup badges and win free SBD Support the Gold Sponsors of the contest: [@good-karma](https://v2.steemconnect.com/sign/account-witness-vote?witness=good-karma&approve=1) and [@lukestokes](https://v2.steemconnect.com/sign/account-witness-vote?witness=lukestokes.mhth&approve=1) --- > Do you like [SteemitBoard's project](https://steemit.com/@steemitboard)? Then **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| parent author | goam |
| parent permlink | jjw2djjl |
| permlink | steemitboard-notify-goam-20180628t123123000z |
| title | |
| Transaction Info | Block #23717698/Trx 10a68e1f2f2cc22383fc0c998a6ea9cf3c954fcd |
View Raw JSON Data
{
"block": 23717698,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @goam! You have completed some achievement on Steemit and have been rewarded with new badge(s) :\n\n[](http://steemitboard.com/@goam) You published 4 posts in one day\n\n<sub>_Click on the badge to view your Board of Honor._</sub>\n<sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>\n\n\n\n**Do not miss the [last post](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-results-of-day-14) from @steemitboard!**\n\n---\n**Participate in the [SteemitBoard World Cup Contest](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-collect-badges-and-win-free-sbd)!**\nCollect World Cup badges and win free SBD\nSupport the Gold Sponsors of the contest: [@good-karma](https://v2.steemconnect.com/sign/account-witness-vote?witness=good-karma&approve=1) and [@lukestokes](https://v2.steemconnect.com/sign/account-witness-vote?witness=lukestokes.mhth&approve=1)\n\n---\n\n> Do you like [SteemitBoard's project](https://steemit.com/@steemitboard)? Then **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
"parent_author": "goam",
"parent_permlink": "jjw2djjl",
"permlink": "steemitboard-notify-goam-20180628t123123000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-06-28T12:31:24",
"trx_id": "10a68e1f2f2cc22383fc0c998a6ea9cf3c954fcd",
"trx_in_block": 1,
"virtual_op": 0
}2018/06/28 06:10:15
2018/06/28 06:10:15
| author | goam |
| body | <center><a href='https://d.tube/#!/v/goam/jjw2djjl'><img src='https://ipfs.io/ipfs/QmRot1NiS1yS84rCU1HYh3T82a4n4tx24ZwbPJEaSQRHXw'></a></center><hr> https://solidity.readthedocs.io/en/v0.4.21/contracts.html#functions https://solidity.readthedocs.io/en/v0.4.21/types.html#function-types <hr><a href='https://d.tube/#!/v/goam/jjw2djjl'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYumqHkurCiqTcFunfr9ZzADPJzakbjNzMdXzq1XrUMQw'> ▶️ IPFS</a> |
| json metadata | {"video":{"info":{"title":"Ethereum #29: Functions","snaphash":"QmeCVmSuXWe861Uayh6SRDzcPXFmByUe82CUxFmzdbKxmd","author":"goam","permlink":"jjw2djjl","duration":464.817052,"filesize":34715725,"spritehash":"QmUXH9vcijTuAHqCsqS5wCSuPGntrt1Dv3N7tqyZQop6ri"},"content":{"videohash":"QmYumqHkurCiqTcFunfr9ZzADPJzakbjNzMdXzq1XrUMQw","description":"https://solidity.readthedocs.io/en/v0.4.21/contracts.html#functions\nhttps://solidity.readthedocs.io/en/v0.4.21/types.html#function-types","tags":["ethereum","developer","blockchain","education"],"video240hash":"QmS7etTVTTEe7PQma5PVRQUwkULC73WhUnxhujbgitqujS","video480hash":"Qmd2PuvLez9yMoWSZNzqpkhB9Wq8jQnPhxTfiuFZDWLNh2"}},"tags":["ethereum","developer","blockchain","education","dtube"],"app":"dtube/0.7"} |
| parent author | |
| parent permlink | ethereum |
| permlink | jjw2djjl |
| title | Ethereum #29: Functions |
| Transaction Info | Block #23710076/Trx b479f6c98cb201d3abda9d4fd5f27da74a802aa7 |
View Raw JSON Data
{
"block": 23710076,
"op": [
"comment",
{
"author": "goam",
"body": "<center><a href='https://d.tube/#!/v/goam/jjw2djjl'><img src='https://ipfs.io/ipfs/QmRot1NiS1yS84rCU1HYh3T82a4n4tx24ZwbPJEaSQRHXw'></a></center><hr>\n\nhttps://solidity.readthedocs.io/en/v0.4.21/contracts.html#functions\nhttps://solidity.readthedocs.io/en/v0.4.21/types.html#function-types\n\n<hr><a href='https://d.tube/#!/v/goam/jjw2djjl'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmYumqHkurCiqTcFunfr9ZzADPJzakbjNzMdXzq1XrUMQw'> ▶️ IPFS</a>",
"json_metadata": "{\"video\":{\"info\":{\"title\":\"Ethereum #29: Functions\",\"snaphash\":\"QmeCVmSuXWe861Uayh6SRDzcPXFmByUe82CUxFmzdbKxmd\",\"author\":\"goam\",\"permlink\":\"jjw2djjl\",\"duration\":464.817052,\"filesize\":34715725,\"spritehash\":\"QmUXH9vcijTuAHqCsqS5wCSuPGntrt1Dv3N7tqyZQop6ri\"},\"content\":{\"videohash\":\"QmYumqHkurCiqTcFunfr9ZzADPJzakbjNzMdXzq1XrUMQw\",\"description\":\"https://solidity.readthedocs.io/en/v0.4.21/contracts.html#functions\\nhttps://solidity.readthedocs.io/en/v0.4.21/types.html#function-types\",\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\"],\"video240hash\":\"QmS7etTVTTEe7PQma5PVRQUwkULC73WhUnxhujbgitqujS\",\"video480hash\":\"Qmd2PuvLez9yMoWSZNzqpkhB9Wq8jQnPhxTfiuFZDWLNh2\"}},\"tags\":[\"ethereum\",\"developer\",\"blockchain\",\"education\",\"dtube\"],\"app\":\"dtube/0.7\"}",
"parent_author": "",
"parent_permlink": "ethereum",
"permlink": "jjw2djjl",
"title": "Ethereum #29: Functions"
}
],
"op_in_trx": 0,
"timestamp": "2018-06-28T06:10:15",
"trx_id": "b479f6c98cb201d3abda9d4fd5f27da74a802aa7",
"trx_in_block": 25,
"virtual_op": 0
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": 10000,
"last_update_time": 1530084015
},
"downvote_manabar": {
"current_mana": 0,
"last_update_time": 1530084015
},
"rc_account": {
"account": "goam",
"max_rc": "8112031747",
"max_rc_creation_adjustment": {
"amount": "2020748973",
"nai": "@@000000037",
"precision": 6
},
"rc_manabar": {
"current_mana": "8112031747",
"last_update_time": 1537887600
}
}
}Account Metadata
| POSTING JSON METADATA | |
| profile | {"profile_image":"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg","cover_image":"https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG","name":"Ethereum Dev Course"} |
| JSON METADATA | |
| profile | {"profile_image":"https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg","cover_image":"https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG","name":"Ethereum Dev Course"} |
{
"posting_json_metadata": {
"profile": {
"profile_image": "https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg",
"cover_image": "https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG",
"name": "Ethereum Dev Course"
}
},
"json_metadata": {
"profile": {
"profile_image": "https://cdn.steemitimages.com/DQmcAAnZG5dShbzdj9VyjzTeHfNiWSKTzkghyH1GJehPpYB/2020698_1.jpg",
"cover_image": "https://cdn.steemitimages.com/DQmd9GY1ZUvbBjbrbKE1aiXnQAZDrrnGh9UpvhGHZJ1r88d/Capture.PNG",
"name": "Ethereum Dev Course"
}
}
}Auth Keys
Owner
Single Signature
Public Keys
STM6Dp2ufeAvpLaPdiMK9z5vYSUzo6Hf76koY5zzqV8VK6RrviQmh1/1
Active
Single Signature
Public Keys
STM84xfAGfEDWhoBAFE54ntYpkj4diMm6E4KvGvGrkNwPkJEY1jCN1/1
Posting
Single Signature
Public Keys
STM8DWSHcVGfyumzTBm5v9UEwSBbgndfvUrAPRGghG4XPCmKotWZa1/1
Memo
STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL
{
"owner": {
"account_auths": [],
"key_auths": [
[
"STM6Dp2ufeAvpLaPdiMK9z5vYSUzo6Hf76koY5zzqV8VK6RrviQmh",
1
]
],
"weight_threshold": 1
},
"active": {
"account_auths": [],
"key_auths": [
[
"STM84xfAGfEDWhoBAFE54ntYpkj4diMm6E4KvGvGrkNwPkJEY1jCN",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [
[
"dbooks",
1
],
[
"dtube.app",
1
]
],
"key_auths": [
[
"STM8DWSHcVGfyumzTBm5v9UEwSBbgndfvUrAPRGghG4XPCmKotWZa",
1
]
],
"weight_threshold": 1
},
"memo": "STM5HB62oCZv7W5NpNaft78GB5y1LpmFn9Qvdyhi2ryEs3f19LsWL"
}Witness Votes
0 / 30
No active witness votes.
[]