为想创建项目的朋友搭建创业平台,请感兴趣的朋友加乐乐微信:sensus113
NervosFans 微信公号:Nervosfans
谢谢!
交易属性:
• msg.data (bytes): 净负载
• msg.gas (uint): 剩余gas
• msg.sender (address): 消息调用发送人
• msg.sig (bytes4): 函数识别符(calldata前四个字节)
• msg.value (uint): 消息调用发送的wei数量
• tx.gasprice (uint): 交易gas 价格
• tx.origin (address): 交易发送人// 可能不安全
• gasleft()(uint256): 剩余gas
区块属性:
• block.blockhash(uint blockNumber) returns(bytes32):给定区块的哈希(不晚于256个区块之前)
• block.coinbase (address): 出块矿工地址
• block.difficulty (uint): 挖矿目标值
• block.gaslimit (uint): 交易的总gas上限
• block.number (uint): 区块在链中的高度
• block.timestamp (uint): 挖出时间(unix epoch后多少秒)
• now (uint): 相当于block.timestamp
公用功能包括加密助手,如sha256、keccak256。 还可以使用时间后缀,例如秒、分钟、小时、天、周和年。
now = block.timestamp
//矿工可以稍微做出更改,前提是时间戳大于上一个区块小于下一个区块
// 即, 30秒的窗口
1 = 1 seconds
1 minutes = 60 seconds
1 hours = 60 minutes
1 days = 24 hours
1 weeks = 7 days
1 years = 365 days
// 忽略闰年
ETH单位: wei, szabo, finney和ether
1 ether = 10^18 wei
1 ether = 10^6 szabo
1 ether = 10^3 finney
同美元、美分,wei是ETH的最低面额,不可细分。
1dollar = 100 cents
1ether = 1,000,000,000,000,000,000 weis
// 区块链中,ETH以wei为单位存储
处理错误时,可以抛出异常。 抛出的异常总能恢复状态。
• assert/断言:根据实际情况进行检查(内部错误)
• require/命令:确保条件有效(外部/输入错误)
• revert/复原:总是抛出异常
同JavaScript,this变量也可用于轻松访问合约实例本身(可以强制转换为合约地址)。 使用这个变量时,可以从合约内对内部函数做“外部”调用。
foo() => internal call from within contract
this.foo() => external call from within contract via EVM
address(this) => returns contract address
this.balance // deprecated
address(this).balance // recommended
内联汇编(EVM操作码)也可用于对EVM堆栈进行精细控制。一般的Solidity开发通常考虑不了这么多,但是在设计过程中,意识到一下这些低级别操作与限制也是很有帮助的。
写代码容易,写出好代码则很难。譬如说,由于潜在的gas成本以及区块gas上限,不应该迭代大小不确定的动态数组。 相反,应该以无需循环的方式设计数据模型式。
所以,代码不应该是这个样子:
address[] owners;
function isOwner(address owner) returns (bool) {
for (uint i; i
if (owners[i] ==owner) return true;
}
return false;
}
而应该是这个样子的:
mapping (address => bool) owners;
function isOwner(address owner) returns (bool) {
return owners[owner];
}
总结下状态读取的动作:
- 从状态变量读取
- 从
.balance 或 this.balance读取- 从区块、交易或msg 读取//
msg.sig 以及 msg.data除外
- 调用任意未标记为pure的函数
- 使用带“read”操作码的内联汇编
总结下修改状态的动作:
- 发送
- 创建合约
- 更改状态变量
- 发出事件
- 调用任意未标记为pure或view的函数
- 调用selfdestruct
- 使用低级调用
- 使用带“write”操作码的内联汇编
想要快速便捷的编写、测试智能合约,可以使用由以太坊基金会维护的在线编辑器Remix。
有了Remix编辑器,就能使用Solidity语言轻松编写智能合约。 Remix会自动对合约进行编译,实现对代码的实时审计。 一切就绪后,可以通知Remix使用“Injected Web”(借由Metamask)将合约部署到网络中。
Remix还能创建出一个“假的”浏览器内网络帮助快速测试合约! 通知Remix主持一个本地测试网络(也称为专用网络)时,在“运行” 选择“JavaScript VM”环境。 此时自动创建出五个外部账户,并预先为每个账户提供100 ETH。
部署合约时,只需在单击“Deploy”前提供想要传递给构造函数的参数。
现在,本地网络上就有了合约的“实例”。 为了帮助测试合约,Remix会自动为合约中存在的所有函数创建输入字段。
Remix还在底部提供了一个控制台,与合约交互时,控制台会输出本地网络上发生的所有事情。
注意,为了节省时间,交易会被立即处理,而实际的处理时间会更长些。我个人认为Remix是开发设计阶段最佳的IDE!
外部账户(客户端)层
外部帐户层类似于客户端层。 架构上,外部帐户独立于网络存在。 这么做是可取的,因为任何人都可以创建以太坊网络,并且已经创建出了许多网络:
- 以太坊主网
- 远程测试网(Rinkeby、Kovan、Ropsten)
- 远程专用网路
- 本地测试网
- 网络分叉
有了geth这样的工具,就可以成为主网络或自己网络中的节点。本质上讲,以太坊只是一个协议,任何人都可以实现。
Ethereum protocol => geth => Ethereum network(s)
由于外部帐户完全解耦,可以跨网络使用同一帐户,所以才有了“外部”帐户这种叫法。
external account 1 => network A
external account 1 => network B
external account 1 => ...
因此,外部帐户就有点像“email地址”。 有一个就能在所有网站上做验证。
username + password => email address => any websites
public key + private key => account address => any networks
类似使用用户名和密码创建email地址,公钥和私钥可以创建外部帐户地址。 两把密钥一公一私。同样,类似网站,Dapps为区块链上的智能合约提供用户界面。用户通过你Chrome、Mist(或任何支持web3的浏览器)等客户端与网站、Dapps交互的方式。
User => Email Address => Website => Server => Database
User => Account Address => Dapp => Smart Contract => Blockchain
拥有多个外部帐户有助于公共区块链上的(个人)隐私保护。 但是,管理各项凭据就比较麻烦了。 为了减轻这种负担,可以使用BIP39通过算法从“父密钥”中无限的生成帐户地址与密钥对,要做的只是记住一个有12个词的的助记短语。
BIP39(12 words) => array[account addresses, public keys,private keys]
Metamask应该是最受欢迎的BIP39帐户管理工具了。如果说web3是开发者进入以太坊区块链的门户,Metamask就是消费者的门户。其实Metamask内部也是使用web3连接网络。
为创建保险库,Metamask会生成随机种子短语(即,助记短语)。 为了不用每次都输入种子词,Metamask会要求用户创建密码。 有了这个密码,就可以将种子短语锁定在冷存储中,确保最大的安全性。
每个帐户内部都有公钥、私钥、地址和余额。 出于隐私和安全考虑,会对帐户凭据并本地存储,不会向Metamask上发送任何东西。 发送ETH时,Metamask会在提交至网络前,使用用户私钥签署用户的交易请求。 接受ETH时,接收人仅向发送人提供自己的地址,以便对方发起请求。
Metamask中支持选择主网或测试网。 还可以在端口8545上设置本地网络,或提供远程网络的URL。
为了更好地理解流程,使用测试网发送一些ETH即可,不必真金白银。Rinkeby的可靠性应该是最高的,因为使用了权威证明而非工作量证明。 由于测试网中的ETH没有实际价值,因此没有足够数量的矿工积德行善的专门跑来维持网络的去中心化水平。因此,攻击者可以轻松掌握矿力。 有了权威证明,则不必担心此类攻击,原因是区块由受信任的社区成员(也叫联盟)签署。
proof-of-authority => trusted consortium
proof-of-work => competition based on mining power
工作量证明中,哈希率(每秒哈希值)决定了计算机能够添加下一个交易区块的可能性。 为了打击使用专门硬件的积极性,以太坊计划从工作量证明转向权益证明。权益证明中就是押ETH参与挖矿的意思。
proof-of-stake => competitionbased on putting ethers at stake
话说,发送ETH之前,得先搞点ETH过来。这里可以使用Rinkeby的水龙头。 唯一的要求(为了防止滥用)是用户通过社交账户验证一下身份。
https://faucet.rinkeby.io
提交帐户地址后会发现余额变多了。现在试试将ETH发送到保险库中的另一个帐户。 首先,我们再创建一个帐户。
先复制第二个帐户的地址,再切换回第一个帐户然后粘贴。输入转账金额,还可以附一个十六进制字符串作为有效负载。 点击下一步。
随后Metamask会要求用户确认交易。 注意,Metamask会自动计算合适的gas 上限及价格。
为了确定最佳gas值,Metamask会模拟对合约的函数调用(也叫空运行)。 出现错误时也会显示。
单击“提交” 后,Metamask会使用用户私钥对交易进行签名,并将其提交至Rinkeby网络。
方便起见,Metamask还会记录用户所有的输出交易。 单击其中任一项后将转至交易所在的区块链。
https://rinkeby.etherscan.io/tx/0x57cbaba8db5b1a868835356c05d1de661a811a7dd81f73a89b787b38665eed43
切换至第二个账户时,会看到余额已更新。
由于外部帐户与区块链完全解耦,构建出的Dapps永远不会要求用户提供密钥。 我们可以根据用户的输入将交易对象打包在一起,但验证最终还是需要用户自己签名。 Metamask是非常棒的,进行web3调用提交交易时,Metamask会在签名过程中协助用户。 因此,构建Dapps还是推荐使用Metamask的,而且要对流程心中有数。
web3(transaction) => Metamaskpopup => sign(transaction) => network
我们知道,每笔交易都会有一定的费用。即便是稍微更新下区块链这种也都不是免费的。 这也意味着用户每次想要做出点什么更改都必须付费。 那么,(Dapps的)价值主张就得胜过这些固有成本。
value proposition >transaction fees
结论
传统的应用堆栈由客户端、服务器和数据库组成。 相比之下,以太坊应用堆栈则由外部帐户、智能合约和区块链构成。 同JavaScript与浏览器,EVM、以太坊客户端的目标是存在于世界上的每台笔记本电脑和计算机。 当“服务器”与“数据库”也由“客户端”管理时,就实现了最大程度的去中心化与分布,也就意味着单点故障、权利集中将不复存在,从而实现信息、价值以及财富的规范化、民主化。 这样的网络正体现了民主自由的最高理想。
没有所有权的概念,就没有自由市场社会。 若从一开始就没有明晰的所有权状,何来贸易的正常开展。扭转贫富差距不断扩大的趋势之前,首先需要为所有人提供一种能够明确所有权的手段。这一愿景到目前为止,尚无法实现,原因是所有权记录一直被银行、政府所垄断。 为了让一个更加公平的世界成为可能,亟需一个不受腐败影响的“去信任”体系。
以太坊正是这种体系的开端。 如同一个完美的世界政府,无论背景如何,其中的每位公民都是平等的。唯一的要求就是一把真正属于自己的私钥。这种治理模型下,智能合约充当了“银行”的角色,其中存储着代表了现实世界资产的数字通证。 私钥允许人们以一种去许可的方式自由进入任意合约,使用通用货币同任何人进行交易。交易之后留下的匿名“签名”则能证明交易以不可改变、透明的方式真实发生。 如此,所有权得到保证,隐私亦受到保护。加密之域的治理与合约由加密经济这个经济激励与加密验证的组合来守护。
一个真正自由的市场社会倾向于完全竞争。 当参与者都以真实信息以及法律保证相互竞争时,市场对新参与者准入门槛也会降低,最终达到帕累托最优均衡,即完美的经济效率,或者说贫富差距被消除。
Trust => Freedom => Love=> Peace
信任缺失时,人类防御本能的毁灭性不容小觑;而当信任满满时,人们又会走向另一个(好的)极端,有鉴于人性的这种矛盾,我们认为最值得信赖的金融体系应该是一种去信任的体系。
References:
• http://www.ethdocs.org/en/latest
• https://solidity.readthedocs.io/en/v0.4.25/introduction-to-smart-contracts.html
• https://ethereum.github.io/yellowpaper/paper.pdf
• https://bitcoin.org/bitcoin.pdf
• https://medium.com/@VitalikButerin/liberation-through-radical-decentralization-22fc4bedc2ac
相关链接:
1. Merkle-Patricia tries: https://github.com/ethereum/wiki/wiki/Patricia-Tree
2. Ghost协议: https://github.com/ethereum/wiki/wiki/White-Paper#modified-ghost-implementation
3. EVM 操作码gas价格:https://github.com/djrtwo/evm-opcode-gas-costs/blob/master/opcode-gas-costs_EIP-150_revision-1e18248_2017-04-12.csv
4. 椭圆曲线数字签名算法(ECDSA): https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm
5. 图灵完备:https://en.wikipedia.org/wiki/Turing_completeness
6. JavaScript Engine:https://en.wikipedia.org/wiki/JavaScript_engine
7. Remix:https://remix.ethereum.org/
8. Rinkeby水龙头:https://faucet.rinkeby.io/
https://medium.com/heartbankacademy/a-complete-mental-model-for-ethereum-dapp-development-5ce08598ed0a