建议和反馈

请填写你的反馈内容

感谢您对链客的信任!

恭喜您填写完个人简历!链客专注于区块链职位连接,帮助您的投递更加精准高效,赶快去选择自己心仪的岗位吧!

推动中国区块链事业发展始终是我们坚定不移的梦——链客团队

  • 以太坊智能合约-了解以太坊相关概念

    许多人都说比特币是区块链1.0,以太坊是区块链2.0。在以太坊渠道上,能够开发各式各样的去中心化运用,这些运用构成了以太坊的整个生态。现在,以太坊是区块链国际里生态建设最好的底层公链。本篇将以通俗易懂的办法介绍以太坊开发中涉及到的相关概念,带领我们轻松入门。以太坊以太坊(Ethereum)是一个建立在区块链技能之上的、图灵完备的去中心化运用渠道。它允许任何人在渠道中经过智能合约技能开发、布置和运用去中心化运用。>  有没有感到和ios、Android渠道有点类似?在以太坊未面世之前,写区块链的运用是这样的:拷贝一份比特币代码,然后去改底层代码如加密算法、共识机制、网络协议等等。2013、2014年那时候的许多山寨币便是这样,改改比特币代码就造出来一个新币。以太坊渠道对底层区块链技能进行了封装,让区块链运用开发者能够直接根据以太坊渠道进行开发,开发者只需专注于运用本身的开发,从而大大降低了难度。>  现在环绕以太坊现已形成了一个较为完善的开发生态圈:社区支撑、开发结构、开发工具等等。智能合约网络上关于智能合约的解释都很晦涩。咱们能够简单的了解为在区块链上,由事件驱动、以代码形式存在、可执行的特别买卖合同。它是代码、数据的集合。智能合约十分合适对信任、安全和耐久性要求较高的运用场景,比方:数字钱银、数字资产、投票、稳妥、金融运用、猜测市场、产权一切权办理、物联网、点对点买卖等等。现在除数字钱银之外,真实落地的运用还不多。和移动互联网刚兴起之时各式各样、各行各业的APP推陈出新相同,去中心化运用的市场在初期必定有一个红利期。对此有兴趣的开发者,可抓住机会。SoliditySolidity是一门和JavaScript类似的编程言语,文件扩展名以 .sol 完毕。它用于智能合约的开发,并能编译成以太坊虚拟机字节码,布置到以太坊底层区块链网络上。EVMEVM即以太坊虚拟机,全称是Ethereum Virtual Machine。它是以太坊智能合约的运转环境。> EVM是由以太坊节点供给。每个以太坊节点中都包括EVM> Solidity之于EVM,就像Java跟JVM的联系相同> 以太坊虚拟机是一个阻隔的环境,在EVM内部运转的代码不能跟外部有联系EVM运转在以太坊节点上,当咱们把合约布置到以太坊区块链网络上之后,合约就能够在以太坊网络中运转了。合约编译以太坊虚拟机上运转的是合约的字节码。这就需求咱们在布置之前先对合约进行编译。引荐运用solc编译器。以太坊客户端(节点)一个以太坊客户端便是一个以太坊节点。它供给账户办理、数字资产办理、挖矿、转账、智能合约的布置和执行等等功用。对于咱们开发者来说,它便是一个开发者工具。Geth是典型的以太坊客户端。Geth这个姓名是Go Ethereum开源项意图简称。它是根据Go言语开发且实现了Ethereum协议的客户端软件。 Geth供给了一个交互式命令操控台,经过命令来操作以太坊的各种功用(API)。> Geth是全节点客户端,会一向同步以太坊区块链上的一切数据。现在数据量现已几十G,不久就会上百G。> 在开发过程中,咱们引荐运用以太坊区块链的私有链Ganache,免去同步以太坊悉数区块数据的费事。在后续的文章中会介绍Ganache。账户以太坊中账户分为两类: * 外部账户(EOA)该类账户被公钥-私钥对操控(用户),没有相关任何代码 外部账户的地址由公钥衍生而来 * 合约账户(CA) 该类账户为智能合约分配的账户,被合约代码操控且有代码与之相关 智能合约的布置会把合约字节码发布到区块链上,并运用一个特定的地址来标示这个合约,这个地址便是为合约账户合约账户存储了代码,外部账户则没有。除了这点之外,这两类账户对于EVM来说都是相同的。合约布置便是将编译好的合约字节码,经过外部账号以发送买卖的形式布置到以太坊区块链网络上(由实践矿工出块之后,才会真实布置成功)。 外部账户与外部账户之间买卖仅仅是转账。可是外部账户到合约账户,是能够激活各种操作的。运转合约布置后,当需求调用这个智能合约的办法时,只需求向这个合约账户发送音讯(买卖)即可,经过音讯触发后智能合约的代码就会在EVM中执行了。GasGas即矿工费。以太坊上每笔买卖的执行(被矿工打包)都会被收取必定数量的gas。gas的意图是约束执行买卖所需的工作量,一起为执行付出费用。当EVM执行买卖时,gas将依照特定规矩被逐渐消耗,不管执行到什么位置,一旦gas被耗尽,将会触发一个 out of gas 异常。当前调用帧所做的一切状况修正都将被回滚。假如执行完毕,还有gas剩下,这些gas将会返还给发送账户。因此,咱们需求一个有以太币余额的外部账户,来为发起的买卖付出gas。假如没有这个约束,就会呈现无法中止(如:死循环)的合约来阻塞以太坊区块链网络gas能够认为是一个工作量单位,智能合约越杂乱(核算步骤的数量、类型、占用的内存等等),所需的gas就越多。gas的最小单位是wei,1eth=10^18wei=10^9gweiGasLimit: 愿意付出矿工费的上限GasPrice: 矿工费单价gas = GasLimit * GasPrice 去中心化运用(Dapp)Dapp全称是Decentralized App。以太坊社区把根据智能合约的运用称为去中心化的运用。假如咱们把区块链了解为一个不可篡改的分布式账本数据库,智能合约了解为和数据库打交道的程序,那就很容易了解Dapp了。一个Dapp不单单有智能合约,还需求有一个友好的用户界面和其他的业务程序。TruffleTruffle是现在最流行的Dapp开发结构,它能够帮咱们处理掉许多繁琐的工作,让咱们更专注于智能合约的开发,迅速开端编码-编译-布置-测验-打包Dapp的流程。总结咱们现在来总结一下。以太坊是渠道,它让咱们便利的运用区块链技能开发去中心化的运用。运用中,咱们能够运用Solidity来编写和区块链交互的智能合约,合约编写好后之后,咱们经过一个有余额的账户将合约布置到以太坊节点上,并运转合约(运用Truffle结构能够更好的协助咱们做这些工作)。为了开发便利,咱们能够用以太坊私有链Ganache来搭建一个测验网络。注:本文中为了便利我们了解,对一些概念做了类比,有些严格来说不是精确。不过我认为对于初学者,也没有必要把每一个概念掌握的很细致和精确。学习是一个逐步深化的过程,许多时候咱们会发现,过一段后,咱们会对同一个东西有不相同的了解。 

    如何成为加VIP用户?

    VIP用户是链客特邀的行业权威和技术大咖,您想成为VIP用户?查看行情>

    如何成为加V用户?

    提升链客指数,即可成为加V用户,等级越高享受权益特权越多查看行情>

    如何成为皇冠用户?

    认证成为讲师,即可成为加冠用户,加冠用户享受诸多权益特权查看行情>

      ·  2019-04-23
    37阅读  ·  0赞赏  ·   0问答
  • 怎么编写一个可晋级的智能合约?

     区块链信赖根底的数据不行修正的特性,让它传统应用程序有一个很大的不同的地方是一经发布于区块链上就无法修正(不能直接在原有的合约上直接修正再从头发布)。写在前面阅览本文前,你应该对以太坊、智能合约及Solidity言语有所了解,假设你还不了解,建议你先看以太坊是什么当智能合约出现bug一方面正式由于智能合约的不行修正的特性,由于只要规矩确认之后,没人能够修正它,大家才能够信赖它。但另一方面,假设规矩的完成有Bug, 可能会形成代币被盗,或是调用消耗很多的gas。这时就需求咱们去修正过错。咱们知道一个智能合约包括两部分: 代码逻辑和数据,而代码逻辑又是最容易出问题的部分, 如在完成如下合约时,由于手抖在写addTe1n()时,10写成了11。12345678910111213pragma solidity ^0.4.18;contract MyContract {    mapping (address => uint256) public balanceOf;        function setBlance(address _address,uint256 v) public {        balanceOf[_address] = v;    }    function addTen(address addr) public returns (uint){        return balanceOf[addr] + 11;    }}假设咱们在布置之后发现了这个问题,想要修正这个bug的话,只好从头布置合约,可是这时会有一个为难的问题,原来的合约已经有很多人运用,假设布置新的合约,老合约的数据将会丢掉。数据合约及操控合约那么怎么解决上面的问题了,一个解决方案是别离合约中的数据,运用一个独自的合约来存储数据(下文称数据合约),运用一个独自的合约写事务逻辑(下文称操控合约)。咱们来看看代码怎么完成。12345678910111213141516171819202122pragma solidity ^0.4.18;contract DataContract {    mapping (address => uint256) public balanceOf;    function setBlance(address _address,uint256 v) public {        balanceOf[_address] = v;    }}contract ControlContract {    DataContract dataContract;    function ControlContract(address _dataContractAddr) public {        dataContract = DataContract(_dataContractAddr);    }    function addTen(address addr) public returns (uint){        return dataContract.balanceOf(addr) + 11;    }}现在咱们有两个合约DataContract 专门用来存数据,ControlContract用来处理逻辑,并利用DataContract来读写数据。经过这样的设计,能够在更新操控合约后坚持数据合约不变,这样就不会丢掉数据,也不必搬迁数据。读写操控经过DataContract咱们能够独自更新合约逻辑,不过你也许发现了一个新的问题,DataContract的数据不仅仅能够被ControlContract读写,还能够被其他的合约读写,因而需求对DataContract增加读写操控。咱们给DataContract增加一个mapping, 用来操控哪些地址能够拜访数据,同时增加了润饰器及设置拜访的办法,代码如下:1234567891011121314151617181920212223242526272829pragma solidity ^0.4.18;contract DataContract {    mapping (address => uint256) public balanceOf;    mapping (address => bool) accessAllowed;        function DataContract() public {        accessAllowed[msg.sender] = true;    }    function setBlance(address _address,uint256 v) public {        balanceOf[_address] = v;    }        modifier platform() {        require(accessAllowed[msg.sender] == true);        _;    }        function allowAccess(address _addr) platform public {        accessAllowed[_addr] = true;    }        function denyAccess(address _addr) platform public {        accessAllowed[_addr] = false;    }}...布置办法如下:1. 先布置DataContract合约2. 运用DataContract合约地址作为布置ControlContract合约的参数3. 用ControlContract合约地址作为参数调用DataContract合约的allowAccess办法。假设需求更新操控合约(如修正了addTen)则从头履行第2-3步,同时对老的操控合约履行denyAccess()。1更多当咱们在完成数据合约时,它包括的逻辑应该越少越好,而且应该是严格测试过的,由于一旦数据合约布置之后,就没法更改。大多数情况下,和用户交互的是DApp, 因而当操控合约晋级之后,需求晋级DApp,使之关联新的操控合约。尽管合约能够经过本文的方式晋级,但咱们仍然要谨慎晋级,由于晋级表示你能够重写逻辑,会降低用户对你的信赖度。本文介绍晋级办法更多的是一种思路,实践项目中可能会对应多个操控合约及数据合约。   

    王某人

    如何成为加VIP用户?

    VIP用户是链客特邀的行业权威和技术大咖,您想成为VIP用户?查看行情>

    如何成为加V用户?

    提升链客指数,即可成为加V用户,等级越高享受权益特权越多查看行情>

    如何成为皇冠用户?

    认证成为讲师,即可成为加冠用户,加冠用户享受诸多权益特权查看行情>

      ·  2019-04-23
    45阅读  ·  0赞赏  ·   0问答
  • 怎么建立以太坊私有链

     今日讲一下怎么建立以太坊私有连,当然了在你阅读这篇文章的时分,最好是有一定基础,比方知道什么是以太坊,什么是私有连,才干更好的去理解这篇文章,关于大神来说或许是小意思拉,关于刚决出的或与有点用呢。go-ethereum客户端装置Go-ethereum客户端通常称为Geth,是一个指令行界面,执行完好的以太节点,其得益于Go语言的多渠道特性,能够在多个渠道运用。能够具体的完成,经过Geth,在以太坊的各种功用都能够去完成,比方账户的编写新建,ether币的转移等。mac中geth装置如下:brew tap ethereum/ethereumbrew install ethereum检查是否装置成功geth --help假如输出一些帮助提示指令,则阐明装置成功。建立私有链以太坊支持自定义创世区块,要运转私有链,、需要定义创世区块,创世区块信息写在一个json格局的配置文件中。json文件内容如下:{  "config": {        "chainId": 10,         "homesteadBlock": 0,        "eip155Block": 0,        "eip158Block": 0    },  "alloc"      : {},  "coinbase"   : "0x0000000000000000000000000000000000000000",  "difficulty" : "0x20000",  "extraData"  : "",  "gasLimit"   : "0x2fefd8",  "nonce"      : "0x0000000000000042",  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",  "timestamp"  : "0x00"} 初始化:写入创世区块准备好创世区块json配置文件后,需要初始化区块链,将上面的创世区块信息写入到区块链中。首先要新建一个目录data0用来寄存区块链数据(其实,这个目录data0就相当于一个根节点。当我们基于genesis.json生成根节点后,其他人就能够来衔接此根节点,然后能进行买卖)。data0目录结构如图所示: 接下来进入privatechain目录中,执行初始化指令:cd privatechaingeth --datadir data0 init genesis.json上面的指令的主体是 geth init,表明初始化区块链,指令能够带有选项和参数,其间–datadir选项后边跟一个目录名,这儿为 data0,表明指定数据寄存目录为 data0, genesis.json是init指令的参数。运转上面的指令,会读取genesis.json文件,根据其间的内容,将创世区块写入到区块链中。假如看到log信息中含有Successfully wrote genesis state字样,阐明初始化成功。初始化成功后的目录如下:其间geth/chaindata中寄存的是区块数据,keystore中寄存的是账户数据。 发动私有链节点初始化完成后,就有了一条自己的私有链,之后就能够发动自己的私有链节点并做一些操作,在终端中输入以下指令即可发动节点:geth --datadir data0 --networkid 1108 console 上面指令的主体是geth console,表明发动节点并进入交互式控制台,–datadir选项指定运用data0作为数据目录,–networkid选项后边跟一个数字,这儿是1108,表明指定这个私有链的网络id为1108。网络id在衔接到其他节点的时分会用到,以太坊公网的网络id是1,为了不与公有链网络抵触,运转私有链节点的时分要指定自己的网络id。运转上面的指令后,就发动了区块链节点并进入了Javascript Console:这是一个交互式的Javascript执行环境,在这儿面能够执行Javascript代码,其间>是指令提示符。在这个环境里也内置了一些用来操作以太坊的Javascript目标,能够直接运用这些目标。 看完了别急,由于还有下一篇,用一句歌里的话就是,欲知后事怎么,请听下回分解。  玩转Javascript Console进入以太坊Javascript Console后,就能够运用里边的内置目标做一些操作,这些内置目标供给的功用很丰厚,比方检查区块和买卖、创立账户、挖矿、发送买卖、布置智能合约等。接下来介绍几个常用功用,下面的操作中,前面带>的表明在Javascript Console中执行的指令。创立账户前面只是建立了私有链,并没有自己的账户,能够在js console中输入eth.accounts来验证:> eth.accounts[]此刻没有账户,接下来运用personal目标来创立一个账户:> personal.newAccount()> Passphrase:> Repeat passphrase:"0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f"Passphrase其实就是暗码的意思,输入两次暗码后,就创立了一个账户。再次执行指令:> personal.newAccount()> Passphrase:> Repeat passphrase:"0x46b24d04105551498587e3c6ce2c3341d5988938"这时分再去看账户,就有两个了。> eth.accounts["0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f", "0x46b24d04105551498587e3c6ce2c3341d5988938"] 账户默认会保存在数据目录的keystore文件夹中。检查目录结构,发现data0/keystore中多了两个文件,这两个文件就对应刚才创立的两个账户,这是json格局的文本文件,能够翻开检查,里边存的是私钥经过暗码加密后的信息。json文件中信息格局如下:{  "address": "4a3b0216e1644c1bbabda527a6da7fc5d178b58f",  "crypto": {    "cipher": "aes-128-ctr",    "ciphertext": "238d6d48126b762c8f13e84622b1bbb7713f7244c2f24555c99b76396fae8355",    "cipherparams": {      "iv": "d0f5a3d3e6c1eeec77bf631bc938725d"    },    "kdf": "scrypt",    "kdfparams": {      "dklen": 32,      "n": 262144,      "p": 1,      "r": 8,      "salt": "70dc72c4eb63bea50f7637d9ff85bb53f6ca8ace17f4245feae9c0bc9abaad82"    },    "mac": "bd7fc0c937c39f1cbbf1ca654c33b53d7f9c644c6dacfeefe1641d2f3decea04"  },  "id": "57803d82-0cd4-4a78-9c29-9f9252fdcf60",  "version": 3}检查账户余额eth目标供给了检查账户余额的办法:> eth.getBalance(eth.accounts[0])> eth.getBalance(eth.accounts[1])现在两个账户的以太币余额都是0,要使账户有余额,能够从其他账户转账过来,或者经过挖矿来获得以太币奖赏。发动&中止挖矿经过miner.start()来发动挖矿:> miner.start(10)其间start的参数表明挖矿运用的线程数。第一次发动挖矿会先生成挖矿所需的DAG文件,这个进程有点慢,等进展到达100%后,就会开端挖矿,此刻屏幕会被挖矿信息刷屏。假如想中止挖矿,而且进展现已到达100%之后,能够在js console中输入miner.stop():留意:输入的字符会被挖矿刷屏信息冲掉,没有关系,只要输入完好的miner.stop()之后回车,即可中止挖矿。挖到一个区块会奖赏5个以太币,挖矿所得的奖赏会进入矿工的账户,这个账户叫做coinbase,默认情况下coinbase是本地账户中的第一个账户:> eth.coinbase"0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f"现在的coinbase是账户0,要想使挖矿奖赏进入其他账户,经过miner.setEtherbase()将其他账户设置成coinbase即可:> miner.setEtherbase(eth.accounts[1])true> eth.coinbase"0x46b24d04105551498587e3c6ce2c3341d5988938"挖到区块以后,账户0里边应该就有余额了:> eth.getBalance(eth.accounts[0])2.31e+21getBalance()回来值的单位是wei,wei是以太币的最小单位,1个以太币=10的18次方个wei。要检查有多少个以太币,能够用web3.fromWei()将回来值换算成以太币:> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')2310发送买卖截止现在,账户一的余额还是0:> eth.getBalance(eth.accounts[1])能够经过发送一笔买卖,从账户0转移10个以太币到账户1:> amount = web3.toWei(10,'ether')"10000000000000000000"> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})Error: authentication needed: password or unlock    at web3.js:3143:20    at web3.js:6347:15    at web3.js:5081:36    at:1:1这儿报错了,原因是账户每隔一段时间就会被锁住,要发送买卖,必须先解锁账户,由于我们要从账户0发送买卖,所以要解锁账户0:> personal.unlockAccount(eth.accounts[0])Unlock account 0x4a3b0216e1644c1bbabda527a6da7fc5d178b58fPassphrase: true输入创立账户时设置的暗码,就能够成功解锁账户。然后再发送买卖:> amount = web3.toWei(10,'ether')"10000000000000000000"> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})INFO [03-07|11:13:11] Submitted transaction                    fullhash=0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6 recipient=0x46B24d04105551498587e3C6CE2c3341d5988938"0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6"我们去检查账户1中的余额:> eth.getBalance(eth.accounts[1])发现还没转过去,此刻买卖现已提交到区块链,但还未被处理,这能够经过检查txpool来验证:> txpool.status{  pending: 1,  queued: 0}其间有一条pending的买卖,pending表明已提交但还未被处理的买卖。要使买卖被处理,必需要挖矿。这儿我们发动挖矿,然后等候挖到一个区块之后就中止挖矿:> miner.start(1);admin.sleepBlocks(1);miner.stop();当miner.stop()回来true后,txpool中pending的买卖数量应该为0了,阐明买卖现已被处理了,而账户1应该收到币了:> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')检查买卖和区块eth目标封装了检查买卖和区块信息的办法。检查当前区块总数:> eth.blockNumber463经过买卖hash检查买卖:> eth.getTransaction("0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6"){  blockHash: "0x1cb368a27cc23c786ff5cdf7cd4351d48f4c8e8aea2e084a5e9d7c480449c79a",  blockNumber: 463,  from: "0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f",  gas: 90000,  gasPrice: 18000000000,  hash: "0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6",  input: "0x",  nonce: 0,  r: "0x31d22686e0d408a16497becf6d47fbfdffe6692d91727e5b7ed3d73ede9e66ea",  s: "0x7ff7c14a20991e2dfdb813c2237b08a5611c8c8cb3c2dcb03a55ed282ce4d9c3",  to: "0x46b24d04105551498587e3c6ce2c3341d5988938",  transactionIndex: 0,  v: "0x38",  value: 10000000000000000000}写了挺多的,还用了两篇来写这个,比较的繁琐,自己写的都是挺累的感觉。当然了,写完了看自己写出来的东西还是挺高兴的毕竟是自己的劳动成果嘛,这两篇讲的就是怎么建立以太的私有链,或许能够跟着我写的自己去写上那么一条之类的,也许写不了了,不过不要紧,希望大家能够一起前进嘛。嘿嘿。    

    penciliso

    如何成为加VIP用户?

    VIP用户是链客特邀的行业权威和技术大咖,您想成为VIP用户?查看行情>

    如何成为加V用户?

    提升链客指数,即可成为加V用户,等级越高享受权益特权越多查看行情>

    如何成为皇冠用户?

    认证成为讲师,即可成为加冠用户,加冠用户享受诸多权益特权查看行情>

      ·  2019-04-23
    48阅读  ·  0赞赏  ·   0问答
  • 分析非同质化代币ERC721-2

    ERC165同样是一个合约规范,这个规范要求合约供给其完成了哪些接口,这样再与合约进行交互的时分能够先调用此接口进行查询。interfaceID为函数选择器,核算方法有两种,如:bytes4(keccak256('supportsInterface(bytes4)'));或ERC165.supportsInterface.selector,多个函数的接口ID为函数选择器的异或值。关于ERC165,这里不深化介绍,有兴趣的同学能够阅览官方提案。可选完成接口:ERC721MetadataERC721Metadata 接口用于供给合约的元数据:name , symbol 及 URI(NFT所对应的资源)。其接口界说如下:12345interface ERC721Metadata /* is ERC721 */ {    function name() external pure returns (string _name);    function symbol() external pure returns (string _symbol);    function tokenURI(uint256 _tokenId) external view returns (string);}接口阐明:name(): 回来合约名字,尽管是可选,但强烈建议完成,即便是回来空字符串。symbol(): 回来合约代币符号,尽管是可选,但强烈建议完成,即便是回来空字符串。tokenURI(): 回来_tokenId所对应的外部资源文件的URI(通常是IPFS或HTTP(S)路径)。外部资源文件需求包含名字、描述、图片,其格式的要求如下:123456789101112131415161718{    "title": "Asset Metadata",    "type": "object",    "properties": {        "name": {            "type": "string",            "description": "Identifies the asset to which this NFT represents",        },        "description": {            "type": "string",            "description": "Describes the asset to which this NFT represents",        },        "image": {            "type": "string",            "description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive.",        }    }} tokenURI通常是被web3调用,以便在使用层做相应的查询和展现。可选完成接口:ERC721EnumerableERC721Enumerable的首要目的是提高合约中NTF的可访问性,其接口界说如下:12345interface ERC721Enumerable /* is ERC721 */ {    function totalSupply() external view returns (uint256);    function tokenByIndex(uint256 _index) external view returns (uint256);    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);}接口阐明:totalSupply(): 回来NFT总量tokenByIndex(): 经过索引回来对应的tokenId。tokenOfOwnerByIndex(): 一切者能够一次具有多个的NFT, 此函数回来_owner具有的NFT列表中对应索引的tokenId。弥补阐明NTF IDsNTF ID,即tokenId,在合约顶用唯一的uint265进行标识,每个NFT的ID在智能合约的生命周期内不允许改动。引荐的完成方法有:从0开端,每新加一个NFT,NTF ID加1使用sha3后uuid 转换为 NTF ID与ERC-20的兼容性ERC721规范尽可能遵从 ERC-20 的语义,但由于同质代币与非同质代币之间的底子差异,并不能彻底兼容ERC-20。交易、挖矿、销毁在完成transter相关接口时除了满意上面的的条件外,咱们能够根据需求增加自己的逻辑,如参加黑名单等。一起挖矿、销毁尽管不是规范的一部分,咱们能够根据需求完成。 我是【链客】六级算力等级《守护平井一夫》 为各位解答区块链技能问题,欢迎参加。链客区块链技能问答社区,有问必答!!国内域名:www.liankexing.com 仿制网址至浏览器即可进入社区国际域名:www.lk.wiki               QQ群: 725414372 

    月花雾

    如何成为加VIP用户?

    VIP用户是链客特邀的行业权威和技术大咖,您想成为VIP用户?查看行情>

    如何成为加V用户?

    提升链客指数,即可成为加V用户,等级越高享受权益特权越多查看行情>

    如何成为皇冠用户?

    认证成为讲师,即可成为加冠用户,加冠用户享受诸多权益特权查看行情>

      ·  2019-04-23
    51阅读  ·  0赞赏  ·   0问答
  • 分析非同质化代币ERC721-1

    什么是ERC-721?现在咱们看到的各种加密猫猫狗狗都是根据ERC-721创造出来的,每只都是一个绝无仅有的ERC-721代币,不过ERC-721在区块链世界远不止猫猫狗狗,它更大的想象空间在于将物理世界的财物映射到区块链上。本文就来分析下什么是ERC721.ERC721是什么和ERC20一样,ERC721同样是一个代币规范,ERC721官方扼要解释是Non-Fungible Tokens,简写为NFTs,多翻译为非同质代币。ERC721 是由Dieter Shirley 在2017年9月提出。Dieter Shirley 正是谜恋猫CryptoKitties背面的公司Axiom Zen的技能总监。因而谜恋猫也是第一个完成了ERC721 规范的去中心化使用。ERC721号提议已经被以太坊作为规范承受,但该规范仍处于草稿阶段。本文介绍的ERC721规范根据最新(2018/03/23官方提议。那怎样了解非同质代币呢?非同质代表绝无仅有,谜恋猫为例,每只猫都被赋予具有基因,是绝无仅有的(一只猫便是一个NFTs),猫之间是不能置换的。这种独特性使得某些稀有猫具有保藏价值,也因而遭到追捧。ERC20代币是可置换的,且可细分为N份(1 = 10 * 0.1), 而ERC721的Token最小的单位为1,无法再分割。假如同一个调集的两个物品具有不同的特征,这两个物品是非同质的,而同质是某个部分或数量能够被另一个同等部分或数量所替代。非同质性其实广泛存在于咱们的日子中,如图书馆的每一本,宠物商店的每一只宠物,歌手所演唱的歌曲,花店里不同的花等等,因而ERC721合约必定有广泛的使用场景。经过这样一个规范,也可建立跨功能的NFTs管理和出售平台(就像有支持ERC20的交易所和钱包一样),使生态愈加强壮。ERC721规范ERC721最为一个合约规范,供给了在完成ERC721代币时有必要要遵守的协议,要求每个ERC721规范合约需求完成ERC721及ERC165接口,接口界说如下:pragma solidity ^0.4.20;interface ERC721 /* is ERC165 */ {    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);    event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);    function balanceOf(address _owner) external view returns (uint256);    function ownerOf(uint256 _tokenId) external view returns (address);        function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;        function approve(address _approved, uint256 _tokenId) external payable;    function setApprovalForAll(address _operator, bool _approved) external;    function getApproved(uint256 _tokenId) external view returns (address);    function isApprovedForAll(address _owner, address _operator) external view returns (bool);}接口阐明:balanceOf(): 回来由_owner 持有的NFTs的数量。ownerOf(): 回来tokenId代币持有者的地址。approve(): 授予地址_to具有_tokenId的控制权,办法成功后需触发Approval 事情。setApprovalForAll(): 授予地址_operator具有一切NFTs的控制权,成功后需触发ApprovalForAll事情。 getApproved()、isApprovedForAll(): 用来查询授权。  safeTransferFrom(): 转移NFT一切权,一次成功的转移操作有必要建议 Transer 事情。函数的完成需求做一下几种检查: 调用者msg.sender应该是当时tokenId的一切者或被授权的地址_from 有必要是 _tokenId的一切者_tokenId 应该是当时合约正在监测的NFTs 中的任何一个_to 地址不该该为 0假如_to 是一个合约应该调用其onERC721Received办法, 并且检查其回来值,假如回来值不为bytes4(keccak256("onERC721Received(address,uint256,bytes)"))抛出异常。一个可接纳NFT的合约有必要完成ERC721TokenReceiver接口:1234interface ERC721TokenReceiver {    /// @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`    function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);} transferFrom(): 用来转移NFTs, 办法成功后需触发Transfer事情。调用者自己承认_to地址能正常接纳NFT,否则将丢失此NFT。此函数完成时需求检查上面条件的前4条。ERC165 规范ERC721规范一起要求有必要契合ERC165规范 ,其接口如下:123interface ERC165 {    function supportsInterface(bytes4 interfaceID) external view returns (bool);}

    月花雾

    如何成为加VIP用户?

    VIP用户是链客特邀的行业权威和技术大咖,您想成为VIP用户?查看行情>

    如何成为加V用户?

    提升链客指数,即可成为加V用户,等级越高享受权益特权越多查看行情>

    如何成为皇冠用户?

    认证成为讲师,即可成为加冠用户,加冠用户享受诸多权益特权查看行情>

      ·  2019-04-23
    56阅读  ·  0赞赏  ·   0问答
  • NEXT社区小课堂 | 第五课:NEO-共识算法dBFT源码解析

    ![](https://www.liankexing.com/Public/Uploads/2019-04-19/5cb98e79cc9c9.png) > NEXT社区 | 小课堂 > > 由于近期NEXT社区加入很多新的小伙伴,有在校大学生,有对区块链感兴趣的传统企业从业者。为了更方便、更系统的让NEXT社区的伙伴们了解NEO的技术知识,因此我们开设了小课堂,每周3节,向大家普及NEO相关的知识要点! > **公众号:NEONEXT** ### NEXT社区小课堂 | 第五课 ### NEO-共识机制dBFT源码解析 --- **一、NEO DBFT共识算法** dbft改进自算法pbft算法,pbft算法通过多次网络请求确认,最终获得多数共识。其缺点在于随着随着节点的增加,网络开销呈指数级增长,网络通信膨胀,难以快速达成一致。neo的解决方案是通过投票选取出一定数量的节点作为记账人,由此减少网络消耗又可以兼顾交易速度,这也是dbft中d的由来。 **二、代码结构说明** ``` ├── Consensus │ ├── ChangeView.cs //viewchange 消息 │ ├── ConsensusContext.cs //共识上下文 │ ├── ConsensusMessage.cs //共识消息 │ ├── ConsensusMessageType.cs //共识消息类型 ChangeView/PrepareRequest/PrepareResponse │ ├── ConsensusService.cs //共识核心代码 │ ├── ConsensusState.cs //节点共识状态 │ ├── PrepareRequest.cs //请求消息 │ └── PrepareResponse.cs //签名返回消息 ``` **三、共识状态变化流程** 1、开启共识的节点分为两大类,非记账人和记账人节点,非记账人的不参与共识,记账人参与共识流程 2、选择议长,Neo议长产生机制是根据当前块高度和记账人数量做MOD运算得到,议长实际上按顺序当选 3、节点初始化,议长为primary节点,议员为backup节点。 4、满足出块条件后议长发送PrepareRequest 5、议员收到请求后,验证通过签名发送PrepareResponse 6、记账节点接收到PrepareResponse后,节点保存对方的签名信息,检查如果超过三分之二则发送 block 7、节点接收到block,PersistCompleted事件触发后整体重新初始化 ![](https://www.liankexing.com/Public/Uploads/2019-04-19/5cb98cd4d08f2.png) **四、共识上下文核心成员** ``` public const uint Version = 0; public ConsensusState State; //节点当前共识状态 public UInt256 PrevHash; public uint BlockIndex; //块高度 public byte ViewNumber; //试图状态 public ECPoint[] Validators; //记账人 public int MyIndex; //当前记账人次序 public uint PrimaryIndex; //当前记账的记账人 public uint Timestamp; public ulong Nonce; public UInt160 NextConsensus; //共识标识 public UInt256[] TransactionHashes; public Dictionary Transactions; public byte[][] Signatures; //记账人签名 public byte[] ExpectedView; //记账人试图 public KeyPair KeyPair; public int M => Validators.Length - (Validators.Length - 1) / 3; //三分之二数量 ``` ExpectedView 维护视图状态中,用于在议长无法正常工作时重新发起新一轮共识。 Signatures 用于维护共识过程中的确认状态。 **五、节点共识状态** ``` [Flags] internal enum ConsensusState : byte { Initial = 0x00, // 0 Primary = 0x01, // 1 Backup = 0x02, // 10 RequestSent = 0x04, // 100 RequestReceived = 0x08, // 1000 SignatureSent = 0x10, // 10000 BlockSent = 0x20, // 100000 ViewChanging = 0x40, //1000000 } ``` **六、代理节点选择** neo的dbft算法的delegate部分主要体现在一个函数上面,每次产生区块后会重新排序资产,选择前记账人数量的节点出来参与下一轮共识 ``` /// /// 获取下一个区块的记账人列表 /// /// 返回一组公钥,表示下一个区块的记账人列表 public ECPoint[] GetValidators() { lock (_validators) { if (_validators.Count == 0) { _validators.AddRange(GetValidators(Enumerable.Empty())); } return _validators.ToArray(); } } public virtual IEnumerable GetValidators(IEnumerable others) { DataCache accounts = GetStates(); DataCache validators = GetStates(); MetaDataCache validators_count = GetMetaData(); ///更新账号资产情况 foreach (Transaction tx in others) { foreach (TransactionOutput output in tx.Outputs) { AccountState account = accounts.GetAndChange(output.ScriptHash, () => new AccountState(output.ScriptHash)); if (account.Balances.ContainsKey(output.AssetId)) account.Balances[output.AssetId] += output.Value; else account.Balances[output.AssetId] = output.Value; if (output.AssetId.Equals(GoverningToken.Hash) && account.Votes.Length > 0) { foreach (ECPoint pubkey in account.Votes) validators.GetAndChange(pubkey, () => new ValidatorState(pubkey)).Votes += output.Value; validators_count.GetAndChange().Votes[account.Votes.Length - 1] += output.Value; } } foreach (var group in tx.Inputs.GroupBy(p => p.PrevHash)) { Transaction tx_prev = GetTransaction(group.Key, out int height); foreach (CoinReference input in group) { TransactionOutput out_prev = tx_prev.Outputs[input.PrevIndex]; AccountState account = accounts.GetAndChange(out_prev.ScriptHash); if (out_prev.AssetId.Equals(GoverningToken.Hash)) { if (account.Votes.Length > 0) { foreach (ECPoint pubkey in account.Votes) { ValidatorState validator = validators.GetAndChange(pubkey); validator.Votes -= out_prev.Value; if (!validator.Registered && validator.Votes.Equals(Fixed8.Zero)) validators.Delete(pubkey); } validators_count.GetAndChange().Votes[account.Votes.Length - 1] -= out_prev.Value; } } account.Balances[out_prev.AssetId] -= out_prev.Value; } } switch (tx) { #pragma warning disable CS0612 case EnrollmentTransaction tx_enrollment: validators.GetAndChange(tx_enrollment.PublicKey, () => new ValidatorState(tx_enrollment.PublicKey)).Registered = true; break; #pragma warning restore CS0612 case StateTransaction tx_state: foreach (StateDescriptor descriptor in tx_state.Descriptors) switch (descriptor.Type) { case StateType.Account: ProcessAccountStateDescriptor(descriptor, accounts, validators, validators_count); break; case StateType.Validator: ProcessValidatorStateDescriptor(descriptor, validators); break; } break; } } //排序 int count = (int)validators_count.Get().Votes.Select((p, i) => new { Count = i, Votes = p }).Where(p => p.Votes > Fixed8.Zero).ToArray().WeightedFilter(0.25, 0.75, p => p.Votes.GetData(), (p, w) => new { p.Count, Weight = w }).WeightedAverage(p => p.Count, p => p.Weight); count = Math.Max(count, StandbyValidators.Length); HashSet sv = new HashSet(StandbyValidators); ECPoint[] pubkeys = validators.Find().Select(p => p.Value).Where(p => (p.Registered && p.Votes > Fixed8.Zero) || sv.Contains(p.PublicKey)).OrderByDescending(p => p.Votes).ThenBy(p => p.PublicKey).Select(p => p.PublicKey).Take(count).ToArray(); IEnumerable result; if (pubkeys.Length == count) { result = pubkeys; } else { HashSet hashSet = new HashSet(pubkeys); for (int i = 0; i < StandbyValidators.Length && hashSet.Count < count; i++) hashSet.Add(StandbyValidators[i]); result = hashSet; } return result.OrderBy(p => p); } ``` **七、议长选择** 在初始化共识状态的时候会设置PrimaryIndex,获知当前议长。原理就是简单的MOD运算。这里有分为两种情况,如果节点正常则直接块高度和记账人数量mod运算即可,如果存在一场情况,则需要根据view_number进行调整。 ``` //file /Consensus/ConsensusService.cs InitializeConsensus方法 if (view_number == 0) context.Reset(wallet); else context.ChangeView(view_number); ``` ``` //file /Consensus/ConsensusContext.cs public void ChangeView(byte view_number) { int p = ((int)BlockIndex - view_number) % Validators.Length; State &= ConsensusState.SignatureSent; ViewNumber = view_number; PrimaryIndex = p >= 0 ? (uint)p : (uint)(p + Validators.Length);//当前记账人 if (State == ConsensusState.Initial) { TransactionHashes = null; Signatures = new byte[Validators.Length][]; } ExpectedView[MyIndex] = view_number; _header = null; } ``` ``` //file /Consensus/ConsensusContext.cs public void Reset(Wallet wallet) { State = ConsensusState.Initial; PrevHash = Blockchain.Default.CurrentBlockHash; BlockIndex = Blockchain.Default.Height + 1; ViewNumber = 0; Validators = Blockchain.Default.GetValidators(); MyIndex = -1; PrimaryIndex = BlockIndex % (uint)Validators.Length; //当前记账人 TransactionHashes = null; Signatures = new byte[Validators.Length][]; ExpectedView = new byte[Validators.Length]; KeyPair = null; for (int i = 0; i < Validators.Length; i++) { WalletAccount account = wallet.GetAccount(Validators[i]); if (account?.HasKey == true) { MyIndex = i; KeyPair = account.GetKey(); break; } } _header = null; } ``` **八、状态初始化** 如果是议长则状态标记为ConsensusState.Primary,同时改变定时器触发事件,再上次出块15s后触发。议员则设置状态为 ConsensusState.Backup,时间调整为30s后触发,如果议长不能正常工作,则这个触发器会开始起作用(具体后边再详细分析)。 ``` //file /Consensus/ConsensusContext.cs private void InitializeConsensus(byte view_number) { lock (context) { if (view_number == 0) context.Reset(wallet); else context.ChangeView(view_number); if (context.MyIndex < 0) return; Log($"initialize: height={context.BlockIndex} view={view_number} index={context.MyIndex} role={(context.MyIndex == context.PrimaryIndex ? ConsensusState.Primary : ConsensusState.Backup)}"); if (context.MyIndex == context.PrimaryIndex) { context.State |= ConsensusState.Primary; if (!context.State.HasFlag(ConsensusState.SignatureSent)) { FillContext(); //生成mine区块 } if (context.TransactionHashes.Length > 1) { //广播自身的交易 InvPayload invPayload = InvPayload.Create(InventoryType.TX, context.TransactionHashes.Skip(1).ToArray()); foreach (RemoteNode node in localNode.GetRemoteNodes()) node.EnqueueMessage("inv", invPayload); } timer_height = context.BlockIndex; timer_view = view_number; TimeSpan span = DateTime.Now - block_received_time; if (span >= Blockchain.TimePerBlock) timer.Change(0, Timeout.Infinite); else timer.Change(Blockchain.TimePerBlock - span, Timeout.InfiniteTimeSpan); } else { context.State = ConsensusState.Backup; timer_height = context.BlockIndex; timer_view = view_number; timer.Change(TimeSpan.FromSeconds(Blockchain.SecondsPerBlock !context.Transactions.ContainsKey(i)).ToArray(); LocalNode.AllowHashes(hashes); InvPayload msg = InvPayload.Create(InventoryType.TX, hashes); foreach (RemoteNode node in localNode.GetRemoteNodes()) node.EnqueueMessage("getdata", msg); } } ``` ``` //file /Consensus/ConsensusContext.cs private bool AddTransaction(Transaction tx, bool verify) { if (Blockchain.Default.ContainsTransaction(tx.Hash) || (verify && !tx.Verify(context.Transactions.Values)) || !CheckPolicy(tx)) { Log($"reject tx: {tx.Hash}{Environment.NewLine}{tx.ToArray().ToHexString()}"); RequestChangeView(); return false; } context.Transactions[tx.Hash] = tx; if (context.TransactionHashes.Length == context.Transactions.Count) { if (Blockchain.GetConsensusAddress(Blockchain.Default.GetValidators(context.Transactions.Values).ToArray()).Equals(context.NextConsensus)) { Log($"send perpare response"); context.State |= ConsensusState.SignatureSent; context.Signatures[context.MyIndex] = context.MakeHeader().Sign(context.KeyPair); SignAndRelay(context.MakePrepareResponse(context.Signatures[context.MyIndex])); CheckSignatures(); } else { RequestChangeView(); return false; } } return true; } ``` **十一、共识达成后广播区块** 其他节点接收到PrepareResponse后,在自己的签名列表中记录对方的签名信息,再检查自己的签名列表是否有超过三分之二的签名了,有则判断共识达成开始广播生成的区块。状态状变为ConsensusState.BlockSent。 ``` private void CheckSignatures() { if (context.Signatures.Count(p => p != null) >= context.M && context.TransactionHashes.All(p => context.Transactions.ContainsKey(p))) { Contract contract = Contract.CreateMultiSigContract(context.M, context.Validators); Block block = context.MakeHeader(); ContractParametersContext sc = new ContractParametersContext(block); for (int i = 0, j = 0; i < context.Validators.Length && j < context.M; i++) if (context.Signatures[i] != null) { sc.AddSignature(contract, context.Validators[i], context.Signatures[i]); j++; } sc.Verifiable.Scripts = sc.GetScripts(); block.Transactions = context.TransactionHashes.Select(p => context.Transactions[p]).ToArray(); Log($"relay block: {block.Hash}"); if (!localNode.Relay(block)) Log($"reject block: {block.Hash}"); context.State |= ConsensusState.BlockSent; } } ``` **十二、Blockchain_PersistCompleted后恢复状态** 区块广播后,节点接收到这个信息,会保存区块,保存完成后触发PersistCompleted事件,最终回到初始状态,重新开始新一轮的共识。 ``` private void Blockchain_PersistCompleted(object sender, Block block) { Log($"persist block: {block.Hash}"); block_received_time = DateTime.Now; InitializeConsensus(0); } ``` **十三、错误分析 如果议长无法完成记账任务** 这种情况下议长在超出时间之后依然无法达成共识,此时议员会增长自身的ExpectedView值,并且广播出去,如果检查到三分之二的成员viewnumber都加了1,则在这些相同viewnumber的节点之间开始新一轮共识,重新选择议长,发起共识。如果此时原来的议长恢复正常,time到时间后会增长自身的viewnumber,慢慢追上当前的视图状态。 ![](https://www.liankexing.com/Public/Uploads/2019-04-19/5cb98e722cb1d.png) **十四、参考** 源码 :[https://github.com/neo-project/neo/tree/master/neo/Consensus) 官方白皮书:http://docs.neo.org/zh-cn/basic/consensus/consensus.html DBFT :https://www.jianshu.com/p/2383c7841d41 作者:魂祭心 原文转自: https://my.oschina.net/hunjixin/blog/1801892 本文来源:NEOFANS 原文链接:http://neofans.org/ ------------ **联系我们** 微博:https://weibo.com/u/6724929880 官网:https://neonext.club/ QQ群:612334080 电报:https://t.me/neonextop twitter:https://twitter.com/NE0NEXT 扫码关注NEO NEXT官方公众号 获取更多一手社区资讯 ▼ ![](https://www.liankexing.com/Public/Uploads/2019-04-19/5cb98e9c6ce2a.jpg)

    NEONEXT

    如何成为加VIP用户?

    VIP用户是链客特邀的行业权威和技术大咖,您想成为VIP用户?查看行情>

    如何成为加V用户?

    提升链客指数,即可成为加V用户,等级越高享受权益特权越多查看行情>

    如何成为皇冠用户?

    认证成为讲师,即可成为加冠用户,加冠用户享受诸多权益特权查看行情>

      ·  2019-04-19
    39阅读  ·  0赞赏  ·   0问答
  • 区块链到底是不是比特币?

    了解区块链首要以我的了解先大约描述下区块链。区块链不是一种技术,它更像是一种架构表现,一种设计理念,或许这个时分加上ajax你会更加好了解一点。在区块链架构理念中,也没有诞生什么新的技术点,完全是将现有的技术杂糅在一起,组合起来达成它要的特色:去中心化,不可修改性(安全性),透明性。举例说明:现在的任何交易,都是经过第三方中心来进行。例如A转账给B,中心便是银行,假如银行过后反悔了,说A没转给B,那么A这笔钱就白花的。去中心化的意义便是干掉这个中心,以免中心出事导致损失。有人就会提问了,没有中心那岂不是B说了算,更加不安全了。那你等我说完,去中心化不代表没了中心,而是把中心涣散,让每个人(矿工)都是中心。于是,就出来了分布式账簿的概念,例如A转给B,这下不是银行记载了,而是A对天大喊,我转账给B了。然后矿工C,D,E,F,G….听见的人立刻拿着小本本记载,A转账给B多少钱,然后加个时刻戳。第一个记载完之后拿给其他矿工看,其他矿工要立马停下手中的作业,承认他记载的是真的,就允许同意(共识算法)。咱们都经过之后,所有矿工的作业就要根据这个账单之后开始作业,构成链条。而这个被承认的账单也要追加公开在布告栏上,发布与众。而写这个账单的人,会取得必定的体系奖励(在有限的体系奖励完之后,可以收取交易方的手续费)。这儿记载的方式说明下,传统咱们记载数据,都是记载总额,增删数字,这儿记载则是选用每次转账的数据,在需求总额的时分再去计算,每次操作只能根据上一个区块(hash指向),所以不能修改。51%攻击在区块链概念中,数据是绝对安全的吗,有人提出过51%算法攻击这个概念。首要咱们得弄清楚一点,中本聪(比特币创始人)说:小组不该该以线性方式安排账簿,而应该以树状安排账簿,任何时刻,都以当时最长分支作为主账簿,可是保留其它分支。也便是说如果在矿工记载账本的时分,有人恶意捣乱,把A转B的记载改成A转C。并且时刻戳什么的其他信息都是完全合法的,那么A-B,A-C两个账本都会记载,在上一个区块后构成分叉。然后接下来看下一个事情的hash指向哪个分叉,就跟在哪个分叉后边,以长的为主,短的会消失在时刻长河里。1区块链的运用现在了解到各大企业也都在成立了区块链实验室。不得不否则,区块链的概念确实是一种新的,好的概念,对于应用在各种不局限于金融的范畴将会发生重大的变革。可是抛开崇奉,咱们来论实践,区块链概念需求的强壮算力,以现在的水平完全达不到要求。为什么?一个企业需求支撑的用户群百万千万计,一个交易耗时上天的体系,就算客户能忍耐,企业自身都无法忍耐这耗时带来的经济损失,所以现在区块链的运用除了出数字钱银拿来炒作,便是猫猫狗狗的数字宠物,一个概念,炒作无实践价值。 

    波bobo

    如何成为加VIP用户?

    VIP用户是链客特邀的行业权威和技术大咖,您想成为VIP用户?查看行情>

    如何成为加V用户?

    提升链客指数,即可成为加V用户,等级越高享受权益特权越多查看行情>

    如何成为皇冠用户?

    认证成为讲师,即可成为加冠用户,加冠用户享受诸多权益特权查看行情>

      ·  2019-04-19
    46阅读  ·  0赞赏  ·   0问答
  • 区块链共同机制及其迭代

    共同,Consensus,故名思义,共同的认识,共同问题研讨的便是多个成员如何达到共同,典型的比如投票选举。区块链是一种去中心化的分布式账本体系,区块链的共同问题实际上来源于分布式体系的共同性问题。分布式共同性问题区块链是一种去中心化的分布式账本体系,由于点对点网络下存在较高的网络延迟,各个节点所观察到的买卖业务先后顺序不或许完全共同。 因而区块链体系需求规划一种机制对在必定的时间内发生的业务的先后顺序进行共同。这种对一个时间窗口内的业务的先后顺序达到共同的算法被称为“共同机制”。共同机制在区块链中扮演着中心的位置,共同机制决议了谁有记账的权力,以及记账权力的选择进程和理由。不必的虚拟钱银选用共同机制不同,常见的共同机制如POW,POS,DPOS,拜占庭容错等。比特币区块链选用了 Proof of Work(PoW)的机制来完成共同,该机制于 1998 年在 B-money 规划中提出。现在,Proof of 系列中比较出名的共同性协议包含 PoW 和 PoS,都是经过经济赏罚来约束歹意参加。POW 工作量证明工作量证明,Proof of Work,经过计算来猜想一个数值(nonce),得以处理规则的 hash 问题(来源于 hashcash)。保证在一段时间内,体系中只能呈现少量合法提案。在比特币的区块结构中,nonce数值被保存在区块头中。一起,这些少量的合法提案会在网络中进行广播,收到的用户进行验证后会依据它认为的最长链上持续难题的计算。因而,体系中或许呈现链的分叉(Fork),但终究会有一条链成为最长的链。hash 问题具有不可逆的特色,因而,现在除了暴力计算外,还没有有用的算法进行处理。反之,如果获得符合要求的 nonce,则阐明在概率上是支付了对应的算力。谁的算力多,谁最早处理问题的概率就越大。当把握超越全网一半算力时,从概率上就能控制网络中链的走向。这也是所谓 51% 进犯 的由来。参加 PoW 计算比赛的人,将支付不小的经济本钱(硬件、电力、维护等)。当没有成为首个算出的“幸运儿”时,这些本钱都将被淹没掉。这也保障了,如果有人歹意损坏,需求支付很多的经济本钱。也有规划企图将后算出成果者的算力依照必定比例折合进下一轮比赛考虑。有一个很直观的例子可以阐明为何这种经济博弈模式会确保体系中最长链的仅有。超市付款需求排成一队,或许有人不守规矩要插队。超市管理员会检查部队,认为最长的一条部队是合法的,并让不合法的分叉部队从头排队。只要大部分人不傻,就会自觉在最长的部队上排队。长处:完全去中心化节点自在进出,简单完成。损坏体系花费的本钱巨大缺陷:对节点的功能网络环境要求高无法达到终究共同性最关键的,糟蹋动力POS 权益证明权益证明,Proof of Stake,2013 年被提出,最早在 Peercoin 体系中被完成,相似现实生活中的股东机制,拥有股份越多的人越简单获取记账权。典型的进程是经过保证金(代币、资产、名声等具备价值属性的物品即可)来对赌一个合法的块成为新的区块,收益为典当本钱的利息和买卖服务费。提供证明的保证金(例如经过转账钱银记录)越多,则获得记账权的概率就越大。合法记账者可以获得收益。POS是依据钱包里边钱银的多少以及钱银在钱包里存在的天数来组成一个单位(币天)。它依据币天的关系对计算机进行哈希计算降低了难度,降低了计算机的门槛,可是对计算机还是有必定要求的,它把钱包和区块链体系的共同性绑定在一起。谁的钱包里的币天数越大谁拥有记账权的概率就越大。可是它和POW机制相同处理问题的思想也导致了它与POW拥有相同的缺陷,也是牺牲了一部分的共同(同样分叉),而且需求等待多个确认。PoS 是企图处理在 PoW 中很多资源被糟蹋的缺陷。歹意参加者将存在保证金被罚没的风险,即丢失经济利益。一般的,对于 PoS 来说,需求把握超越全网30%的资源,才有或许左右终究的成果。这个也很简单理解,三个人投票,前两人别离支持一方,这时候,第三方的投票将决议终究成果。长处:对节点功能要求低,达到共一起间短(网络环境好的话可完成毫秒级)缺陷:没有终究共同性以太坊前三个阶段,即Frontier(前沿)、Homestead(家园)、Metropolis(大都会)。第四个阶段,即Serenity(安静),将选用PoS机制。Casper:以太坊前三个阶段选用的是POW共同机制,第四个阶段将选用自己创建的POS机制,名为投注共同。这种机制增加了赏罚机制,并依据POS的思想在记账节点中选取验证人。DPOS 委托股权证明机制PoS 也有一些改进的算法,包含授权股权证明机制(DPOS),即股东们投票选出一个董事会,董事会中成员才有权进行署理记账。代表新型智能合约的EOS选用DPOS(Delegated Proof of Stake)委托股权证明机制。DPOS经过必定程度的中心化,拥有了中心化体系的功能优势。中本聪设想的一cpu一票的区块链世界里,每个人都能积极参加到区块链中,这样才干完成完全去中心化的体系。可是现实生活中每个人都参加决议计划功率往往不高,这才呈现代表大会准则。DPOS网络中的每个持有代币的人(即每个客户端)都有权选出自己的代表,让为数不多的代表们来维护区块链网络的运转,每个区块由随机的代表轮番负责挖出。这使得区块的发生只需求被更少量量的节点查验和确认,大大提高了网络运转速度。最重要的是这些代表权力平等,并时间遭到监督,如果由于计算不稳定,常常不在线,就会被持币者们自动踢出由新的代表所替代。而体现可靠的代表们也能稳定地收取区块中的买卖手续费。

    江南烟雨

    如何成为加VIP用户?

    VIP用户是链客特邀的行业权威和技术大咖,您想成为VIP用户?查看行情>

    如何成为加V用户?

    提升链客指数,即可成为加V用户,等级越高享受权益特权越多查看行情>

    如何成为皇冠用户?

    认证成为讲师,即可成为加冠用户,加冠用户享受诸多权益特权查看行情>

      ·  2019-04-19
    27阅读  ·  0赞赏  ·   0问答
  • 区块链之比特币的潜在鼓励

     比特币,这个建立在开放P2P(点对点)网络结构之上的货币(文献9),继续享受人们的追捧。比特币体系是“无答应的”——任何人都能够挑选加入网络,转账,甚至参加授权买卖。比特币安全的要害之处在于它能够抵御攻击者以多重虚假身份加入体系的操作行为。毕竟,任何人都能够下载比特币的源代码,成为一个比特币节点,并根据需要为网络增加尽或许多的核算机,而无需向其他人标明其身份。为了处理这个问题,该协议要求加入体系的节点展示出 “作业量证明”:付出算力破解密码学难题以获得参加比特币协议的资历。 从事这种“作业量证明”的节点被称为矿工。体系向矿工奖励比特币作为作业量的“证明”,从而也为这样的“算力出资”设定了“鼓励机制”。经过在自己电脑上运转软件就能够获利(比特币)——这带来的第一个也是最明显的影响是:一旦比特币具有足够的价值,人们就开端大举挖矿。事实上,为了增强挖矿力度,大部分挖矿作业很快都转移到专用的核算机农场。这些核算机农场使用定制工具来实现其意图:开端,GPU被用于大规模并行工挖矿;之后,特需设计的芯片——专门针对比特币中心协议核算特征而量身定制的芯片——ASICs(专用集成电路)开端出现(在挖矿时, ASICs机器比一般PC快一百万倍)。比特币网络迅速发展并变得更加安全,为了获利的竞争也变得更加剧烈(利益由比特币协议周期性放出)。 比特币的安全性和经济性是相互效果的。在评论这个主题之前,让我们快速回顾协议本身的规矩——正是这些规矩发生了这种杂乱的相互效果。  1 比特币协议快速入门(A Quick Primer on the Bitcoin Protocol)持有比特币并期望转账的用户能够将买卖信息(经过他们安装在核算机或智能手机上的软件)发送到比特币网络上的一个节点。比特币网络中的活泼节点从用户那里收集这些买卖信息并将它们分发到网络中的对等节点——分发方式是每个节点仅通知那些与请求转账所关联的节点。买卖信息被批量的汇聚,称为区块,而区块又被链接在一起形成区块链,从而形成一切被承受的比特币买卖记录。区块链中的每个区块都经过一个加密哈希值(实际上也是前驱区块的仅有标识符)引证其前驱区块。比特币网络中的每个节点都保存着完好的区块链副本。区块创立的过程被称为挖矿,挖矿的效果之一相当于新币的印刷,也就是所谓的造币。 比特币的协议规矩使区块的创立十分困难:只有当区块包括密码学难题的答案时,才被认为是合法的。作为酬劳,每逢矿工成功创立区块时,他们都会得到比特币奖励。酬劳由两部分组成:一部分是新造比特币,一部分是从区块所包括的买卖中抽取的挖矿手续费。现在的造币率是12.5比特币每区块,这一数额大约每四年折半。随着这一数额的削减,比特币开端越来越依赖挖矿手续费来付出矿工。 因而比特币运转的要害是让一切节点就区块链的内容(区块链记录体系内的一切转账信息)达成一致。因而,区块更新会迅速传播到网络中的一切节点。不过,节点有时或许会收到两个不同版别的区块链。例如,如果两个节点同时创立了一个区块,则它们或许会持有区块链的两个不同更新(链的增加chang)。这些区块或许包括不同的付出操作,因而比特币体系必须决定要承受哪个版别。 比特币协议规定每个节点只承受最长链作为买卖事情的正确版别(主链),如图1所示(更确切地说,节点挑选包括最多累积核算作业的链作为主链,这通常也是最长链)。这条著名的“最长链规矩”为比特币提供了安全性。一个攻击者——如果企图愚弄其他节点,让他们相信体系发生了不同的付出事情——需要发生比网络其余部分更长的区块链。由于“作业量证明”是一个区块一个区块的创立出来的,“发生更长区块链”的使命将是与众不同的困难。事实上,只需攻击者的核算能力低于整个比特币网络的总和,区块链中的区块和买卖将越来越难以取代(由于攻击者和整个比特币网络的链一起增加chang)。 

    LBL

    如何成为加VIP用户?

    VIP用户是链客特邀的行业权威和技术大咖,您想成为VIP用户?查看行情>

    如何成为加V用户?

    提升链客指数,即可成为加V用户,等级越高享受权益特权越多查看行情>

    如何成为皇冠用户?

    认证成为讲师,即可成为加冠用户,加冠用户享受诸多权益特权查看行情>

      ·  2019-04-19
    30阅读  ·  0赞赏  ·   0问答
  • 区块链将重新定义世界

     区块链技能被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技能。 如果说蒸汽机释放了人们的生产力,电力处理了人们基本的日子需求,互联网彻底改变了信息传递的方法,那么区块链作为构造信赖的机器,将可能彻底改变整个人类社会价值传递的方法。区块链是分布式数据存储、点对点传输、一致机制、加密算法等核算机技能的新式使用形式。所谓一致机制是区块链系统中实现不同节点之间建立信赖、获取权益的数学算法.意义狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方法组合成的一种链式数据结构, 并以密码学方法确保的不可篡改和不可假造的分布式账本。广义来讲,区块链技能是使用块链式数据结构来验证与存储数据、使用分布式节点一致算法来生成和更新数据、使用密码学的方法确保数据传输和拜访的安全、使用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式根底架构与核算范式。区块链技能带来的三大巨变榜首:机器信赖 第二:价值传递 第三:智能合约开展区块链诞生自中本聪的比特币,自2009年以来,出现了各式各样的类比特币的数字钱银,都是根据公有区块链的。数字钱银的现状是百家争鸣,列出一些常见的:bitcoin、litecoin、dogecoin、dashcoin,除了钱银的使用之外,还有各种衍生使用,如Ethereum、Asch等底层使用开发平台以及NXT,SIA,比特股,MaidSafe,Ripple等行业使用。2016年1月20日,中国人民银行数字钱银研讨会宣告对数字钱银研讨取得阶段性效果。会议肯定了数字钱银在下降传统钱银发行等方面的价值,并表明央行在探索发行数字钱银。中国比特币交易平台火币网创始人李林表明,中国人民银行数字钱银研讨会的表达大大增强了数字钱银行业决心。这是继2013年12月5日央行五部委发布关于防备比特币风险的通知之后,榜首次对数字钱银表明明确的情绪。2016年12月20日,数字钱银联盟——中国FinTech数字钱银联盟及FinTech研讨院正式筹建,火币是联合发起单位之一。可以用区块链的一些领域可所以:▪ 智能合约▪ 证券交易▪ 电子商务▪ 物联网▪ 社交通讯▪ 文件存储▪ 存在性证明▪ 身份验证▪ 股权众筹咱们可以把区块链的开展类比互联网自身的开展,未来会在internet上形成一个比如叫做finance-internet的东西,而这个东西便是根据区块链,它的前驱便是bitcoin,即传统金融从私有链、行业链动身(局域网),bitcoin系列从公有链(广域网)动身,都表达了同一种概念——数字资产(DigitalAsset),终究向一个中心平衡点收敛。区块链的进化方法是:▪ 区块链1.0——数字钱银▪ 区块链2.0——数字资产与智能合约▪ 区块链3.0——DAO、DAC(区块链自洽安排、区块链自洽公司)–>区块链大社会(科学,医疗,教育etc,区块链+人工智能)。区块链是个超级平台第1大特性:接近于零的信赖本钱。 第2大特性:构造和交易资产的边际本钱趋近于零。  

    皮皮皮卡丘

    如何成为加VIP用户?

    VIP用户是链客特邀的行业权威和技术大咖,您想成为VIP用户?查看行情>

    如何成为加V用户?

    提升链客指数,即可成为加V用户,等级越高享受权益特权越多查看行情>

    如何成为皇冠用户?

    认证成为讲师,即可成为加冠用户,加冠用户享受诸多权益特权查看行情>

      ·  2019-04-19
    38阅读  ·  0赞赏  ·   0问答