精华内容
下载资源
问答
  • 使用案例:保险流程中的智能合约 智能合约的好处 安装先决条件 配置Genesis Block ... 创建以太坊智能合约 执行以太坊智能合约 https://www.jianshu.com/p/69237f98d43d?from=singlemessage ...

     

    一、以太坊 智能合约的运行原理

    1. 智能合约

    智能合约是一种特殊协议,旨在提供、验证及执行合约。

    具体来说,智能合约是区块链被称之为“去中心化的”重要原因,它允许我们在不需要第三方的情况下,执行可追溯、不可逆转和安全的交易。

     

    在以太坊,记录在区块链账本里的不仅仅是账户余额,还有函数调用后变量的新状态。

     

     

    2. 开发步骤

    step1:  启动以太坊节点

    启动一个以太坊节点(如Geth)

     

    step2:编写

    使用智能合约编程语言(如Solidity)编写智能合约(后缀为.sol)。

    可以将一个智能合约实例理解成一个对象,编写一个智能合约类似于编写一个类,其可以在这个类里定义各种变量以及函数。

     

    这里给出一个简单的例子。下面这段代码就是一个智能。合约SimpleStorage,里面只有一个变量storedData,以及set和get方法。

    contract SimpleStorage {
    
        string storedData;
    
        function set(string s) {
            storedData = s;
        }
    
        function get() constant returns (string) {
            returnstoredData;
        }
    
    }

     

     

    step3:  编译

    用solc编译器将.sol合约代码编译成EVM字节码。

     

     

    step4:部署

    通过以太坊客户端将编译好的合约代码上传部署到以太坊区块链需要消耗GAS,并且需要合约发起用户使用自己的外部所有账户对将要部署的合约进行签名,通过矿工确认后,将合约代码存于以太坊区块链上,即智能合约被发送到所有连接到网络的设备上。在这一步中,用户可获得合约的地址,以及调用合约所需的接口,以便之后使用。

     

    图1-4展示了在以太坊网络中创建智能合约的过程。

    当Bob将一个包含智能合约信息(如上例代码)的交易发送到以太坊网络中后,节点的EVM执行这个交易并生成对应的合约实例,图中的“0x6f8ae93..”代表了这个合约的地址。节点间通过共识机制达成一致后,这个合约就正式生效了,之后用户就可以调用SimpleStorage合约了。

     

    当用户将这个智能合约发布到以太坊网络中时,相当于给这个类生成一个对象,合约发布之后用户会得到一个合约地址,相当于合约对象的指针。

     

     

     

    step5:调用

    使用web3.js库所提供的JavaScript API接口来调用合约。这一步也会消耗以太币。

    当网络中的用户调用这个智能合约时,可以直接给这个合约地址发送“交易”,并声明本次调用的函数名称和参数,使得智能合约执行对应的逻辑。

     

    无论发布还是调用智能合约,智能合约的信息都被附在“交易”中,以交易的形式发布到网络中。

    因此以太坊网络中的节点接收到这些交易后,其中的EVM会执行对应的合约代码,最后各个节点通过PoW或PoS等达成共识,合约的内容和状态也就实现了全网一致

     

    图1-5展示了在以太坊上调用智能合约的过程。

    Bob同样以交易的形式在“To”字段填上SimpleStorage合约的地址,在“Data”字段填上调用的方法(set)和参数(“Hello”),就可以调用智能合约SimpleStorage,将其中的storedData设为“Hello”。节点收到这条交易后,通过EVM执行对应的操作,并通过共识机制实现以太坊网络上合约状态的改变。

    之后,当Alice查看这个合约的变量时,就会发现这个合约中storedData变量的值变成了“Hello”。

    由于查看的过程不涉及状态的修改,而且以太坊上数据是分布式的,网络中的每个节点都可以在本地保存一份完整的数据,因此Alice可以不通过交易的形式查看到这个变量的值。

    --《以太坊技术详解与实战》


     

     
    ps:
    • a、合约地址和合约接口(ABI)是找到合约并调用合约的必要信息。
    • b、在以太坊上创建(部署)、调用一个合约是通过发送一个交易完成的。

     

    3. 太坊虚拟机EVM

    以太坊虚拟机(EVM)是以太坊上智能合约的运行环境。

    每个以太坊节点都运行着EVM。

     

    它实际上是完全隔离的,这意味着在EVM上运行的代码无法访问网络、文件系统和其他进程。

    智能合约对其他的智能合约的访问权也有限,在区块链网络上单独运作。

     

     
     

    4. 矿工的职责

     
    以太坊中miner的职责有:
    • 接收(receive)交易
    • 验证(verify)交易
    • 传播(propagate)交易
    • 执行(execute)交易(ps:执行交易主要是调用合约交易)。
    • 接收区块,
    • 验证区块,
    • 传播区块。
    这些职责都是诚实矿工做的,理性矿工可能只是产生区块。
     
     
     
     

    5. 智能合约的数据存在哪里的?

     
    智能合约的数据(状态变量)存在区块链上。
     
     
     

    6. 调用合约 传进来的参数存在哪里?

     
    参数不一定,参数如果用的是栈那就不存,默认的栈是memory类型
     
    数据位置,变量的存储位置属性。有三种类型
    • memory(内存)
    • storage(持久化到硬盘上)
    • calldata
    •  
    最后一种数据位置比较特殊,一般只有外部函数的参数(不包括返回参数)被强制指定为calldata(大多数表现和memory一样)。这种数据位置是只读的,不会持久化到区块链(即leveldb中)。
     
    一般我们可以选择指定的是memory和storage。
     
     
     
    memory存储位置同我们普通程序的内存类似。即分配,即使用,越过作用域即不可被访问,等待被回收。
     
    而对于storage的变量,数据将永远存在于区块链上(持久化到硬盘上)。
     
    memory就相当于栈的数据。可以把栈里的元素放到storage位置和memory位置
     
    一个合约里的局部(local)变量状态(state)变量都存在链上,即持久化到leveldb中了。
     
     

    7. 深入分析

     
    storage 存储结构是在合约创建的时候就确定好了的,它取决于合约所声明状态变量。但是内容可以被(交易)调用改变(所有的节点修改一样)
     
    Solidity 称这个为状态改变,这也是合约级变量称为状态变量的原因。也可以更好的理解为什么状态变量都是storage存储。
     
    memory 只能用于函数内部,memory 声明用来告知EVM在运行时创建一块(固定大小)内存区域给变量使用。
     
    storage 在区块链中是用key/value的形式存储,而memory则表现为字节数组
     
     

    8. 关于栈(stack)

     
    EVM是一个基于栈的语言,栈实际是在内存(memory)的一个数据结构,每个栈元素占为256位,栈最大长度为1024。
     
    值类型的局部变量是存储在栈上。
     
     

    9. 不同存储的消耗(gas消耗)

     
    • storage 会永久保存合约状态变量,开销最大
    • memory 仅保存临时(temporary)变量,函数调用之后释放,开销很小
    • stack 保存很小的局部变量(small local variables),几乎免费使用,但有数量限制。
     
    合约storage是以太坊帮我们实现好了。开发者只需要根据合约地址和ABI调用合约的函数就行。
     
    以太坊里面的合约有点像服务端程序,业务调用合约的接口就是了。
     
    交易数据存储在区块链上,账户的状态数据存储在本地;区块只保存该区块最终实现的账户状态的默克尔根。
     
    部署交易的时候只需要携带合约的EVM字节码。当合约源程序比较大,相应的二进制码也会很大。
     
    用户发送特定的交易(该交易被存储在某一区块里),部署合约到以太坊上,最后生成的合约地址(每一个合约地址对应一个合约账户,即内部账户)是所有的以太坊节点都有。
    (合约账户只存合约的以太坊虚拟机字节码(一种以太坊专用的的二进制格式)。)
     
    合约账户可以存储以太币;存储智能合约的可执行字节码;可响应别的用户或合约执行此智能合约的请求,并返回结果;可调用别的智能合约。
     
     
     

    10. 为什么比特币这些项目喜欢用leveldb?是有哪些工程上的考量吗?

     
    每个节点全量备份只能考虑嵌入式数据库。嵌入式数据库只有leveldb,rocksdb,sqlite。

     

     

    在以太坊上部署和运行智能合约大致流程

    http://blog.sina.com.cn/s/blog_a93b83380102zb9z.html#cmt_5AAB2321-CA787956-167D58BCD-927-8FE

     

    智能合约这么火,但是你连它的执行原理都不知道?

    https://www.sohu.com/a/260072502_100271565

     

    去中心化的区块链平台 

    https://www.sohu.com/a/243362789_797635/

     

    二、以太坊 智能合约的开发实例

     

    • 使用案例:保险流程中的智能合约
    • 智能合约的好处
    • 安装先决条件
    • 配置Genesis Block
    • 运行以太坊专用网络
    • 创建以太坊帐户
    • 创建以太坊智能合约
    • 执行以太坊智能合约

     

     

    https://www.jianshu.com/p/69237f98d43d?from=singlemessage

     

    什么是智能合约,智能合约运作原理详解

    https://www.jianshu.com/p/884df9fb6767

    展开全文
  • 区块链以太坊智能合约视频培训教程,该课程以区块链前沿技术...通过完成简单合约,了解以太坊智能合约原理,并从运行环境、代码、deploy、调用/测试,来让开发者理解实实在在的合约,进行智能合约开发,并与应用联系上。
  • 文章目录一、智能合约概述1.1 智能合约是什么1.2 solidity语言二、外部账户调用智能合约三、一个合约调用另一个合约3.1 直接调用3.2 使用address类型的call()函数3.3 代理调用delegatecall()函数3.4 payable3.5 ...
  • 以太坊智能合约之转账原理

    千次阅读 2018-05-15 10:21:51
    以太坊智能合约开发中,有时需要向智能合约地址直接转账,比如ico众筹, 目前有三种方式:创建合约时转账调用合约方法时转账直接向合约地址进行转账创建合约时转账 在进行合约开发时,如果想要在创建合约时直接向...

     在以太坊智能合约开发中,有时需要向智能合约地址直接转账,比如ico众筹, 目前有三种方式:

    • 创建合约时转账
    • 调用合约方法时转账
    • 直接向合约地址进行转账

    创建合约时转账

        在进行合约开发时,如果想要在创建合约时直接向该合约进行转账,只需要给构造函数中添加payable修饰符
    contract C {
        function C() payable{
        }
    }

    执行合约方法转账

        需要给你需要支持转账功能的方法添加payable修饰符

    function d() payable {
        a = 3;
    }

    直接转账

        支持直接转账,需要借助默认函数(fallback function),默认函数是没有名字的函数,如下

    function () payable {
        a = 3;
    }

    用户如何向智能合约转账

        用户向智能合约转账的核心是填充transaction.value的值,该值就是转账的金额,evm会执行先扣款后验证的逻辑,即不管对应的函数是否支持转账都会先扣除value实现转账,如果对应的函数不支持转账,对应的函数的代码会通过revert指令撤销前面的转账操作。具体原理看下面的Payable关键词原理

    Payable关键词原理

        payable关键词是编译器支持的,函数是否带有payable关键词,编译器会生成不一样的代码。如果不带有payable关键词,会在函数的入口添加callvalue的检验。

    构造函数不带payable标识

    contract C {
    function C() {
    }
    }
    对应的汇编如下,创建智能合约时会检测callvalue是否为0,不为0,则非法参数会revert
    .code
    PUSH 80 contract C {\n function C()...
    PUSH 40 contract C {\n function C()...
    MSTORE contract C {\n function C()...
    CALLVALUE function C() {\n }
    DUP1 C {\n
    ISZERO ac
    PUSH [tag] 1 ac
    JUMPI ac
    PUSH 0 {
    DUP1 (
    REVERT ction C() {\n

    如果带上payable

    contract C {
    function C() payable{
    }
    }
    .code
    PUSH 80 contract C {\n function C()...
    PUSH 40 contract C {\n function C()...
    MSTORE contract C {\n function C()...
    PUSH #[$] 0000000000000000000000000000000000000000000000000000000000000000 contract C {\n function C()...
    DUP1 contract C {\n function C()...
    PUSH [$] 0000000000000000000000000000000000000000000000000000000000000000 contract C {\n function C()...
    PUSH 0 contract C {\n function C()...
    CODECOPY contract C {\n function C()...
    PUSH 0 contract C {\n function C()...
    RETURN contract C {\n function C()...
    不检测callvalue, 也没有revert

    普通函数的payable

        普通函数是一样的,如果没有加payable, 每个函数入口都会检测CALLVALUE
    function d() {
    a = 3;
    }
    tag 3 function d() {\n a = 3;...
    JUMPDEST function d() {\n a = 3;...
    CALLVALUE function d() {\n a = 3;...
    DUP1 C {\n
    ISZERO ac
    PUSH [tag] 8 ac
    JUMPI ac
    PUSH 0 c
    DUP1 b
    REVERT t256 public

    有callvalue及revert指令

    fallback函数payable

    function() {
    a = 0x4f;
    }
    tag 1 contract C {\n uint256 publ...
    JUMPDEST contract C {\n uint256 publ...
    CALLVALUE contract C {\n uint256 publ...
    DUP1 C {\n
    ISZERO ac
    PUSH [tag] 5 ac
    JUMPI ac
    PUSH 0 c
    DUP1 b
    REVERT t256 public
    tag 5 ac
    JUMPDEST ac
    POP
    PUSH 4F 0x4f
    PUSH 0 a
    SSTORE a = 0x4f
    STOP contract C {\n uint256 publ...
    如果带上payable
    function() payable{
    a = 0x4f;
    }
    tag 1 contract C {\n uint256 publ...
    JUMPDEST contract C {\n uint256 publ...
    PUSH 4F 0x4f
    PUSH 0 a
    SSTORE a = 0x4f
    STOP contract C {\n

    /********************************

    * 本文来自CSDN博主"爱踢门"
    * 转载请标明出处:http://blog.csdn.net/itleaks
    ******************************************/

    展开全文
  • 通常智能合约的开发流程是用solidlity编写逻辑代码,再通过编译器编译元数据,最后再发布到以太坊上。 代码结构 . ├── analysis.go //跳转目标判定 ├── common.go ├── contract.go //合约数据结构 ├── ...
  • 区块链以太坊智能合约视频培训教程,该课程以区块链前沿...通过完成简单合约,了解以太坊智能合约原理,并从运行环境、代码、deploy、调用/测试,来让开发者理解实实在在的合约,进行智能合约开发,并与应用联系上。...
    【区块链】实战·以太坊智能合约编程引导—4297人已学习 
    课程介绍    
    201803222100416334.png
        区块链以太坊智能合约视频培训教程,该课程以区块链前沿技术实战+理论讲解,以案例剖析区块链以太防智能合约编程技术。带领学员实操演练,指导学员现场调试,并且提供完整的虚拟机文件,以保证学员下载后可以正常使用源码。通过完成简单合约,了解以太坊智能合约原理,并从运行环境、代码、deploy、调用/测试,来让开发者理解实实在在的合约,进行智能合约开发,并与应用联系上。
    课程收益
        掌握区块链技术开发入门
        了解以太坊智能合约开发原理
        掌握以太坊智能合约开发技术
    讲师介绍
        CSDN公开课更多讲师课程
        CSDN线上公开课全掌握!
    课程大纲
        1.以太坊智能合约编程引导-第一课 实例,代码  45:27
        2.以太坊智能合约编程引导-第二课 Deploy 调用/测试  01:06:40
        3.以太坊智能合约编程引导-第三课 完整过程  58:30
    大家可以点击【查看详情】查看我的课程
    展开全文
  • 相对于比特币的脚本,以太坊智能合约的出现是一种比较大的进步。这篇文章我们来讨论以太坊网络智能合约的工作原理。 1 区块链101 区块链简而言之就是非中心化的分布式账本,一种多方参与者共享的特定类型...

    image

    以太坊图灵完备的智能合约丰富了区块链从比特币单一数字资产去中心化转移到去中心化的全球分布式计算机变为可能,虽然在以太坊网络运行代码成本比较高。相对于比特币的脚本,以太坊智能合约的出现是一种比较大的进步。这篇文章我们来讨论以太坊网络智能合约的工作原理。

    1

    区块链101

    区块链简而言之就是非中心化的分布式账本,一种多方参与者共享的特定类型数据库。

    账本中保存在区块链网络中发生所有的交易,每个加入网络的节点都有数据的全量拷贝。经济激励模型削弱甚至消除了独立节点之间的信任基础,在不需要信任的开放网络中转移数字资产。

    区块链世界奉行 Don’t trust, verify it 原则。

    2

    智能合约

    图灵完备的智能合约让以太坊成为继比特币之后区块链技术最大的亮点。比特币是数字资产作为价值的载体,而以太坊超越了数字资产属性,赋能去中心化应用。智能合约是能够在区块链网络运行的代码逻辑。

    3

    以太坊账户模型和状态模型

    比特币使用 UTXO 模型,而以太坊使用账户模型。智能合约在以太坊中也属于账户。以太坊网络有且仅有一个经常被更新的 State trie 全局状态。state trie 通过健值对维护所有在以太坊网络发生过交易的账户。

    key 为长度为 160 bit 的以太坊地址,value 为下面四个要素使用 RLP (Recursive-Length Prefix 编码方法) 编码而来。每个账户都是 state trie 的一个节点,所有账户的 state trie 做类默克尔树得到根节点 (State Trie — Keccak-256-bit hash of the state trie’s root node stored as the “stateRoot” value)

    • nonce

    • balance

    • storageRoot

    • codeHash

    下图为 state trie 与区块的关系

    image

    Relationship between the State Trie (leveldb implementation of a Merkle Patricia Trie) and an Ethereum block

    两种账户 nonce (账户中成功转账次数) 和 balance (eth 余额) 字段都有数据,智能合约账户 storageRoot (保存合约的所有数据)和 codeHash (保存合约代码编译后字节码) 有数据,而普通账户这两个字段为空。

    合约的数据保存在 storage trie 中,正如 state trie 一样,storage trie 同样存储格式同样为健值对 (keys are storage locations and values are storage values) 对应合约中变量名和值,这些健值对通过默克尔散列之后得到 storageRoot 存储在账户中。

    下图为 storage trie 和 state trie 的关系

    image

    eth_storage_tree.png

    值得强调的是:区块数据只保存 transaction trie (类似比特币中的区块头中存储所有区块中的交易默克尔树根结点), state trie root 和 receipts trie root。

    4

    智能合约账户

    contract Counter {
    
        uint counter;
       function Counter(
    
    ) public {
    
            counter = 0; 
    
        }    function
    
    count() public {
    
            counter 
       = counter + 1; 
    
        }
    
     }

    简单的智能合约,类型为 uint 的 counter 为合约的状态,count 函数被调用之后, counter 值加 1

    image

    smart_contract_account.png

    5

    以太坊交易

    交易信息中有个比较特殊的字段 data , 这个字段值结合 to 字段可把以太坊交易分为三大类:

    转账

    • TO 收款地址

    • DATA 为空或任意交易备注信息

    • AMOUNT 交易 ether 数量

    新建合约

    • TO 字段为空,新建合约被触发

    • DATA 字段为智能合约字节码

    • AMOUNT 字段可为空或任意数,非负数则转账给新建的合约账户

    调用合约

    • TO 字段为合约账户地址

    • DATA 字段为合约函数及其参数

    • AMOUNT 空或任意数

    // Transfer of value
    
    {
    
        to: '0x687422eEA2cB73B5d3e24
    2bA5456b782919AFc85',
    
        value: 0.0005
    
        data: ‘0x’ // 
    Could also send a message here 
    if we want to
    
    }
    
    // Create smart contract
    
    {
    
        to: '',
        value: 0.0
    
        data: ‘0x60606040523415610
    00c57fe5b60405160c0806……………’
     }
    
    // Call contract
    
    {
    
        to: '0x687422eEA2cB73B5d3e2
    42bA5456b782919AFc85',  
    
    // Contract
    
        value: 0.0
    
        data: '0x606060405234156100
    0c57fe5b60405160c0806……………'
    
    }

    值得强调的是,在以太坊交易中有 gas 的概念,在以太坊网络跑运用需要一定的成本,同时必须设置 gas 上限,交易执行完成之后,剩余的 gash 将会返还。

    推荐阅读

    • Diving into Ethereum’s world state

    • Basic Questions About the Ethereum EVM and State Storage

    • State Tree Pruning

    内容来源:简书

    作者:老码农不上班

    以下是我们的社区介绍,欢迎各种合作、交流、学习:)

    image

    展开全文
  • 简单理解以太坊智能合约

    千次阅读 2018-04-13 21:14:54
    前言Eth(以太坊)不知道你有没有听说过,ICO你一定听说过。但你知道ICO其实是借助Eth的智能合约实现的吗?什么是智能合约,Eth为啥这么火?智能合约的特点是什么,我怎么写智能合约?基于智能合约还有Dapp,即分布式...
  • 2018.04月份爆发了2次黑客攻击事件,均是由于智能合约的溢出漏洞引发的,本次课程深度解析还原智能合约安全漏洞的原理、攻击模拟与防范措施,知己知彼才能更好的避免黑客安全事件的再次发生。
  • Eth(以太坊)不知道你有没有听说过,ICO你一定听说过。但你知道ICO其实是借助Eth的智能合约实现的吗?什么是智能合约,Eth为啥这么火?智能合约的特点是什么,我怎么写智能合约?基于智能合约还有Dapp,即分布式app...
  • 以太坊智能合约之批量转币 专门用于批量空投的 ETH 智能合约(该链接需要梯子) 教你一招 如何批量发送eth 或者代币 使用智能合约转代币是比较容易理解的,上面的链接中基本都有,直接拿来可以用。 但是转eth就...
  • 原理 web3.js本身没有数据,所以要查询数据或者执行操作都要通过指定的节点,web3.js与节点通信使用的是JSON-RPC协议。 以Geth为例,实现的方法可以参考https://github.com/ethereum/wiki/wiki/JSON-RPC。 web3.js...
  • 椭圆曲线加密与签名原理 先来看一下椭圆曲线的加密原理,首先有私钥priKey和公钥pubKey,其中: pubKey = priKey * G G是椭圆曲线参数规定的生成点。上面的代码是一个几何运算,G是椭圆曲线上的一个点,priKey是一个...
  • 篇 基础理论与原理 ·第1章 与区块链的第一次亲密接触·第2章 去中心化应用——DApp·第3章 比特币那些事·第4章 以太坊
  • web3j以太坊智能合约流程浅析

    千次阅读 2018-05-14 15:02:34
    这次历时两个月左右的项目,主要在智能合约开发上。简单讲讲里面的一些东西。1、web3j原理web3j是一套访问以太坊rpc服务的java sdk,简单的说就是封装了 http调用的业务sdk包。有什么业务,主要看etherum-harmony...
  • DApp概念和web3.py介绍简单来说,DAPP和普通的App原理一样,除了他们是完全去中心化的,由类似以太坊网络本身自己的节点来运作的DAPP,不依赖于任何中心化的服务器,DAPP是去中心化的,可以完全自动地运行。...
  • DApp概念和web3.py介绍简单来说,DAPP和普通的App原理一样,除了他们是完全去中心化的,由类似以太坊网络本身自己的节点来运作的DAPP,不依赖于任何中心化的服务器,DAPP是...
  • 整数溢出的原理其实很简单,这里以 8 位无符整型为例,8 位整型可表示的范围为 [0, 255],255 在内存中存储按位存储的形式为(下图左):8 位无符整数 255 在内存中占据了 8bit 位置,若再加上 1 整体会因为进位而...
  • 上一节介绍了区块链的基本原理,本文我们将继续深入认识区块链,接着进入正题,重点讲解以太坊和它的运作过程。 3.比特币网络:去中心化(Decentralization) 我们先了解一下中心化网络,我们现在浏览的几乎所有...
  • /** * @dev Approve an address to ... // 改变了from的值,也必须把from未必给合约的值变化一下(委托合约交易) _approve(from, msg.sender, _allowed[from][msg.sender].sub(value)); return true; }  

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 182
精华内容 72
关键字:

以太坊智能合约原理