[文摘]首届区块链数学科学会议精华

12月17日,区块链数学科学会议在北京召开。本次大会由数字资产研究院主办,石榴财经,零壹财经协办。会上,计算机科学家、经济学家、数学家、信息学家、高校学者、区块链专家及行业从业者围绕区块链与数学、人工智能、量子计算机等领域的联系、区块链目前面临的难题以及未来猜想等话题发表了不同的观点。

数字资产研究实验室是数字资产软件平台Blockchain和伦敦帝国理工学院合作推出的研究机构,定位为举办和电子货币和区块链技术相关的研究和应用活动的国际中心。

【报道原文】:
区块链的提问和数学的猜想——首届区块链数学科学会议精华
http://www.01caijing.com/article/33115.htm

在开场致辞中,经济学家朱嘉明表示当前这个时代是一个科学主导的时代,是由若干和整体的科学体系主导的时代,更是科学集群和技术混合成长,相互影响的时代。2019年将是一个非常值得在意的一年,这一年有三件值得纪念的事:麦哲伦航海500周年、人类登月50周年、互联网前身阿帕网诞生50周年。尤其后两件事,改变了过去50年人类历史的走向和轨迹。他表示,这次区块链数学科学会议力求成为21世纪的“梅西会议”,通过数学、密码学、计算机科学、经济学和人工智能之间的跨学科互动,对区块链体系进行科学层面的解构,探讨建立基于区块链应用数学的可能性和路径,最终也希望对数学本身的发展有推动作用。最后,朱嘉明老师引用希尔伯特墓志铭的一句话作为对区块链数学科学的期许:我们必须知道,我们必将知道。

如何看待区块链的发展现状?

过去的十年,区块链逐渐从小众走向主流,但社会对区块链的认知,很大程度上仍然停留在最初的阶段。数字资产研究院常务副院长、零壹财经创始人柏亮在会上表示,目前区块链行业遇到的瓶颈是底层思想的创新。

在经济学家、北京大学经济学院前院长晏智杰看来,区块链技术首先是互联网技术的一次巨大飞跃和升级。它最大的价值在于把互联网这样一个信息传输工具,升级为价值交流的工具,并把市场经济形式推到更高的阶段。其次,区块链的应用之路必将是曲折的。一个国家对区块链的接纳程度与该国的经济发展程度有关:市场经济发展程度越高的国家,越容易接受区块链,反之就容易抵触。在应用领域方面,在金融领域之外,区块链在其他社会领域也有很大的发展,不断地被企业、政府、民众所认识、采纳,这个过程的落实本身也是曲折的。

北京大学网络和信息安全实验室主任陈钟则认为区块链应用的特色包括了去中心化、分布式抗毁、全网溯源、智能合约、同等激励等。而真正有意义的,就是用智能合约来编程,很多规则如果能够在现在构建的区块链上编程、执行,可能会使整个社会的秩序更好、更有效率。

中央财经大学信息学院院长朱建明表示,比特币、区块链的发展对社会生活已经产生了非常大的影响,比特币、区块链发展过程中出现的交易速度、监管等问题并没有影响比特币本身的发展。他认为,最成功的区块链应用仍是数字货币。

清华大学信息技术研究院副院长邢春晓认为,当前的区块链很像20年前的互联网,存在很大的泡沫。但区块链技术还有很多发展机会。区块链所要建设的理想世界是去中心化、可信、安全、公正、高效的自治组织和自治社会,但智慧城市和社会的建设面临诸多挑战。智慧社会的作用主要是机器信任、智能合约和价值传递。他把区块链的最新进展总结为ABCDE的技术,即人工智能(A)、区块链(B)、云计算(C)、大数据(D)和互联网(E,包括移动互联网和物联网)。

南京大学副教授丁晓蔚选择从金融风险的角度看区块链。他认为区块链、大数据、人工智能技术的进步将推动金融信息基础设施架构的变革。区块链可提供更为可信、全面的金融大数据,可以改变信息技术基础设施架构。相应地,监管政策和法规,也会掀起一系列的改良和变革,从而规制金融市场参与者的行为。同时,他就区块链智能合约等技术的应用,是否反而会放大金融风险,甚至于系统性的金融风险的问题,为大家做了诠释,他认为监管沙盒试验可能是一个比较好测试该类风险的方法。

北京邮电大学区块链及安全技术联合实验室主任马兆丰主要从北邮目前的区块链实践经验出发,认为传统的中心化处理的不足之处在于业务处理过于集中、信任中心不总可靠以及增加了交易成本代价。而区块链是一种分布式自组织的可信计算技术。区块链以其“去中心化、高度透明、集体维护、不可篡改、安全可靠”等特性将成为构建未来社会治理的信任基石。

“区块链的底层是数学,中层是法律,上层是经济行为”,原北方电子研究所系统总体中心主任彭雄宏这样解构和分析区块链。在他看来,区块链这种自组织协同技术要求数学在六个方面发挥作用:第一是要真正支持分布式的协同系统;第二是增强共识分布性,扩大公平性和增强系统安全性;第三是加强隐私保护,促进安全授权,提高数据共享程度;第四是加强设计和测试安全性;第五是加强平行世界的建模和仿真,使协同经济效率最优化;最后是丰富区块链的自组织机制。

而经济学家朱嘉明教授回归基础,从数学的角度去看区块链。他指出,区块链已经具备足够的跨学科基础,并已经展现了引入更多数学工具的可能性。根据嵌入理论,目前更多是区块链嵌入数学,但未来数学会更多嵌入区块链。这是一个互通的过程。区块链的应用场景将在学科交叉过程中日益扩大。在所有应用数学体系中,现在可能最具发展前景的是区块链。因此,区块链将是数学世界、关键世界和非关键世界、物理世界和物质世界之间的一个桥梁。

如何看待区块链的跨学科特性?

区块链在人工智能、量子计算、能源系统、物联网、经济金融等领域都可以有应用,因此一个普遍意义上的区块链科学一定是跨学科的。

计算科学家、中科院自动化研究所复杂系统管理与控制国家重点实验室主任王飞跃指出,要真正把人工智能系统建起来,需要区块链。建立在大数据基础上的人工智能就像把房子盖在土基、沙基上,知识都是碎片化的,可信度不高。有了区块链,人工智能的地基就相当于变成了钢筋混凝土。

中科院院士张钹指出,人工智能主要通过计算机来模拟人类的理性行为、感性感知以及模拟人类的动作。我们可以把人工智能分成两个阶段:第一阶段是传统人工智能阶段,第二阶段是深度学习时代。人工智能建立的初始,基于知识和经验的物理符号推理模型和神经网络模型都需要依赖人类编辑知识和经验或者人工选择特征输入;深度学习的出现对机器学习做了根本性的改变,从此不需要人工编辑知识和选择特征,只需要原始数据即可。

中国科学院自动化研究所副研究员袁勇指出,从技术特点来分析,区块链和人工智能存在非常互补的关系,“区块链+人工智能”最大的应用是分布式人工智能。他认为区块链和人工智能结合后,区块链会在个体层次的实体形态、组织形式、运作模式、激励机制和管理规则五个方面影响区块链生态。人工智能的基础是大数据,大数据是碎片化、实时、海量、良莠不齐的;而区块链可以架构在大数据和人工智能中间,把大数据变成可信、可靠、可用和高效的数据。

美国普渡大学区块链实验室副主任、本征资本创始合伙人邢大地博士分享了他在区块链、人工智能等领域的实践经验。他指出今天的人工智能还不够完美,并且通过比较可以发现人工智能和区块链、技术和经济学、今日和未来用于人工智能的分布式账本开放数据存在不同; 凡是多方需要共享流程和数据的业务场景都有用区块链提升效率和安全的机会。

除了人工智能,与会专家学者对其他学科领域在区块链上的探索也介绍了他们的经验和见解。

武汉大学电气工程学院教授张俊主要分析了区块链在能源系统场景中的应用情况。他表示,通证经济的核心是激励。通证对实体经济主要有两方面的作用:在实体经济内部进行调节,对实体经济外部环境进行影响。通证经济体系在能源系统中的应用不仅解决一些传统问题,还能增加能源系统的可靠性和稳定性,为能源系统的高效稳定运行提供理想的理论和应用基础。

华南理工大学自动化科学与工程学院副教授崔巍介绍了量子计算机的情况。在他看来,量子计算机对于区块链的影响主要体现在对签名机制、椭圆曲线及POW的影响。虽然密码学界提出了抗量子攻击密码,但实际上现有所有的抗量子密码都没有得到理论上的证明。

北京交通大学计算机与信息技术学院信息安全系主任王伟表示,物联网当前发展面临着一些瓶颈,区块链的身份验证与共识机制有助于避免非法、恶意节点接入,去中心化架构可以提高物联网的可拓展性和兼容性。

中科院信息工程研究所信息安全国家重点实验室副研究员陈宇重点介绍了零知识证明,他认为这一密码学的关键技术工具在大量密码协议的设计中起着不可替代的作用。

区块链面临何种困难与挑战?

区块链在发展中过程中也面临一些困难和挑战,主要体现在技术、应用和监管等方面。

数字资产研究院学术与技术委员会学术委员邹均认为,当前区块链危机主要体现在两方面:其一,币圈由原来的非零和理性博弈走向零和非理性博弈;其二,区块链技术落地时都会遇到不可能三角问题。他表示,区块链共识机制设计里要用到很多博弈论知识。理论上,区块链是一个达到纳什均衡的共识系统。但问题在于,区块链的共识机制是一个静态设计,而博弈论是动态的,所以这里存在矛盾。

Zerohm创始人钟馥百也从技术层面分享了自己做区块链过程中遇到的问题,基于现有新架构,他认为未来一定是多链的结构,一条主链加若干业务链。在开发过程中,除了数学要解决的核心问题外,还需要提供更多应用性。

英拓网络创始人练志锋则指出了区块链发展过程中面临的一些监管问题,他认为现在区块技术还没有一些规范化的东西,和统一的标准,希望区块链专家、数学家和密码学家能合力做出解决方案,尽快建立行业共识。

北京航空航天大学博士生导师蔡维德表示,并行计算、容错机制、网络协议、数据结构、扩展性、实时监管和现代金融系统需求的挑战是区块链面临的最大挑战,实验室的研究数据跟真实数据存在很大差距。

区块链会有怎样的未来?

复旦大学教授,中国计算机学会区块链专委会主任斯雪明认为区块链系统的特点是静态性、多中心、分布式、冗余、高度同构,而目前的区块链系统是高度冗余、高度同构的。理想区块链系统如何构建?根据区块链系统的特点,他从自然界的拟态群飞、群游现象中得到启示,提出了拟态群体异构体系机构。

区块链技术会不会威胁到互联网的存在或者是取代、颠覆互联网? UOC开源社区创始人贾可认为区块链技术是下一代互联网闭环中的最后一环。当前拆解区块链是为了重新理解和认知区块链,形成统一的理论,使之能够真正成为一门多学科交叉的科学。关于未来,他认为下一代互联网以及区块链网络的底层拓扑结构,将不再局限于欧氏几何,而将拓展到更一般的黎曼几何。

原北方电子研究所系统总体中心主任彭雄宏指出,经济模式的发展经历了从传统经济模式到互联网经济模式的转变,在区块链的推动下,未来将进入协同经济模式。在发展脉络上,是从信息互联网走向价值互联网的过程。信息互联网时代最大的特征就是信息的大量聚集并在此基础上产生大数据的应用和需求;价值互联网的特点则是“富合约”,大家都通过合约化的方式来进行价值和资源的流动。富合约的最大特征是可编程,目前有可编程货币,下一个阶段会出现可编程商业,而未来就是可编程社会。

结语

经济学家朱嘉明在会议结尾作出了如下总结:

如果2017年的重要关键词是AI,那么2018年的重要关键词就是区块链,区块链和AI的概念在中国和世界范围内得到了空前的普及,这在科学史、思想史和技术史上都是前所未有的。

在这样的背景下,于世界范围内召开的无数区块链会议其实暴露了三大弱点,首先是大部分区块链会议上传播的思想是非连续的,而我们的思考应当是连续的;其次,区块链会议与会者专攻的学科是单一的,而对区块链的理解是需要跨学科合作的;最后,大部分会议的商业目的和实用目的较多,而区块链会议应该更富思想,在精神层面刺激和引发大家的思考,这方面值得参考的会议便是“梅西会议”。

区块链数学科学会议的主题探讨的问题即数学是否是万能的?数学是不是可以解决区块链的问题?以及我们是否可以立足区块链建立起应用数学的一个新分支?整个会议更重要的意义就是基于数学思考和理解区块链并开拓新的思想,我们并不是为了寻求确定的结论,而是要对建立一整套思想框架做出不懈探索。今天我们所处的时代不再有数学通才、物理通才或经济学通才,达芬奇所处的那个通才时代早在20世纪中期前就结束了。通才时代结束后,我们才更需要让各个学科走在一起做思想的碰撞,这一点是时代的要求也是历史的要求。

这次区块链数学科学会议所探讨的问题,总结起来可以概括为五大问题:

  • 第一,后工业社会之后,特别是在区块链出现之后,这个时代变成什么样了?显然这个时代已经是一个超越政治制度、超越意识形态的时代,身处其中的每一个人都被这个时代所裹挟,如果说这个时代是一个最大的分布式记账系统,那每个人都是分布的节点。

  • 第二,我们如何理解和描述这个时代?这是整个会议讨论最多的问题了,众多专家学者为我们展现出的这个时代最大的特征就是“平行世界”,即物理世界(或物质世界、现实世界)与观念世界(或非物理世界、非实体世界)的平行。现在我们对于平行世界的解释正在深化和丰富,我们每个人每天的时间都分布在两个世界之中,而在后一个世界中我们消磨和花费的时间已经开始远远大于在物理世界中花费的时间。

  • 第三,因为区块链的介入,这个世界是不是变了,或者说这个世界是不是会进一步改变?会议并没有对这个问题做出确定的结论,但与会的学者普遍同意这个世界已经因区块链有了变化,至于变化有多大则是另外一个问题。今天当我们讨论这个时代或者这个世界的时候,已经不可能没有区块链这个概念,区块链已经完全融入了我们的话语体系。

  • 第四,区块链到底是什么?这是会议探讨的根本问题。与会嘉宾的若干个发言都试图对区块链进行分解和解构,把原来的区块链模式用一种全新的视角来解释,这是会议相当重要的成果。

  • 第五,会议探讨了未来,比如探讨了5G、AI、量子力学等对区块链的影响。这些影响离我们不是很遥远,既然在会议上提出来了,希望能引起大家的思考和重视。

最后,一个会议的成功与否并不在于会议能得出确定的结论,而在于能够焕发起大家的想象力。科学家应该是有想象力的,太务实的目的往往不能孕育希望。

UNICEF基于“解决全球性挑战”投资六家区块链初创企业

摘要: UNICEF在本周一(12月10日)宣布,它将向六家区块链初创企业投资10万美元,意在解决一些“使用区块链技术中的全球性挑战”,涉及从医保交付透明度到金融和资源管理等领域。

作者: Nikhilesh De

联合国儿童慈善机构UNICEF(联合国儿童基金会,The United Nations Children’s Fund)正开展对区块链技术研究的资助。

UNICEF在本周一(12月10日)宣布,它将向六家区块链初创企业投资十万美元,意在解决一些“使用区块链技术中的全球性挑战”,涉及从医保交付透明度到金融和资源管理等领域。

据一份新闻稿宣称,该项投资属于一项更大范围的计划之中。该项计划已对二十家技术初创公司做出了投资。

该笔对区块链初创企业的最新投资,是通过UNICEF的创新基金做出的。该基金就早在2016年2月就暗示将推出这一举措,并在今年年初明确启动对适合区块链领域企业的征集工作。

这些初创企业均位于一些发展中的经济体,包括阿根廷、墨西哥、印度、突尼斯和孟加拉国等国。

六家获得投资的企业分别是:开发财务跟踪平台的Atix Labs和Onesmart;建立疾病历史跟踪平台Prescrypto;致力于确保疫苗通过供应链平台提供的Statwig;开发社交协作工具的Utopixar;以及试图开发一种无需互联网访问的离线网络系统的W3 Engineers。

UNICEF的创新首席顾问Chris Fabian在一份声明中解释说,“一旦我们的投资、技术支持和对弱势群体的关注可帮助技术以最公平公正的方式成长和成熟”,这样的项目就会得到基金会的投资。

他补充指出:

“区块链技术仍处于一个早期阶段。在看到如何以及何处使用这项技术创造更美好的世界之前,我们仍要面对大量的试验、失败和经验教训。”

除了做出投资之外,UNICEF还将提供产品和技术上的援助,并将共享其合作伙伴和专家的网络。

接受资助的企业将在未来12个月内给出其项目的开源原型。

UNICEF多年来一直关注区块链的研究。它已在两年前投资了一家聚焦与身份验证技术的初创企业,定制实现交易的智能合约

英文原文: UNICEF Funds 6 Blockchain Startups to ‘Solve Global Challenges’

以太坊原理分析4 交易

关于交易的思考

狭义的交易是从A到B的一笔转账。广义的交易,是区块链系统中的一个指令,一条有效的指令,会改变区块链中的账户状态。在设计交易指令的时候,需要考虑几个问题:
* 交易类型
* 发起者身份确认
* 接受者身份确认(也可不一定马上确认,比如比特币)
* 发起内容
* 交易代价(交易代价在普通交易中也就是交易费,交易代价的引入,完全是因为区块链系统的去中心化特性:要想有人收录你的交易,你就得给予利益)

以下描述的是以太坊中的交易,包括普通交易和对智能合约账户的指令。

转账交易流程

  • 用户输入转账的地址和转入的地址和转出的金额
  • 系统通过转出的地址的私钥对转账信息进行签名(用于证明这 笔交易确实有本人进行)
  • 系统对交易信息进行验证
  • 把这笔交易入到本地的txpool中(就是缓存交易池)
  • 把交易信息广播给其它节点

以太坊交易内容

  • to:接收者的地址。在合约创建交易中,合约账户的地址还没有存在,所以值先空着。
  • nonce:发送者发送交易数的计数。
  • gasPrice:发送者愿意支付执行交易所需的每个gas的Wei数量。(理论上gas的单位可以不是wei, 但实际上就是wei)
  • gasLimit:发送者愿意为执行交易支付gas数量的最大值。这个数量被设置之后在任何计算完成之前就会被提前扣掉。
  • value:从发送者转移到接收者的Wei数量。在合约创建交易中,value作为新建合约账户的开始余额。
  • v,r,s:用于产生标识交易发生着的签名。
  • init(只有在合约创建交易中存在):用来初始化新合约账户的EVM代码片段。init值会执行一次,然后就会被丢弃。当init第一次执行的时候,它返回一个账户代码体,也就是永久与合约账户关联的一段代码。
  • input(可选域,只有在消息通信中存在):消息通话中的输入数据(也就是智能合约调用时得参数)。例如,如果智能合约就是一个域名注册服务,那么调用合约可能就会期待输入域例如域名和IP地址。
    > 以太坊的结构里面没有from字段,但from信息其实保存在v,r,s里面

交易数据结构

core/types/transaction.go

type Transaction struct {
    data txdata
    // caches
    hash atomic.Value
    size atomic.Value
    from atomic.Value
}

type txdata struct {
    AccountNonce uint64          `json:"nonce"    gencodec:"required"`
    Price        *big.Int        `json:"gasPrice" gencodec:"required"`
    GasLimit     uint64          `json:"gas"      gencodec:"required"`
    Recipient    *common.Address `json:"to"       rlp:"nil"` // nil means contract creation
    Amount       *big.Int        `json:"value"    gencodec:"required"`
    Payload      []byte          `json:"input"    gencodec:"required"`

    // Signature values
    V *big.Int `json:"v" gencodec:"required"`
    R *big.Int `json:"r" gencodec:"required"`
    S *big.Int `json:"s" gencodec:"required"`

    // This is only used when marshaling to JSON.
    Hash *common.Hash `json:"hash" rlp:"-"`
}

交易和消息

  • 交易是外部世界和以太坊内部状态的桥梁
  • 消息或内部交易类似于交易,不过与交易有着最大的不同点—它们不是由外部拥有账户产生的。相反,他们是被合约产生的。
  • 消息是虚拟对象,与交易不同,没有在链上,而且只存在与以太坊执行环境。
  • 内部交易或者消息不包含gasLimit

以太坊原理分析3 区块

区块结构

在以太坊中,一个区块包含:
* 区块头
* 关于包含在此区块中交易集的信息
* 与当前块的uncles相关的一系列其他区块头,叔块

uncles解释

uncle就是一个区块的父区块与当前区块父区块的父区块是相同的。也就是当前区块的叔块。
由于以太坊的构造,它的区块生产时间(大概15秒左右)比其他的区块链例如Bitcoin(大概10分钟左右)要快很多。这使得交易的处理更快。但是,更短的区块生产时间的一个缺点就是:更多的竞争区块会被矿工发现。这些竞争区块同样也被称为“孤区块”(也就是被挖出来但是不会被添加到主链上的区块)。

uncles的目的就是为了帮助奖励矿工纳入这些孤区块。矿工包含的uncles必须是有效的,也就是uncles必须在父区块的第6个子区块之内或更小范围内。在第6个子区块之后,陈旧的孤区块将不会再被引用(因为包含老旧的交易会使事情变得复杂一点)。

uncle区块会收到比全区块少一点的奖励。不管怎样,依然存在激励来让矿工们纳入孤区块并能从中获得一些报酬。

core/types/block.go
type Block struct {
    header       *Header
    uncles       []*Header
    transactions Transactions

    // caches
    hash atomic.Value
    size atomic.Value

    // Td is used by package core to store the total difficulty
    // of the chain up to and including the block.
    td *big.Int

    // These fields are used by package eth to track
    // inter-peer block relay.
    ReceivedAt   time.Time
    ReceivedFrom interface{}
}

区块头

区块头是一个区块的一部分,包含了:
* parentHash:父区块头的Hash值(这也是使得区块变成区块链的原因)
* UncleHash:当前区块Uncles列表的Hash值
* miner:接收挖此区块费用的账户地址
* stateRoot:状态树根节点的Hash值(回忆一下我们之前所说的保存在头中的状态树以及它使得轻客户端认证任何关于状态的事情都变得非常简单)
* transactionsRoot:包含此区块所列的所有交易的树的根节点Hash值
* receiptsRoot:包含此区块所列的所有交易收据的树的根节点Hash值
* logsBloom:由日志信息组成的一个Bloom过滤器 (数据结构)
* difficulty: 此区块的难度级别
* number:当前区块的计数(创世纪块的区块序号为0,对于每个后续区块,区块序号都增加1)
* gasLimit:每个区块的当前gas limit
* gasUsed: 此区块中交易所用的总gas量
* timestamp:此区块成立时的unix的时间戳
* extraData:与此区块相关的附加数据
* mixHash:一个Hash值,当与nonce组合时,证明此区块已经执行了足够的计算
* nonce:一个Hash值,当与mixHash组合时,证明此区块已经执行了足够的计算

core/types/block.go
// Header represents a block header in the Ethereum blockchain.
type Header struct {
    ParentHash  common.Hash    `json:"parentHash"       gencodec:"required"`
    UncleHash   common.Hash    `json:"sha3Uncles"       gencodec:"required"`
    Coinbase    common.Address `json:"miner"            gencodec:"required"`
    Root        common.Hash    `json:"stateRoot"        gencodec:"required"`
    TxHash      common.Hash    `json:"transactionsRoot" gencodec:"required"`
    ReceiptHash common.Hash    `json:"receiptsRoot"     gencodec:"required"`
    Bloom       Bloom          `json:"logsBloom"        gencodec:"required"`
    Difficulty  *big.Int       `json:"difficulty"       gencodec:"required"`
    Number      *big.Int       `json:"number"           gencodec:"required"`
    GasLimit    uint64         `json:"gasLimit"         gencodec:"required"`
    GasUsed     uint64         `json:"gasUsed"          gencodec:"required"`
    Time        *big.Int       `json:"timestamp"        gencodec:"required"`
    Extra       []byte         `json:"extraData"        gencodec:"required"`
    MixDigest   common.Hash    `json:"mixHash"          gencodec:"required"`
    Nonce       BlockNonce     `json:"nonce"            gencodec:"required"`
}

三颗重要的树

每一棵树的节点都是一个k,v对

状态树

键是地址(账户地址&合约地址),是KEC(a)即160位的账户地址的哈希(Keccak-256算法),value是账户(nonce、balance、storageRoot、codeHash)的RLP格式序列化字节

也就是Account数据结构

core/state/state_object.go:
type Account struct {
    Nonce    uint64
    Balance  *big.Int
    Root     common.Hash // merkle root of the storage trie
    CodeHash []byte
}

交易树

包含此区块所列的所有交易的树的根节点Hash值。

收据树

收据是交易的执行结果。存在的意义在于,交易树表示以太坊状态机的输入,收据树表示以太坊状态机的输出。而状态树,是以太坊账户的最终状态,也可以理解为整个以太坊系统的最终状态。

Transaction Receipts record the transaction outcome
Purpose:
* Transaction Tries: records transaction request vectors
* Transaction Receipt Tries: records the transaction outcome

Parameters used in composing a Transaction Receipt Trie [details in section 4.4.1 of the yellow paper]:

> The post-transaction state: a trie structure holding the state after the execution. Encoded as a byte array.
> Gas used: the total amount of gas used.
> Logs: the set of logs entries created upon transaction execution.
> The bloom filter: it is created based on the information found int he logs. Logs entries are reduced are reduced to 256 bytes hashes, which are embedded in the block header as the logs bloom.

收据的主要字段有:
* blockHash: 交易所在块的哈希值
* blockNumber: 交易在块的序号
* transactionHash: 交易的哈希值
* transactionIndex: 交易在块中的序号
* from: 发送者地址
* to: 接受者地址,为空时候表示创建合约
* cumulativeGasUsed: 执行完此交易时候,块内消耗的总的gas值
* gasUsed:本交易所消耗的gas
* contractAddress: 当此交易为创建合约时,表示所创建合约的地址,否则为空
* logs: 此交易的日志

/core/types/receipt.go
type Receipt struct {
    // Consensus fields
    PostState         []byte `json:"root"`
    Status            uint64 `json:"status"`
    CumulativeGasUsed uint64 `json:"cumulativeGasUsed" gencodec:"required"`
    Bloom             Bloom  `json:"logsBloom"         gencodec:"required"`
    Logs              []*Log `json:"logs"              gencodec:"required"`

    // Implementation fields (don't reorder!)
    TxHash          common.Hash    `json:"transactionHash" gencodec:"required"`
    ContractAddress common.Address `json:"contractAddress"`
    GasUsed         uint64         `json:"gasUsed" gencodec:"required"`
}

其他

  • 梅克尔状态转变的证明(Merkle state transition proof)。“如果你在根S的状态树上运行交易T,其结果状态树将是根为S’,log为L,输出为O”
  • 状态树和收据树,是以通过交易计算得到。严格讲是一种线下状态,但是该状态的footprint被保存在了链上

以太坊原理分析2 账户

账户分为两种:

  • 外部拥有账户(EOA),一般指自然人拥有的账户。
EOA特征
    codeHash为空
    storageRoot为空
    通过私钥控制
    发起交易(转移以太币或触发合约代码)
  • 合约账户(CA),为智能合约分配的账户。
CA特征
    不能发起交易,可以被触发执行合约代码(通过EOA发起的交易或者从其他CA接收的消息调用激活)

账户数据

  • nonce : 外部账户为交易次数,合约账户为创建的合约序号
  • balance : 此地址的以太币余额
  • storageRoot : 账户存储内容组成的默克尔树根的哈希值。
  • codeHash : 账户EVM代码的hash值。合约账户即为合约代码的哈希值,外部账户为空字符串的哈希值

账户数据结构

core/state/state_object.go:
type Account struct {
    Nonce    uint64
    Balance  *big.Int
    Root     common.Hash // merkle root of the storage trie
    CodeHash []byte
}

合约账户

  • 智能合约账户,就是一段代码,也可以理解为一个状态机。
  • 由交易创建
  • 由交易驱动,每次想改变智能合约状态,需要发送一笔交易
  • 合约账户不能主动发起交易,所有交易都由普通账户发出
  • 智能合约由evm直接运行,运行后的结果,可能会改变智能合约的状态,改变普通账户的状态,由每个节点本地运行evm, 只要有相同的输入,就会由相同的输出

storage root

所有智能合约的数据,都存在leveldb本地。数据组成一颗mpt树,树根会被存放在账户中,存放在链上

对于一个fullnode节点,在同步数据的时候,会构建所有的普通账户,所有智能合约账户,以及所有智能合约账户的storage存储

因此,同receipt一样,你可以理解为,所有的storage都存储在链下,但是根存储在链上

Ethereum uses Patricia Trie data structure implemented using Google’s leveldb database. It handles storage of different kinds of data on the Patricia tries – transaction trie, state trie, storage trie and receipts trie. Only the root node hashes of the tries are stored directly in the blockchain as part of each blocks.

A storage trie is where all of the contract data lives. Each Ethereum account has its own storage trie.The trie is updated whenever there is a state change. (i.e. When a change is made to an existing state variable.) All nodes will make the changes to their own copy of the trie when they receive a new block. Each node in the state trie (i.e. the account) has its own storage trie. A transaction trie is per block, and contains a trie of transactions in the block. The receipt trie contains log entries for the transactions in the transactions trie.

https://stackoverflow.com/questions/51034366/ethereum-smart-contract-storage

以太坊原理分析1 架构

网络结构

区块链状态机

  • 区块链是一个去中心化,分布式状态机
  • 从创始区块开始,每一个新区块的加入,就是一个新的状态点
    > 区块的加入:
    image
    > 状态点变迁:
    image

主要组成部分

  • 账户
  • 状态
  • 交易
  • 区块
  • gas费用
  • 挖矿共识
  • 智能合约

link

https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369

https://zhuanlan.zhihu.com/p/30922425