Ⅰ 追踪和管理数字资产新姿势,教你学会查看区块链账单
账单记录价值流通和状态,是金融服务的基础功能。
我们常用的银行、支付宝、微信支付等都会为普通用户和商家记录一笔交易,提供不同维度的查询、统计和分析服务。
比如大家爱晒的支付宝年度账单,会统计用户全年的总收支、消费种类、余额宝和其他理财收益、点外卖的次数等。通过大数据技术,展示各个地域,不同年龄段的消费兴趣和趋势,让消费者更了解自己周边的消费环境,商家能够及时把握市场需求。
在去中心化的区块链网络里,交易被永久的记录在链上,公开透明,人人可查。
但是由于区块链的设计更倾向于保证不可篡改和数据压缩需求,导致业务层面的过滤查询功能缺失。 加上不同链的规则不同,追踪和管理加密资产变的异常困难。这也是为什么数字资产投资者常常感叹“总觉得帐没算明白“的原因所在。
SixPencer推出全新区块链记账神器,目前已支持比特币(Bitcoin)和以太坊(Ethereum)底层的资产追踪和管理,免费使用,无需注册。
一经推出,受到了包括矿工、资管机构、OTC商户、加密创业公司、数字资产投资者的喜爱。
作为专业的资管工具,不仅能够查询所有链上交易记录,实时查看账户余额和持有资产,而且 提供每日各币种收支情况、支持单或多地址聚合收支统计、地址画像分析和图表、大额交易记录排行、联系人管理等。
进入网站后, 在首页搜索框,输入比特币或以太坊地址 , 点击搜索即可进入该地址的总览页面。
我们以目前ETH持有量全网排名第一的地址: (标签:bitfinex 1) 账户作为demo账户进行演示,所有数据均为真实链上数据。
这里简单介绍下区块链上的地址和银行账户的区别。 在区块链上,地址就类似于银行卡号,知道地址就等于知道银行卡号一样,可以向其转账。
但不同的是, 区块链是不可篡改的分布式公开账本,通常具有匿名性,任何人可以对任何地址进行公开查询。 银行账户只能查询本人的账户信息,无法通过银行卡号得知其他人的账户信息。
如果用户有多个地址,或者想追踪其他地址,均可以通过搜索, 所有搜索过的地址信息会在资产组合页面进行汇总,点击下拉框即可切换或者删除账户。
SixPencer除包含区块链浏览器提供的基础信息外,添加展示了一些个性化的指标,帮助用户了解自己的链上画像,也可以追踪其他账户的链上轨迹。在下面总览页面可以查看地址的资产概览、历史指标、收支统计、持有资产信息。
地址概览
创建时间:第一次收到ETH的日期
净资产:所有资产,包含ERC20 token资产的合计美元价值
ETH排行:持有ETH数量在所有以太坊地址中的排名
ETH余额和估值:持有的ETH数量和其对应的美元价值
历史指标
历史指标展示交易量、交易次数、代币分析和联系人分析四大维度。 通过统计,算不清的糊涂账终于能算清了,比如最简单的会计计算,ETH总收入=ETH余额+ETH总支出+ETH总手续费。 再比如总交易次数=转入交易次数+转出交易次数。
由于以太坊网络的特殊性,所有转账的手续费都是以ETH支付。因此我们将手续费单独罗列出来,在交易明细中也支持手续费单独筛选,帮助用户统计手续费支出。
一些有趣的数据,demo账户手续费支出为1.1556ETH,ETH单笔大额转账达90万个ETH,持有代币数量有350种,交易次数最多的代币是USDT,与其交易过的地址仅37个。
一般持有上百种不同资产的地址通常都是交易所地址,加上交易次数和联系人并不多,可以排除是对外地址,基本可以判断是bitfinex交易所内部使用地址。
收支情况
统计了本月全部资产合计收入和支出,支出包含手续费支出。
持有资产情况
展示持有的资产数量、价值、资产价格和24h涨跌幅。demo账户这类交易所的地址,持有资产通常10页都放不下。
SixPencer除了提供地址的交易流水外,还支持全历史交易记录查询和筛选、余额信息、日收支统计等。
交易明细
从下面页面可以清晰得知ETH资产的本月收支情况 ,用户还可以根据日期,资金流向、交易分类和标签系统进行筛选,根据自身需求进行更细致的统计,后面会介绍如何进行指定地址的交易筛选。
点击上图中的ETH下拉框,可以切换到其他币种的交易详情页面 ,比如切换到USDT的交易详情查看USDT的明细状况。
除月账单外,SixPencer展示每笔交易的交易明细,提供交易方向、交易对手方、交易金额、账户余额、交易时间、每日收支情况等信息。 下图可以看到近6笔ETH交易均为从bitfinex 3 账户转入bitfinex 1的交易。
交易详情
点击任意一笔交易明细,即可进入该笔交易的交易详情页。 交易哈希是每笔链上转账都有的唯一不可篡改的交易ID,类似于订单号的概念。
通过交易哈希就可以查询到一笔交易的具体信息。
下面所展示的交易数量、交易状态、交易时间、发送和接受方、手续费等都是这笔交易的具体信息,在这里不再赘述。 值得注意的是,SixPencer提供个人标签和备注系统,用户可以对单笔交易,进行个性化分类和备注, 帮助记忆,不遗忘每一笔交易。
如何快速找到和指定地址的交易信息?
时间变久,交易变多后,查询链上指定交易信息就变得异常复杂和困难,SixPencer将交易信息按照业务需求进行细化,并提供标签系统辅助用户进行自定义交易查询和统计。
比如想要查询2020年6月地址(标签:bitfinex 3)一共向demo账户转入了多少ETH。通过我们的账单系统,仅需两步操作即可查询。
1、打标签: 为了演示,我们将“bitfinex 3“这个标签重命名为“测试test”。
2、筛选: 将日期筛选为6月1日-6月30日,在筛选栏 选中“转入”,并在最下面的标签栏选中“测试test”,点击保存。
保存后即可搜索出所有6月“测试test”转入到demo账户的交易信息,从下图可以看出6月份,demo账户共从标签为“测试test“的地址收到58,440.2489个ETH。
如果用户想查询和多个指定地址的交易,选中多个标签后,调整日期、资金流向等信息即可进行资产的自动统计。
在分析一栏,用户可以查询地址不同维度的图表分析信息,包含余额、交易、分类和排行四大维度。 分别点击各维度还能够查看更多详细数据和图表。
余额:余额展示资产的余额数量和价值走势
交易:交易展示全部交易、转入和转出的交易数量、交易数量价值和交易次数走势
分类:分类根据平台地址标签系统对交易类型进行统计,反应地址的交易偏好
排行:排行按照交易次数展示活跃联系人,按照交易金额展示大额交易
比如排行分析,能够很快查看与某个地址的具体交易金额和大额转账情况。如下图,demo账户与标签为“测试test” 的地址在本月一共交易了177次,其他与demo账户交易较多的都是ERC20 Token合约调用交易。
从下图看,大额排行也都是与标签为“测试test”的地址交易信息,表格展示交易对象、交易时间、交易方向、交易数量和价值。 对交易所大户感兴趣的,可以查询交易所地址的大额转账信息,看看哪些地址都是充提大户。
通讯录展示所有和demo账户有过交易记录的地址,除平台自带的标签体系外,用户可以对地址添加标签或者重命名标签。
标签:展示平台标签系统已知标签和用户自行添加的标签
最近联系人:展示最近30天有过交易记录的地址/标签
全部联系人:展示所有有过交易记录的联系人地址/标签,交易数量超过1万笔的地址,取最近1万笔交易的联系人展示
综上,SixPencer的全新资产追踪和管理工具能够提供比区块链浏览器或者钱包更综合的查询和分析功能, 作为一款工具产品意在辅助用户进行数字资产管理,通过对链上用户画像的进一步解析,帮助大家更好的决策。
我们认为区块链的公开透明机制应该让数据查询更简单,但目前按照实际业务需求快速查询区块链数据仍然是难点痛点,并成为商业落地的一大阻碍。
数字资产交易仅仅是其中一小块,未来还将有大量有价值的数据存储在区块链上,SixPencer将继续推出更多实用工具,让数据更好为业务服务。
Ⅱ 【ETH钱包开发03】web3j转账ETH
在之前的文章中,讲解了创建、导出、导入钱包。
【ETH钱包开发01】创建、导出钱包
【ETH钱包开发02】导入钱包
本文主要讲解以太坊转账相关的一些知识。交易分为ETH转账和ERC-20 Token转账,本篇先讲一下ETH转账。
1、解锁账户发起交易。钱包keyStore文件保存在geth节点上,用户发起交易需要解锁账户,适用于中心化的交易所。
2、钱包文件离线签名发起交易。钱包keyStore文件保存在本地,用户使用密码+keystore的方式做离线交易签名来发起交易,适用于dapp,比如钱包。
本文主要讲一下第二种方式,也就是钱包离线签名转账的方式。
交易流程
1、通过keystore加载转账所需的凭证Credentials
2、创建一笔交易RawTransaction
3、使用Credentials对象对交易签名
4、发起交易
注意以下几点:
1、Credentials
这里,我是通过获取私钥的方式来加载 Credentials
还有另外一种方式,通过密码+钱包文件keystore方式来加载 Credentials
2、nonce
nonce是指发起交易的账户下的交易笔数,每一个账户nonce都是从0开始,当nonce为0的交易处理完之后,才会处理nonce为1的交易,并依次加1的交易才会被处理。
可以通过 eth_gettransactioncount 获取nonce
3、gasPrice和gasLimit
交易手续费由gasPrice 和gasLimit来决定,实际花费的交易手续费是 gasUsed * gasPrice 。所有这两个值你可以自定义,也可以使用系统参数获取当前两个值
关于 gas ,你可以参考我之前的一篇文章。
以太坊(ETH)GAS详解
gasPrice和gasLimit影响的是转账的速度,如果gas过低,矿工会最后才打包你的交易。在app中,通常给定一个默认值,并且允许用户自己选择手续费。
如果不需要自定义的话,还有一种方式来获取。获取以太坊网络最新一笔交易的 gasPrice ,转账的话, gasLimit 一般设置为21000就可以了。
Web3j还提供另外一种简单的方式来转账以太币,这种方式的好处是不需要管理nonce,不需要设置gasPrice和gasLimit,会自动获取最新一笔交易的gasPrice,gasLimit 为21000(转账一般设置成这个值就够用了)。
这个问题,我想是很多朋友所关心的吧。但是到目前为止,我还没有看到有讲解这方面的博客。
之前问过一些朋友,他们说可以通过区块号、区块哈希来判断,也可以通过Receipt日志来判断。但是经过我的一番尝试,只有 BlockHash 是可行的,在web3j中根据 blocknumber 和 transactionReceipt 都会报空指针异常。
原因大致是这样的:在发起一笔交易之后,会返回 txHash ,然后我们可以根据这个 txHash 去查询这笔交易相关的信息。但是刚发起交易的时候,由于手续费问题或者以太网络拥堵问题,会导致你的这笔交易还没有被矿工打包进区块,因此一开始是查不到的,通常需要几十秒甚至更长的时间才能获取到结果。我目前的解决方案是轮询的去刷 BlockHash ,一开始的时候 BlockHash 的值为0x00000000000,等到打包成功的时候就不再是0了。
这里我使用的是rxjava的方式去轮询刷的,5s刷新一次。
正常情况下,几十秒内就可以获取到区块信息了。
区块确认数=当前区块高度-交易被打包时的区块高度。
Ⅲ 以太坊获取测试链代币
发起以太坊交易时需要消耗以太币,开发智能合约做测试时如果在主网做测试成本会很高,并且主网的速度也比较慢,以太坊官方考虑到大家的这个需求提供了几条测试链供大家使用,比较知名的有以下这几个
以太坊的主测试网,环境最接近主网环境,有实际的雷锋矿工在挖矿,只不过难度会比主网低很多,不过由于 Ropsten 采用与主网完全一样的 PoW 共识,有时也就会和主网一样拥堵,在这条链上做测试更容易测试出智能合约或者dapp里潜在的问题
用的是 PoA 机制,无需挖矿,所以出块很快而且很稳定
和Rinkeby同样使用的是 PoA 机制
打开这个网址 https://faucet.metamask.io/
点击 request 1 ether from faucet 按钮会通过web3连接钱包,获取到钱包当前账户的以太坊地址,这个我使用的钱包是MetaMask,如果你没有装支持web3访问的钱包,可以参考这篇文章安装
https://www.jianshu.com/p/a84fe16f1af7
点击连接
连接成功后底部会生成一笔交易,hash值
等交易确认后一个以太坊就到账了
Rinkeby获取测试币相对麻烦些,需要注册twitter账号(需要翻墙)
打开这个网址 https://twitter.com/intent/tweet?text=Requesting%20faucet%20funds%20into%%20on%20the%20%23Rinkeby%20%23Ethereum%20test%20network
把推文中替换成你的地址点击TWEET,发送成功后点击分享图标选择Copy link to Tweet,把推文的链接复制下来
然后打开Rinkeby测试币水龙头网页 https://www.rinkeby.io/#faucet
把刚才那个推文链接复制进输入框,点击Give me Ether
根据你的需要选择要多少个代币,要的越多到账越慢😓,到账时间相对其它的测试链很慢,如果着急就用别的链做测试
打开这个网址 https://faucet.kovan.network/ ,需要使用github账号登陆
登陆成功后输入以太坊地址,点击发送就好了,转账交易就提交到链上了
同样的等待交易确认就能收到一个以太币了
Ⅳ luno发送ETH对方还没确认可以取消吗
luno发送ETH,对方还没确认是可以取消的。如果交易提交了但还没被确认则可以取消。以太坊是一个基于区块链的开源软件平台,拥有数以千计的去中心化应用程序 (DApp),为其原生加密货币以太 (ETH) 提供支持,可以在全球范围内发送和接收,而不受任何第三方干扰。
取消的操作:
取消待处理的以太坊交易有两种主要方法:应用程序内取消和设置自定义随机数。通常,当用户以较低的 gas 价格提交时,以太坊交易会挂起数小时或卡住。 因此,用户经常发现有必要更改以太坊交易。
在解决这个问题时,用户需要记住只有当交易仍在网络上未决时才能尝试取消。 他们需要采取的第一步是在区块浏览器中验证交易是否仍在等待中。 主要是粘贴交易哈希,也称为以太坊交易 ID,如果区块浏览器显示“待处理”,用户仍然可以尝试取消它。
取消卡住的以太坊交易的最简单方法是应用程序内取消,这需要用户退出以太坊钱包应用程序并关闭浏览器,重新打开并重新登录应用程序。
Ⅳ ETH转账的2种方式的对比
web3j支持使用以太坊钱包文件(推荐)和以太网客户端管理命令来发起一笔交易。当你创建了一个拥有以太币的账户后,你可以通过以下两种交易机制,和以太坊网络(私网/公网)交易:
这里主要讲一下 线下签名交易(Offline transaction signing) 。线下签名交易允许你使用web3j提供的钱包账户发起交易,你完全控制自己的私钥,交易发送到网络上的其它节点并广播。
线下签名交易使用 RawTransaction 对象来完成,一共有如下几步:
1、通过私钥或密码+钱包文件(keystore)来加载转账凭证Credentials
2、获取发起转账账户的nonce 值,也就是第几笔交易
3、创建 RawTransaction交易 对象
4、签名 RawTransaction 对象,也就是对交易做签名
5、发送交易( RawTransaction 对象)给节点处理。
6、获取交易哈希值TxHash
以太坊实战-再谈nonce使用陷阱: https://blog.csdn.net/wo541075754/article/details/79054937
此外,还有一种简单的转账方式
这种方式,不需要自己管理nonce。
这2种方式都是离线交易,先组装交易,然后发送到链上。
参考:
https://docs.web3j.io/getting_started.html#transactions
https://www.jianshu.com/p/6650d2a3aea9
Ⅵ 以太坊的ABI编码
ABI全称Application Binary Interface, 是调用智能合约函数以及合约之间函数调用的消息编码格式定义,也可以理解为智能合约函数调用的接口说明. 类似Webservice里的SOAP协议一样;也就是定义操作函数签名,参数编码,返回结果编码等。
使用ABI协议时必须要求在编译时知道类型,即强类型相关.
当一个智能合约编译出来后, 他的abi接口定义就确定了. 比如下面的智能合约:
生成的字节码:
生成的abi定义:
可以看出, 生成abi包含了2个定义: 函数 lotus , 事件 Log_lotus , 各个字段含义见上. 根据该abi定义,就可以生成调用该智能合约函数的abi格式的数据了.
格式简单的可以表示为: 函数选择器+参数编码
一个函数调用的前四个字节数据指定了要调用的函数签名。计算方式是使用函数签名的 keccak256 的哈希,取4个字节。
函数名如果有多个参数使用,隔开,要去掉表达式中的所有空格。在geth客户端,通过命令可以得到hash:
由于前面的函数签名使用了四个字节,参数的数据将从第五个字节开始。
根据参数类型,编码规则有所区别:
除了bytes,和string, 其他类型的数据不足32字节长度的需要加0补足32字节. 动态长度的编码在例子中介绍.
函数: function baz(uint32 x, bool y) :
调用: baz(69, true)
生成的数据如下:
返回结果是一个bool值,在这里,返回的是false:
函数: f(uint,uint32[],bytes10,bytes)
调用: (0x123, [0x456, 0x789], "1234567890", "Hello, world!")
函数选择器: bytes4(sha3("f(uint256,uint32[],bytes10,bytes)"))
对于 固定大小的类型 值 uint256 和 bytes10 ,直接编码值。
对于 动态内容类型 值 uint32[] 和 bytes ,我们先 编码偏移值 ,偏移值是整个值编码的开始到真正存这个数据的偏移值(这里不计算头四个用于表示函数签名的字节)。
所以参数编码数据依次为:
尾部部分的第一个动态参数, [0x456, 0x789] 编码拆解如下:
最后我们来看看第二个动态参数的的编码, Hello, world! 。
所以最终结果是:
Ⅶ 说说哈希未来与哈希世界上链资产那些事儿
本文关联词:“哈希未来”(回答哈希世界是谁、从哪来、到哪去的问题)、“上链资产”(回答哈希土地价值几何的问题)、“那些事儿”(展望哈希未来的未来)。
一、首先讲一下“哈希未来”。
在目前区块链的格局中,相比市场上大多在天上飘的公链,哈希未来属于非常明显的应用链。
公链的难点在于需要无比强大的技术支撑、应用开发和共识机制,才有可能存活下来;公链容易的地方在于好忽悠、赚钱快,只要嘴皮子利落,搞点媒体和资金进来,一张PPT也能飞上天。公链的正面和反面例子,本文不做评价,诸位自行判断。
应用链与公链有非常大的不同。应用链必须要有规划、场景、人群、上下游支持,才有做起来的可能。相比公链,应用链光有PPT是不行的。因为用户对应用的体验是真实的。
那么问题来了,哈希未来到底是什么?
按照《哈希未来白皮书》的说法,“作为连接物质世界和数字世界的平台和桥梁,哈希未来的目标是解决人们在当前数字时代背景下,所面临的数字资产确权和交易难题。”“哈希世界结合人类历史上的资产确权、流转的制度结晶与数字时代的发展脉搏,打造出协议层—技术层—应用层三位一体的新兴区块链数字资产确权、流通、交易平台”。
简单概括:哈希未来的应用在于运用资产/ 商品上链、跨链技术,进行确权、交易或流转。
上面这段话里面,比如像 确权 、 交易制度 、 三个技术层 、 上链 、 跨链 等这几个词,每个词都可以提一大堆问题和解决方案,都能做一篇论文出来。在实践中,国内市场上已经有先发的几家在做资产上链了,遗憾的是,目前还没有哪家有落地的应用出来。
国内的企业在区块链化的过程中,一般有两类。一类是先上链,再上应用。还有一类是先上应用,再上链。至少目前来看,前一类就像漂亮的空中楼阁般可见不可用(如下图的生态化反还是生态画反),后一类则如龟兔赛跑的乌龟那样的执着坚持。
在这一点上,很明显,哈希未来属于后者。哈希未来虽然后发力,但是已经通过哈希世界摸索出一条资产上链和跨链的通道,并且在法律配套和线下的操作层面都做了许多工作,后续将上链/跨链技术扩展到许多其他资产领域。不得不说,哈希在一步一步的做事情,并不是单纯的做PPT。
二、重要的“上链资产”
上文提及,“哈希世界”是“哈希未来”最重要的上链资产。那么,“哈希世界”究竟是什么资产?“哈希世界”的未来又会如何?
“哈希世界”是哈希未来最重要的虚拟资产。期初是用于哈希未来跑通上链/跨链通道的重要实验。“哈希世界”实验成功后,哈希未来需要把众多的实物资产类型也扩展纳入哈希未来的上链/跨链版图。这些实物资产类型包括珠宝玉石、文玩字画、海外土地等等。
那么,下面就是一个大家都很关心的问题——“哈希世界”中的哈希土地这种虚拟资产有无价值?价值几何?未来如何?
最初的虚拟资产主要是指游戏币、网络游戏账号\装备等等,这类虚拟资产以游戏作为基础共识,并在玩家之间进行交易流转。
现在的虚拟资产主要是指BTC,更准确的叫法是加密数字资产。BTC依靠强大的POW共识、矿工维护和社区建设,在近十年的时间里,达到目前9000多亿的市值。
那么“哈希世界”的哈希土地将来是否会有同样的辉煌?哈希土地是基于以太坊ERC-721技术的,在官方用HSC进行交易的虚拟资产。
哈希土地不同于以太猫(CryptoKitties)等市场上其他基于ERC-721的数字游戏。哈希世界的哈希土地有现金流,有预期收益,有游戏属性,有上链跨链技术,有应用前景,有交易市场。哈希土地的未来应用前景——比如广告招商、线上线下互联等,如果要画PPT去讲,也可以单独一篇论文,本文略过。仅就目前哈希土地已有的这些特征全部符合投资学中的资产基本属性。
那么,哈希土地作为资产如何估值呢?区块链资产并不适用于传统的CAPM(资本资产定价模型)、证券市场PE/PB估值、公司企业的现金流等估值模型等。区块链是一个生产关系的体系,更适合用“费雪模型”这种计算token供应、流通、物价和各类资产/商品交易总量的宏观经济模型,来进行估值。
“费雪模型”表达式为:MV = PQ
M:在一个经济体中,货币的平均供应量(在数字货币中,代表Token的供应量);
V:货币(或者Token)的流通速度;
P:货币(或者Token)的价格;
Q:各类资产/商品的交易总量。
那么,P= MV/Q
而在统一共识的假设条件下(即哈希土地与HSC的自由兑换,HSC与各类资产/商品的自由兑换),哈希土地资产的估值=HSC的市值=基于HSC的所有应用的价值。已知HSC总量500亿个,哈希土地创世土地4000块,未知是HSC的未来流通速度和哈希未来有多少资产/商品上链,大家自行带入变量计算哈希土地价值吧。
三、引申讲讲“那些事儿”
资产的类型是实物的、虚拟的,还是数字的,其实跟资产的价值连一个HSC的关系都没有。是否属于资产,资产是否值钱只与该资产形成的共识有关。人类文明的历史上,贝壳、石头、琉璃、黄金等等,都充当过作为流通的一般等价物资产,其他作为资产标的的物品就更多了。这些资产中,目前还有共识的就是黄金,BTC都有取而代之的趋势。
在区块链这场生产关系变革中,生产关系将真正成为第一生产力。哪条链聚拢了更多资源,那他所形成的共识就会越大。哈希未来在开创了哈希世界之后,需要以哈希世界为根基,尽可能的扩展共识,覆盖到各类资产/商品上面。待到树已参天,待你长发及腰,再看哈希未来,招呼一声“Hello Future , This is my World”
Ⅷ 以太坊转账流程
发起:用户在本地的以太坊钱包软件中选择要发送的交易地址(From)、输入目标地址(To)、金额(Value)、是否部署或调用合(Data)、手续费单价(Gasprice)等,确认发送至以太坊节点节点和钱包可以是同一台
广播:节点收到(或自己发起)交易后,会对交易进行验证。验证:交易的签名、发起账号的余额是否能支付转账余额与手续费、Nonce是否为账号已发出的交易数。验证为合法后,将交易加入节点的交易池中交易池中存储着待打包的交
安装以太坊浏览器钱包插件,创建钱包,获取虚拟以太币,进行转账交易。 实验内容 学习 初识以太坊,发送交易 1.学习《初始以太坊,发送交易》,虚拟以太币交易。
Ⅸ 小白如何秒懂区块链中的哈希计算
小白如何秒懂区块链中的哈希计算
当我在区块链的学习过程中,发现有一个词像幽灵一样反复出现,“哈希”,英文写作“HASH”。
那位说“拉稀”同学你给我出去!!
这个“哈希”据说是来源于密码学的一个函数,尝试搜一搜,论文出来一堆一堆的,不是横式就是竖式,不是表格就是图片,还有一堆看不懂得xyzabc。大哥,我就是想了解一下区块链的基础知识,给我弄那么难干啥呀?!我最长的密码就是123456,复杂一点的就是654321,最复杂的时候在最后加个a,你给我写的那么复杂明显感觉脑力被榨干,仅有的脑细胞成批成批的死亡!为了让和我一样的小白同学了解这点,我就勉为其难,努力用傻瓜式的语言讲解一下哈希计算,不求最准确但求最简单最易懂。下面我们开始:
# 一、什么是哈希算法
## 1、定义:哈希算法是将任意长度的字符串变换为固定长度的字符串。
从这里可以看出,可以理解为给**“哈希运算”输入一串数字,它会输出一串数字**。
如果我们自己定义 “增一算法”,那么输入1,就输出2;输入100就输出101。
如果我我们自己定义“变大写算法”,那么输入“abc”输出“ABC”。
呵呵,先别打我啊!这确实就只是一个函数的概念。
## 2、特点:
这个哈希算法和我的“增一算法”和“变大写算法”相比有什么特点呢?
1)**确定性,算得快**:咋算结果都一样,算起来效率高。
2)**不可逆**:就是知道输出推不出输入的值。
3)**结果不可测**:就是输入变一点,结果天翻地覆毫无规律。
总之,这个哈希运算就是个黑箱,是加密的好帮手!你说“11111”,它给你加密成“”,你说“11112”它给你弄成“”。反正输入和输出一个天上一个地下,即使输入相关但两个输出毫不相关。
# 二、哈希运算在区块链中的使用
## 1、数据加密
**交易数据是通过哈希运算进行加密,并把相应的哈希值写入区块头**。如下图所示,一个区块头包含了上一个区块的hash值,还包含下一个区块的hash值。
1)、**识别区块数据是否被篡改**:区块链的哈希值能够唯一而精准地标识一个区块,区块链中任意节点通过简单的哈希计算都可以获得这个区块的哈希值,计算出的哈希值没有变化也就意味着区块链中的信息没有被篡改。
2)、**把各个区块串联成区块链**:每个区块都包含上一个区块的哈希值和下一个区块的值,就相当于通过上一个区块的哈希值挂钩到上一个区块尾,通过下一个区块的哈希值挂钩到下一个区块链的头,就自然而然形成一个链式结构的区块链。
## 2、加密交易地址及哈希
在上图的区块头中,有一个Merkle root(默克尔根)的哈希值,它是用来做什么的呢?
首先了解啥叫Merkle root? 它就是个二叉树结构的根。啥叫二叉树?啥叫根?看看下面的图就知道了。一分二,二分四,四分八可以一直分下去就叫二叉树。根就是最上面的节点就叫 根。
这个根的数据是怎么来的呢?是把一个区块中的每笔交易的哈希值得出后,再两两哈希值再哈希,再哈希,再哈希,直到最顶层的数值。
这么哈希了半天,搞什么事情?有啥作用呢?
1)、**快速定位每笔交易**:由于交易在存储上是线性存储,定位到某笔交易会需要遍历,效率低时间慢,通过这样的二叉树可以快速定位到想要找的交易。
举个不恰当的例子:怎么找到0-100之间的一个任意整数?(假设答案是88)那比较好的一个方法就是问:1、比50大还是小?2、比75大还是小?3、比88大还是小? 仅仅通过几个问题就可以快速定位到答案。
2)、**核实交易数据是否被篡改**:从交易到每个二叉树的哈希值,有任何一个数字有变化都会导致Merkle root值的变化。同时,如果有错误发生的情况,也可以快速定位错误的地方。
## 3、挖矿
在我们的区块头中有个参数叫**随机数Nonce,寻找这个随机数的过程就叫做“挖矿”**!网络上任何一台机器只要找到一个合适的数字填到自己的这个区块的Nonce位置,使得区块头这6个字段(80个字节)的数据的哈希值的哈希值以18个以上的0开头,谁就找到了“挖到了那个金子”!既然我们没有办法事先写好一个满足18个0的数字然后反推Nounce,唯一的做法就是从0开始一个一个的尝试,看结果是不是满足要求,不满足就再试下一个,直到找到。
找这个数字是弄啥呢?做这个有什么作用呢?
1)、**公平的找到计算能力最强的计算机**:这个有点像我这里有个沙子,再告诉你它也那一个沙滩的中的一粒相同,你把相同的那粒找出来一样。那可行的办法就是把每一粒都拿起来都比较一下!那么比较速度最快的那个人是最有可能先早到那个沙子。这就是所谓的“工作量证明pow”,你先找到这个沙子,我就认为你比较的次数最多,干的工作最多。
2)、**动态调整难度**:比特币为了保证10分钟出一个区块,就会每2016个块(2周)的时间计算一下找到这个nonce数字的难度,如果这2016个块平均时间低于10分钟则调高难度,如高于十分钟则调低难度。这样,不管全网的挖矿算力是怎么变化,都可以保证10分钟的算出这个随机数nonce。
# 三、哈希运算有哪些?
说了这么多哈希运算,好像哈希运算就是一种似的,其实不是!作为密码学中的哈希运算在不断的发展中衍生出很多流派。我看了”满头包”还是觉得内在机理也太复杂了,暂时罗列如下,小白们有印象知道是怎么回事就好。
从下表中也可以看得出,哈希运算也在不断的发展中,有着各种各样的算法,各种不同的应用也在灵活应用着单个或者多个算法。比特币系统中,哈希运算基本都是使用的SHA256算法,而莱特币是使用SCRYPT算法,夸克币(Quark)达世币(DASH)是把很多算法一层层串联上使用,Heavycoin(HAV)却又是把一下算法并联起来,各取部分混起来使用。以太坊的POW阶段使用ETHASH算法,ZCASH使用EQUIHASH。
需要说明的是,哈希运算的各种算法都是在不断升级完善中,而各种币种使用的算法也并非一成不变,也在不断地优化中。
**总结**:哈希运算在区块链的各个项目中都有着广泛的应用,我们以比特币为例就能看到在**数据加密、交易数据定位、挖矿等等各个方面都有着极其重要的作用**。而哈希运算作为加密学的一门方向不断的发展和延伸,身为普通小白的我们,想理解区块链的一些基础概念,了解到这个层面也已经足够。
Ⅹ 【以太坊易错概念】nonce, 公私钥和地址,BASE64/BASE58,
以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。
在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时 nonce的值是不变的。
在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):
但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的
通过椭圆曲线算法生成钥匙对(公钥和私钥),以太坊采用的是secp256k1曲线,
公钥采用uncompressed模式,生成的私钥为长度32字节的16进制字串,公钥为长度64的公钥字串。公钥04开头。
把公钥去掉04,剩下的进行keccak-256的哈希,得到长度64字节的16进制字串,丢掉前面24个,拿后40个,再加上"0x",即为以太坊地址。
整个过程可以归纳为:
2)有些网关或系统只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据。Base64使用【字母azAZ数字09和+/】这64个字符编码。原理是将3个字节转换成4个字节(3 X 8) = 24 = (4 X 6)
当剩下的字符数量不足3个字节时,则应使用0进行填充,相应的,输出字符则使用'='占位,因此编码后输出的文本末尾可能会出现1至2个'='。
1)Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。
Base58Check是一种常用在比特币中的Base58编码格式,增加了错误校验码来检查数据在转录中出现的错误。 校验码长4个字节,添加到需要编码的数据之后。校验码是从需要编码的数据的哈希值中得到的,所以可以用来检测并避免转录和输入中产生的错误。使用 Base58check编码格式时,编码软件会计算原始数据的校验码并和结果数据中自带的校验码进行对比。二者不匹配则表明有错误产生,那么这个 Base58Check格式的数据就是无效的。例如,一个错误比特币地址就不会被钱包认为是有效的地址,否则这种错误会造成资金的丢失。
为了使用Base58Check编码格式对数据(数字)进行编码,首先我们要对数据添加一个称作“版本字节”的前缀,这个前缀用来明确需要编码的数 据的类型。例如,比特币地址的前缀是0(十六进制是0x00),而对私钥编码时前缀是128(十六进制是0x80)。 表4-1会列出一些常见版本的前缀。
接下来,我们计算“双哈希”校验码,意味着要对之前的结果(前缀和数据)运行两次SHA256哈希算法:
checksum = SHA256(SHA256(prefix+data))
在产生的长32个字节的哈希值(两次哈希运算)中,我们只取前4个字节。这4个字节就作为校验码。校验码会添加到数据之后。
结果由三部分组成:前缀、数据和校验码。这个结果采用之前描述的Base58字母表编码。下图描述了Base58Check编码的过程。
相同:
1) 哈希算法、Merkle树、公钥密码算法
https://blog.csdn.net/s_lisheng/article/details/77937202?from=singlemessage
2)全新的 SHA-3 加密标准 —— Keccak
https://blog.csdn.net/renq_654321/article/details/79797428
3)在线加密算法
http://tools.jb51.net/password/hash_md5_sha
4)比特币地址生成算法详解
https://www.cnblogs.com/zhaoweiwei/p/address.html
5)Base58Check编码实现示例
https://blog.csdn.net/QQ604666459/article/details/82419527
6) 比特币交易中的签名与验证
https://www.jianshu.com/p/a21b7d72532f