Solidty与众不同的地址类型

  • A+
所属分类:区块链技术

【编者按:】Solidity编程语言是一门基于以太坊(Ethereum)的区块链语言。深入浅出Solidity系列文章将介绍该语言的一些特点,希望能给大家带来一些深入的了解。
说到Solidity的地址就不得不先提到比特币的UXTO模型。

UXTO是什么?

UXTO是Unspend Transaction Output的缩写,意指未花费的交易输出。我们都知道比特币是一个超级帐本,整个系统记录的就是一笔笔操作。举例来说:小明有20元,要向只有5元的小红转帐10元,可以将上述操作表述为:

 操作({ 小明:20,小红: 5 },“从小明到小红发送10元”) = { 小明:10,小红:15元 }

要想知道当前小明的余额(状态),就得从整个帐本记录的第一笔操作开始推算小明未被花费的钱。推算都谁转过给他,他转给其它人多少,最后余额是否如他现在所说,检查确认金额正确且是小明本人后才会记录这样一笔操作,当然在这之后,小明的余额就只有10元了。
整个系统实际没有提供一种帐户的概念,比如一查小明的帐户就知道当前的余额了,而是要推演所有未花的操作输出。白皮书内还为我们罗列了UTXO模型其它的一些缺点 [^以太坊白皮书:[https://github.com/ethereum/wiki/wiki/White-Paper#scripting](https://github.com/ethereum/wiki/wiki/White-Paper#scripting)] :
- 价值盲(Value-blindness)。UTXO脚本不能为账户的取款额度提供精细的控制。例如,预言机合约(oracle contract)的一个强大应用是对冲合约,A和B各自向对冲合约中发送价值1000美元的比特币,30天以后,脚本向A发送价值1000美元的比特币,向B发送剩余的比特币。虽然实现对冲合约需要一个预言机(oracle)决定一比特币值多少美元,但是与现在完全中心化的解决方案相比,这一机制已经在减少信任和基础设施方面有了巨大的进步。然而,因为UTXO是不可分割的,为实现此合约,唯一的方法是非常低效地采用许多有不同面值的UTXO(例如对应于最大为30的每个k,有一个2^k 的UTXO)并使预言机挑出正确的UTXO发送给A和B。
- 缺少状态 – UTXO只能是已花费或者未花费状态,这就没有给需要任何其它内部状态的多阶段合约或者脚本留出生存空间。这使得实现多阶段期权合约、去中心化的交换要约或者两阶段加密承诺协议(对确保计算奖励非常必要)非常困难。这也意味着UTXO只能用于建立简单的、一次性的合约,而不是例如去中心化组织这样的有着更加复杂的状态的合约,使得元协议难以实现。二元状态与价值盲结合在一起意味着另一个重要的应用,取款限额,是不可能实现的。
- 区块链盲(Blockchain-blindness)- UTXO看不到区块链的数据,例如随机数和上一个区块的哈希。这一缺陷剥夺了脚本语言所拥有的基于随机性的潜在价值,严重地限制了博彩等其它领域应用。
由于UTXO的上述问题,且以太坊的目的是基于脚本、竞争币和链上元协议(on-chain meta-protocol)概念进行整合和提高,使得开发者能够创建任意的基于共识的、可扩展的、标准化的、特性完备的、易于开发的和协同的应用。最后以太坊选择了自已的帐户模型[^更多信息参考accounts-and-not-utxos:[https://github.com/ethereum/wiki/wiki/Design-Rationale#accounts-and-not-utxos](https://github.com/ethereum/wiki/wiki/Design-Rationale#accounts-and-not-utxos)] 。

地址(Address)

地址(Address),代表一个帐户。帐户可以是普通的个人帐户,也可以是包含代码的合约帐户。所以地址某些时候代表的就是一份合约代码。
address : 20字节,是所有合约的基础,且包含自有的一些成员变量。
支持的操作符有<=<==!==>

Address的成员

balancesend() : 可以用balance查询地址的余额,使用send()来向某个地址转帐(货币单位是wei)。在支付相关的章节,我们会详细介绍如何使用。
call()callcode()delegatecall():支持传入任意类型的任意参数来直接与合约进行交互。在call,callcod,delegatecall介绍章节,我们会详细介绍如何使用。
由于所有的合约都继承了地址的这些成员,所以你可以直接在当前合约中使用this.balance来查询当前合约的余额。

pragma solidity ^0.4.0;
contract Address {
 function getBalance() returns (uint) {
  return this.balance;//0
 }  
}

参考资料:
[^balance和send:[http://solidity.readthedocs.io/en/develop/types.html#members-of-addresses](http://solidity.readthedocs.io/en/develop/types.html#members-of-addresses)]
[^call,callcode和delegatecall:[http://solidity.readthedocs.io/en/develop/types.html#members-of-addresses](http://solidity.readthedocs.io/en/develop/types.html#members-of-addresses)]

关于作者专注基于以太坊(Ethereum)的相关区块链(Blockchain)技术,了解以太坊,Solidity,Truffle等。个人博客:http://me.tryblockchain.org

weinxin
共识社
用手机扫一扫,加入组织,时刻关注组织动态。
daodaoliang

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: