建议和反馈

请填写你的反馈内容

感谢您对链客的信任!

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

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

  • 函数的概念

    什么是函数函数是执行特定任务的代码块。 函数的声明go语言至少有一个main函数 语法格式: func funcName(parametername type1, parametername type2) (output1 type1, output2 type2) {//这里是处理逻辑代码//返回多个值return value1, value2}func:函数由 func 开始声明funcName:函数名称,函数名和参数列表一起构成了函数签名。parametername type:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。output1 type1, output2 type2:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。上面返回值声明了两个变量output1和output2,如果你不想声明也可以,直接就两个类型。如果只有一个返回值且不声明返回值变量,那么你可以省略包括返回值的括号(即一个返回值可以不声明返回类型)函数体:函数定义的代码集合。 函数的使用示例代码: package main import "fmt" func main() {   /* 定义局部变量 */   var a int = 100   var b int = 200   var ret int    /* 调用函数并返回最大值 */   ret = max(a, b)    fmt.Printf( "最大值是 : %d\n", ret )} /* 函数返回两个数的最大值 */func max(num1, num2 int) int {   /* 定义局部变量 */   var result int    if (num1 > num2) {      result = num1   } else {      result = num2   }   return result } 运行结果:最大值是 : 200 二、函数的参数 参数的使用形式参数:定义函数时,用于接收外部传入的数据,叫做形式参数,简称形参。 实际参数:调用函数时,传给形参的实际的数据,叫做实际参数,简称实参。 函数调用:  A:函数名称必须匹配  B:实参与形参必须一一对应:顺序,个数,类型 可变参 Go函数支持变参。接受变参的函数是有着不定数量的参数的。为了做到这点,首先需要定义函数使其接受变参: func myfunc(arg ...int) {}arg ...int告诉Go这个函数接受不定数量的参数。注意,这些参数的类型全部是int。在函数体中,变量arg是一个int的slice: for _, n := range arg {fmt.Printf("And the number is: %d\n", n)}示例代码: package main import "fmt" func main() {    /*    可变参数:如果一个函数的参数,类型确定,但是个数不确定,使用可变参数。            个数:0-多个    语法格式:可变参数:        参数名 ... 数据类型    注意事项:        A:一个函数最多只能有一个可变参。        B:如果形参列表中,除了可变参数,还有其他的参数,那么可变参数写在最后。     */    r1 := getSum(1, 2)    fmt.Println(r1)    r2 := getSum(1, 2, 3, 4, 5)    fmt.Println(r2)     //Println(),的参数就是可变参    fmt.Println(1, 2, 3, 4, 5, 6)    s1 := make([]int, 3, 10) //创建一个切片,长度为0,容量为10。    fmt.Println(s1)    //append(),可以向切片中添加多个数据,参数也是可变参    s1 = append(s1, 1, 2, 3, 4)    fmt.Println(s1)     s2 := []int{7, 8, 9}    s1 = append(s1, s2...)    fmt.Println(s1)     s3 := [] int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}    r3 := getSum(s3...)    fmt.Println(r3) } //用于求0-多个int类型的数值的总和。func getSum(nums ... int) int {    //fmt.Printf("%T\n",nums)    sum := 0    for i := 0; i < len(nums); i++ {        sum += nums[i]    }    return sum} 运行结果: 3151 2 3 4 5 6[0 0 0][0 0 0 1 2 3 4][0 0 0 1 2 3 4 7 8 9] 参数传递go语言函数的参数也是存在值传递和引用传递 函数运用场景 值传递 package main import (   "fmt"   "math") func main(){   /* 声明函数变量 */   getSquareRoot := func(x float64) float64 {      return math.Sqrt(x)   }    /* 使用函数 */   fmt.Println(getSquareRoot(9)) } 引用传递 这就牵扯到了所谓的指针。我们知道,变量在内存中是存放于一定地址上的,修改变量实际是修改变量地址处的内存。只有add1函数知道x变量所在的地址,才能修改x变量的值。所以我们需要将x所在地址&x传入函数,并将函数的参数的类型由int改为*int,即改为指针类型,才能在函数中修改x变量的值。此时参数仍然是按copy传递的,只是copy的是一个指针。请看下面的例子 package mainimport "fmt"//简单的一个函数,实现了参数+1的操作func add1(a *int) int { // 请注意,*a = *a+1 // 修改了a的值return *a // 返回新值} func main() {x := 3fmt.Println("x = ", x) // 应该输出 "x = 3"x1 := add1(&x) // 调用 add1(&x) 传x的地址fmt.Println("x+1 = ", x1) // 应该输出 "x+1 = 4"fmt.Println("x = ", x) // 应该输出 "x = 4"}传指针使得多个函数能操作同一个对象。传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大的结构体。如果用参数值传递的话, 在每次copy上面就会花费相对较多的系统开销(内存和时间)。所以当你要传递大的结构体的时候,用指针是一个明智的选择。Go语言中slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。(注:若函数需改变slice的长度,则仍需要取地址传递指针) 
    月月月  ·  2019-02-22
    0阅读  ·  0赞赏  ·   0问答
  • 超级账本由来

     1.1.1 超级账本的由来当你拿起这本书开始阅读的时候,说明你对区块链技术已经有了相关的了解,而且想通过自己的努力或团队合作的方式能够开发出一款真正的基于区块链技术的落地应用。那么,恭喜你,你的选择是正确且明智的。超级账本(Hyperledger)项目是区块链技术中第一个面向企业应用场景的开源分布式账本平台。 2015年12月由 Linux基金会主导并牵头, IBM、Intel、Cisco等金融,银行,物联网,供应链,制造和科技等行业的巨头共同宣布了Hyperledger联合项目成立。 超级账本将区块链技术引入到联盟链的应用场景中,为未来基于区块链技术打造高效率的商业网络打下基础。 超级账本项目为透明、公开、去中心化的企业级分布式账本技术提供开源参考实现。目前已加入的成员超过260家知名企业或机构。 国外如:IBM、Intel、Cisco、ORACLE、RedHat、SAMSUNG、FUJITSU、AIRBUS等知名IT、制造、服务企业 国内如:Baidu、小米、腾讯、Lenovo、华为、浪潮、京东、迅雷、房掌柜、中国民生银行、招商银行、保全网等IT、金融、房地产等各行业的相关企业及机构成为Hyperledger企业会员。 Hyperledger官网地址: https://www.hyperledger.org 1.1.2 超级账本分类在Hyperledger这个大家庭中,超级账本项目可以分为两大类别: 框架项目:区块链应用开发平台,提供企业级应用程序开发环境及相关的SDK。 实用工具:区块链应用测试、部署、管理等工作的相关工具。 1.1.2.1 框架项目Fabric: 用模块化架构作为开发区块链程序或解决方案的基础,允许一些部件例如共识算法和成员服务都可实现即插即用。 Iroha: 由Soramitsu,Hitachi,NTT Data和Colu提供,使用C++编写,采用拜占庭容错一致性算法实现共识,是为了将分布式账本技术简单容易地与基础架构型项目集成而设计的一个区块链框架项目。应用程序可以使用用Python,Java,JavaScript和C ++以及Android和iOS移动平台编写 Sawtooth: 是一个创建、部署和运行分布式账本的模块化平台。它包含一个新奇的共识算法,叫做经历时间证明 (Proof of Elapsed Time,简写PoET), 面向大型分布式验证器群,消耗最少的资源。 Burrow: 由Monax提供,由英特尔共同赞助;是一个支持许可的智能合约机,该系列的第一个版本发表于2014年12月。Burrow提供了一个模块化的区块链客户端,内置一个经许可的智能合约解释器,它部分是为以太坊虚拟机(EVM)规范而开发的。 Indy: 是特别为去中心化的身份而建立的一种分布式账本。它提供了基于区块链或者其它分布式账本互操作来创建和使用独立数字身份的工具、代码库和可以重用的组件。 1.1.2.2 实用工具Explorer: 由IBM、Intel和DTCC提供; 可以查看、调用、部署或查询区块、交易和相关数据、网络信息、链码和交易序列,以及账本中的其他相关信息。 Composer: 是一个构建区块链商业网络的协作工具,用来加速智能合约的开发以及在分布式账本的部署; 使用JavaScript构建。 Cello:由IBM提供,赞助商来自Soramitsu、华为和英特尔; 旨在给区块链生态系统带来按需部署服务的模式,减少创建、管理、终止区块链的难度。 Caliper: 由华为、Hyperchain、Oracle、Bitwise、Soramitsu、IBM和布达佩斯技术与经济大学的开发人员提供; 是一个区块链基准工具,内置一套预定义的测试用例,让使用者可以测试特定区块链执行的性能。 1.1.3 认识Hyperledger FabricHyperledger Fabric是一个区块链的实现,由Digital Asset和IBM提供;是Linux基金会托管的Hyperledger项目之一。Fabric从诞生之初就立志要成为超级账本中最优秀的项目(现实也确实如此)。 作为开发具有模块化架构的应用程序或解决方案的基础,Hyperledger Fabric实现了组件(例如共识、成员服务)的即插即用。 Hyperledger Fabric利用容器技术来托管称为“链码”的智能合约,其中包含系统的应用程序逻辑。 与其他区块链技术类似,Hyperledger Fabric使用智能合约操作账本,并且是一个通过所有参与者管理交易的系统。 Hyperledger Fabric与其他公有区块链系统最大的不同主要体现在以下两个方面: 私有许可私有:Hyperledger Fabric提供了建立channel的功能,允许参与者为交易新建一个单独的账本。参与者并不希望所有的交易信息(比如提供给部分客户的特定价格信息)都对网络中所有参与者公开。只有在同一个channel中的参与者,才会拥有该channel中的账本,而其他不在此channel中的参与者则无权查看到这个账本的相关信息。 许可:与开放无需许可的网络系统允许未知身份的参与者加入不同网络(需要通过工作量证明协议来保证交易有效并维护网络的安全),Hyperledger Fabric通过Membership Service Provider(MSP)来登记所有的成员。 
    CNXNC  ·  2019-02-22
    0阅读  ·  0赞赏  ·   0问答
  • 【江逸老师】:2.22 BTC目前小幅回落,剑指中长线多头目标!

    我们不要总是站在旁边羡慕他人成功,其实成功一直都在你身边。只要你还有生命,还有能创造奇迹的双手和大脑,就没有理由当过客,更没有理由去抱怨失败。聪明的人,就会一味向前看,而智慧人,事事向后看;所有聪明人,是战胜别人的人;而智慧人,是战胜自己的人。修心要当以净心为要,投资要当用慧眼远眺,不要眼界的格局太小,接下来,让我们回到盘面上面来。比特币BTC行情分析1. 由于盘中较大,且是市场的风向标,很理解为什么比特币的多头走势会不流畅。昨天下午假突破4000之后又假突破3900,上下扫短线客的止损位。这也说明市场分歧较为严重。 2. 4000的价位前整理时间不够,这也是大饼为什么迟迟没有突破的主要原因。 3. 目前大饼仍然在巩固多头阵地。如果再整理1-2天就更加完美。届时一鼓作气突破4000。观点:做多 止损:3870以太坊ETH行情分析以太坊昨天形似构建了一个矩形的整理平台(如下图)。昨天辣条带动的下跌并没有让以太坊的砸到140支撑位置。在142左右多头即开始入场接盘,这表明价格强度非常不错。 整体来看,以太坊的上升三角形形态即将完成,且逐步缩量,这是一个强烈看涨的中继形态。如果多头发力,那么冲破150之后的空间将会是比较大。 观点:做多 阻力位:150 支撑位:142柚子币EOS行情分析见图,不需要多少分析,4刀很快就到。 观点:看涨投资这座山,原本没有顶、没有头。不要站在旁边羡慕他人成功,其实成功一直都在你身边。只要你还有生命,还有能创造奇迹的双手,就没有理由当过客,更没有理由去抱怨失败。聪明的人,一味向前看,智慧人,事事向后看;聪明人,是战胜别人的人;智慧人,是战胜自己的人。修心要当以净心为要,投资要当用慧眼远眺。稳健投资之道,千万别想一夜暴富,积小胜为大胜,才是正确的投资心态。古人云:不积跬步无以至千里,千里之行始于足下,大海虽然浩瀚,也是有无数个小水滴组成的。文/江逸老师官微:BTC468指导QQ群:823931195(备注777,无验证不通过)
    江逸老师  ·  2019-02-22
    0阅读  ·  0赞赏  ·   0问答
  • STO科普,一个低配版的上市新方式

    一年以来,加密货币市场持续走低,监管一直是逃不掉的话题,随着 ICO 的低迷,应监管而生的 STO(证券型代币发行,英文名:Security Token Offering)为资本市场领域带来了新气象,也为乱象频生的 ICO 市场找到了出路。可以说,STO 为监管部门入场带来了机会,也为投资者提供了一种相对可靠的投资方式。本文将会全面地介绍 STO 以及现状一、什么是 STO?STO 全称是 Security Token Offering,即:证券型通证发行。其中,ST(Security Token)指证券型通证,可以用来代替股票、债券等资产标的,并且与传统资产中的股权、债权、不动产等挂钩。我们可以这样理解:STO 是在符合监管要求的情况下,以实资资产为基础,在正规交易所把实际资产的所有权和信息上链,以通证为载体,进行证券发行。很多人将 STO 对标 ICO,将其形容为“合法的 ICO”、“披着证券外衣的 ICO”,这样的形容是不对的,倒不如说它更像是 IPO 与 ICO 的交集,是一种“符合法律法规监管,在法律放行的情况下发行的链上股票”,它不仅具有证券属性,受到证券机构(如:美国 SEC)与相关证券法律法规的监管,同时还能够以“上链”的方式发行。STO 必须与现实世界实资资产对标,并且通过监管和资质审查一关,它的投资门槛比 ICO 高,因此安全系数也更高;而它的发行门槛相比 IPO 较低,但交易便利性却因其通证化而大大增强。STO 处于数字资产和传统资产的交叉领域,一方面此类数字 Token 与实资资产挂钩,另一方面它又是一种权益证明,使持有者能够获得持有收益。二、STO 的特点STO 自出现以来就被寄予厚望,自然是有它的独特之处,同时我们也不能忽略它存在的问题,下面小K君一一列举一下它的优点和风险:(一)优点1、具备合法合规性,使资产数字化“有法可依”STO 的审查需要证券机构的合规审查,包括项目代码,以防出现严重漏洞造成投资人损失;项目本身的合规审查,看项目涉及行业是否符合法律法规;团队成员的背景调查;通证对应的实物资产调查,公司利润情况等背书。2、资产的公开发行成本更低、效率更高证券通证发行可以用来标记许多资产、商品和金融工具。意味着规模较小的公司有机会迅速从全球投资者中募集资金,还不用承担巨额成本,尤其是法律费用。3、解决资产的流动性问题由于发行 STO 的门槛的降低,使得大量资产可以在资本市场登陆和交易,从而增加了资产变现流通的渠道。同时,代币的无限切割使得资产的购买门槛越来越低,普通大众可以参与投资。4、对应资产广泛STO 的可应用领域非常广泛,知识产权、股权、房地产所有权、美术作品及音乐版权等传统资产都可以用来做 STO,从而大大突破传统意义上对权利分割和归属的确认。(二)风险1、有中心化体系的弊端STO 目前仍然受各个国家、地区监管框架下的法律监管,由于各个国家、地区对监管的要求不同,导致原本应该具备全球流通特性的通证系统难以突破跨境这一难关。2、现实状况监管严格,实用性难落实现在的法律框架下,依然有很多法规将其视为 ICO 同类,即使对美国等已经将 STO 纳入监管的国家而言,STO 的合格投资者资格也被严格要求。此外,由于审查过程严格,发行的通证也有可能存在锁定期以便审查,从而造成交易的延迟性,使流通的便捷大打折扣。三、STO 近期状况基于以上,目前看来各个地方对待 STO 的态度也很有出入:(一)中国2018 年 12 月 1 日,北京金融监管局局长霍学文在某会议上告诫:“STO 从业者,如果在北京开展活动,政府将视同非法金融活动予以驱离。”所以投资者目前无法在中国大陆合法投资 STO。(二)中国香港香港地区比较折中,今年 11 月,香港证监会宣布将会把加密货币交易所纳入“监管沙盒”,即在试验田监管范围内可以稍作尝试,在此期间,香港证监会也会探索加密货币交易所的运作情况。而香港监证会官网发布的《有关针对虚拟资产投资组合的管理公司、基金分销商及交易平台营运者的监管框架的声明》指明:合格的机构投资人可以投资 STO,但仍需要审查。STO 依旧没有真正与大众投资者相接触。(三)美国美国对数字资产的态度虽然强硬,却始终在探索,作为全球最大的证券市场之一,它的态度相对还是比较包容谨慎。在 STO 方面,美国第一个提出了合规管理,SEC 会对项目本身按照一定的标准进行测试,以判定其是否为“证券”。如果被判定为是证券,那么该项目将会受到 SEC 的监管,在此基础上才能进行 STO,否则将视作违法行为。好了,以上就是我们本期科普的全部内容啦!不知道大家了解了吗?如果您对区块链有什么看法或是疑问,可以在后台留言,小K君会为大家答疑解惑,后续也会为大家带来更多通俗易懂的区块链科普内容哦,敬请关注!
    区块链OK君  ·  2019-02-22
    88阅读  ·  0赞赏  ·   0问答
  • 剖析非同质化代币ERC721-全面解析ERC721标准

    什么是ERC-721?现在我们看到的各种加密猫猫狗狗都是基于ERC-721创造出来的,每只都是一个独一无二的ERC-721代币,不过ERC-721在区块链世界远不止猫猫狗狗,它更大的想象空间在于将物理世界的资产映射到区块链上。本文就来剖析下什么是ERC721.ERC721是什么在创建代币一篇,我们讲到过ERC20代币,和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接口,接口定义如下:1234567891011121314151617181920pragma 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);}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相关接口时除了满足上面的的条件外,我们可以根据需要添加自己的逻辑,如加入黑名单等。同时挖矿、销毁尽管不是标准的一部分,我们可以根据需要实现。  
    moondesign  ·  2019-02-21
    123阅读  ·  0赞赏  ·   0问答
  • C++ 继承方式

     1. public    1)基类的public成员,在派生类中成员public成员    2)基类的protected成员,在派生类中成员protected成员    3)基类的private成员,在派生类中成员不可直接使用的成员2. protected    1)基类的public成员,在派生类中成员protected成员    2)基类的protected成员,在派生类中成员protected成员    3)基类的private成员,在派生类中成员不可直接使用的成员3. private    1)基类的public成员,在派生类中成员private成员    2)基类的protected成员,在派生类中成员private成员    3)基类的private成员,在派生类中成员不可直接使用的成员 在任何继承方式中,除了基类的private成员外,都可以在派生类中分别调整其访问控制。调整格式    [public: | protected: | private: ] <基类名>:: <基类成员名>;class A{  public:    void f1();    void f2();    void f3();  protected:    void g1();    void g2();    void g3();}class B: private A{  public:    A::f1;//把f1调整为public    A::g1;//把g1调整为public,是否允许弱化基类的访问控制要视具体的实现而定  protected:    A::f2;//把f2调整为protected    A::g2;//把g2调整为protected}class C: class B{  public:    void h()    {        f1(); f2(); g1(); g2();//OK        f3(); g3(); //Error,此时f3,g3是基类B的private成员    }}  
    古风  ·  2019-02-21
    164阅读  ·  4赞赏  ·   0问答
  • 分布式系统的时间顺序

     区块链被认为是分布式的系统,分布式系统中由于多节点,通讯、物理位置等的问题,各节点间时间一致的问题随即也被提了出来,那么怎么处理分布式系统中的一致性问题,这里简单介绍下:分布式系统的时间顺序问题。如有解释错误或者不明,请及时提出指正。分布式系统,最简单理解有多个服务节点,客户端发出请求,服务节点之间通讯,顺序记录更新服务器数据和日志。分布式系统中的时间问题,如果简单去想,那么通过NTP时间同步,所有节点都通过去同步时间,然后根据进程发起的物理时间来排序,先不论时间同步中同步过程中的细微毫秒级差异,多个业务发起进程,在各个进程之间有关联关系,进程随着系统计算能力有差异,并且还有检查点的判断,一旦在顺序进程中出现了前物理时间某进程改变了检查点,那么在认为是同步处理的时候就会出现检查点状态改变导致业务逻辑的改变,这种情况理解下就是你在购物网站抢购的时候,货物剩余量在你发起交易的时候还有,但是确认过程由于网络和计算的延时,发现分布式系统中一边是交易已正常请求,但是实际货物记录中已下架。引入logical clock能较好的处理这种系统记录逻辑混乱的现象。Logical clock称为lamport timestamps,这种概念里,先把分布式系统节点间交互分成三种类型:1.分布式单个节点自己内部传递的事件。2.分布式节点互相之间传递的事件。3.分布式节点接收除自己之外的传递进来的事件。同时再加一个逻辑时间顺序概念。顺序叠加原则:这里整个系统顺序逻辑时间时间为T(),各个节点顺序为X()1.初始发起节点为0.2.节点内传递,X+13.节点间传递,T+14.节点接收除自己之外的传递(T and X)+1   那么如果再定义一个节点事件顺序,对节点A.B.C排序。假定发生顺序A<B<C,在上图中,事件发生顺序为:C-1(T=1)  B-1(T=2)  B2(T=3)  A1(T=4)  A2(T=5)  B4(T=6)  B5(T=7)  C4(T=8)  C5(T=9)  A4(T=10)B-3(T=4)  C-2(T=5)  C-3(T=6)  A-3(T=7)  问题来了T(4.5.6.7)发生了重复,那么就用之前说的A<B<C原则以B-4和C-3作比较:A<B<C,那么B-4就理解为发生在C-3之前。推导B-4-->C-3。B-4发生在C-3之前。这个前提是我们已知三个节点进程发生的关系顺序,在实际情况下这个也有可能是很难进行判断的。所以对于并发情况没有很好的一致性判断。上述图中节点A.B.C也可理解为各个进程的顺序,在整个logiccal clock中有这么一个概念要明确,进程间没有因果关系,那就认为是并发,没有因果关系对于系统来说对事件的顺序前后就没有那么强烈的需求,前提是要确定确实没有因果关系,那么分布式系统中就认为是正确的。所以归纳下,分布式系统中没有因果顺序的并发时间就不关注先后顺序。介绍到这里,会提出一个疑问,上面也提到了,那么系统中并发怎么处理,之前通过进程顺序来排序,但是这种不是真正好的为并发处理时间顺序,在这个问题上先提出Vector clock,这是在之前lamport时间戳的一种改进逻辑时钟。在vector clock中对每一个事件上加上前一事件的序号,那么可以看到每个事件记录是一组向量。比如:(A-2 B-4 C-1),(A-2 B-5 C-4)。  在这种方式中,还要引入分布式系统中读写的概念,不单单是事件的传递,设定N为节点数量,R为成功读的节点,W为成功写的节点。当W+R>N,那么就可以保证一致。说明流程:(w为写入进程,a,b,c,d为节点)1.客户端写入数据,提交到服务端。2.服务端创建一个顺序编号,例:(w-a-1)3.客户端再请求写入数据,生成编号:(w-a-2)4.多次请求生成,(w-a-2)(w-b-1),(w-a-2)(w-b-1),(w-a-2)(w-d-1)5.多次请求后,再次读到(w-a-2),那么认为(w-b-1)(w-c-1)(w-d-1)存在冲突,最终通过一致性解决方案生成(w-a-3)(w-b-1)(w-b-1)(w-d-1)写入。Vector clock用来发现数据的冲突,并配合其他的方式来解决冲突,现在常用的会用最后更新原则来做处理,保持一致性。这里大致介绍了两种分布式系统的时间顺序处理,分布式系统因为其特殊性,需要各种机制来保证一致性和高效率执行。 
    七乐彩  ·  2019-02-21
    184阅读  ·  2赞赏  ·   0问答
  • Geth的fast模式

        大家在通过geth的fast模式做区块同步时,都会经历长时间的等待,即区块一直停留在70个左右同步不完的情况,并且持续的打印Imported new state entries信息,这个的原因已经在 同步始终不完成,且一直打印Imported new state entries这篇文章里有详细描述,如果在日志里不再看到无休止的Imported new state entries,而是Imported new chain segment,那么恭喜你,你的同步完成了。经过一个晚上的同步,终于同步完了所有区块信息,同个eth.getBalance可以获取到地址里的以太币数量。下面是区块同步完成的几个标志:1. 执行eth.syncing,提示false 2. 日志打印不在意只是Imported new state entries,而是Imported new chain segment 3. 执行eth.blockNumber,显示当前的区块高度 4. 执行eth.getBlance(eth.coinbase),正确返回该地址的以太币数,不再是0 这段时间在咱的社区还是别的社群里都有人问到了以太坊中区块链同步成功标志是怎么或者说代码又是什么,那么今天就写一下分享给大家。
    INGING  ·  2019-02-20
    163阅读  ·  0赞赏  ·   0问答
  • 以太坊交易手续费计算

    在以太坊发出交易或者其他一些东西的时候,如果手续费计算有问题或者没有在此之前半段账户余额是不是充足,便会碰到“insufficient funds for gas * price + value”异常。今天就带大家看看源代码分析一下此异常的始末手续费不足异常手续费不足的异常情况,意思就是发起交易所需手续费超过了地址中的余额,因为我们知道发起交易需的手续费是由gasLimit和gasPrice组成,即它们的乘积。然而交易一旦发出之后,实际消费的手续费却是由gasPrice和交易的字节数决定的。我们先看一下异常信息:Insufficient funds for gas * price + value、这条异常信息就是告诉我们:当前地址的余额不足以支付gasLimit乘以gasPrice再加上转账的value值。异常中的gas指的就是gasLimit,price就是gasPrice,value指的是发起交易转账的以太币。源代码分析异常定义代码,注释部分已经很明确的说明了异常信息发生的情况:// ErrInsufficientFunds is returned if the total cost of executing a transaction    // is higher than the balance of the user's account.    ErrInsufficientFunds = errors.New("insufficient funds for gas * price + value")调用检验金额代码:// Transactor should have enough funds to cover the costs    // cost == V + GP * GL    if pool.currentState.GetBalance(from).Cmp(tx.Cost()) < 0 {        return ErrInsufficientFunds    }再看一下tx.Cost是如何计算获取得到的:// Cost returns amount + gasprice * gaslimit.func (tx *Transaction) Cost() *big.Int {    total := new(big.Int).Mul(tx.data.Price, new(big.Int).SetUint64(tx.data.GasLimit))    total.Add(total, tx.data.Amount)    return total}很明显代码中也是通过amount加上gasprice和gaslimit的乘积然后和余额进行比较。其他情况还有一些其他原因引起的此异常。比如有同学说,我通过区块链浏览器查询地址上余额足够,通过上面的公式计算获得的金额也小于余额,但每次通过节点发送交易,都会抛出此异常。针对这个问题,需要做的第一步排查就是:发出交易的节点是否同步到了账户的余额,不是通过区块链浏览器查询余额,而是要直接在本地节点中查询余额。 
    nunununu  ·  2019-02-20
    163阅读  ·  2赞赏  ·   0问答
  • DApp框架,工具以及工作流程

    DApp开发框架Truffle and Embark. 是Truffle把我领进了门。在Truffle出现之前的那个夏天,我目睹了一帮有天分的学生是如何不眠不休的参加一个hackathon(编程马拉松)活动的,虽然结果相当不错,但我还是吓到了。然后Truffle出现了,帮你处理掉大量无关紧要的小事情,让你可以迅速进入写代码-编译-部署-测试-打包DApp这个流程。另外一个相似的DApp构建与测试框架是Embark。、Meteor. 许多DApp开发者使用的另一套开发栈由web3.js和Meteor组成,Meteor是一套通用webapp开发框架(ethereum-meteor-wallet项目提供了一个很棒的入门实例,而SilentCiero正在构建大量Meteor与web3.js和DApp集成的模板)。我下载并运行过一些不错的DApp是以这种方式构造的。APIs. BlockApps.net打算提供一套RESTful API给DApp使用以免去开发者运行本地节点的麻烦,这个中心化服务是基于以太坊Haskell实现的。这与DApp的去中心化模型背道而驰,但是在本地无法运行以太坊节点的场合非常有用,比如在你希望只有浏览器或者使用移动设备的用户也能使用你的DApp的时候。BlockApps提供了一个命令行工具bloc,注册一个开发者帐号之后就可以使用。许多人担心需要运行以太坊节点才能使用DApp的话会把用户吓跑,其实包括BlockApps在内的许多工具都能解决这个问题。Metamask允许你在浏览器里面使用以太坊的功能而无需节点,以太坊官方提供的AlethZero或者AlethOne是正在开发中有易用界面的客户端,ConsenSys正在打造一个轻钱包LightWallet,这些工具都会让DApp的使用变得更容易。轻客户端和水平分片(sharding)也在计划和开发之中。这是一个能进化出混合架构的P2P生态系统。智能合约集成开发环境 (IDE)IDE. 以太坊官方出品了用来编写智能合约的Mix IDE,我还没用过但会尽快一试。基于浏览器的IDE. Solidity real-time compiler和Cosmo都可以让你快速开始在浏览器中编写智能合约。你甚至可以让这些工具使用你的本地节点,只要让本地节点开一个端口(注意安全!这些工具站点必须可信,而且千万不要把你的全部身家放在这样一个本地节点里面!Cosmo UI上有如何使用geth做到这一点的指引)。在你的智能合约调试通过之后,可以用开发框架来给它添加用户界面和打包成DApp,这正是Truffle的工作,后面的编程章节会有详细讲解。Ether.Camp正在开发另一个强大的企业级浏览器IDE。他们的IDE将支持沙盒测试网络,自动生成用于测试的用户界面(取代后文将展示的手动编写测试),以及一个测试交易浏览器test.ether.camp。当你的合约准备正式上线之前,使用他们的测试网络会是确保你的智能合约在一个接近真实的环境工作正常的好方法。合约和Dapp示例。 在Github上搜索DApp仓库和.sol文件可以看到进行中的有趣东西。这里有一个DApp大列表:dapps.ethercasts.comEther.fund/contracts上有一些Solidity和Serpent写的合约示例,但是不清楚这些例子有没有经过测试或者正确性验证。部署智能合约的流程流程如下:启动一个以太坊节点 (例如geth或者testrpc)。使用solc*编译*智能合约。 => 获得二进制代码。将编译好的合约部署到网络。(这一步会消耗以太币,还需要使用你的节点的默认地址或者指定地址来给合约签名。) => 获得合约的区块链地址和ABI(合约接口的JSON表示,包括变量,事件和可以调用的方法)。用web3.js提供的JavaScript API来调用合约。(根据调用的类型有可能会消耗以太币。) 
    0.0  ·  2019-02-20
    209阅读  ·  0赞赏  ·   0问答