领wfc糖果

领wfc糖果

各种领wfc糖果的攻略,一起来薅羊毛
wfc矿机拍卖

wfc矿机拍卖

wificoin开源矿机
开源wificoin

开源wificoin

给开源wificoin项目打call

什么是 P2PK, P2PKH, P2SH, P2WPKH

区块链技术刘登丰 发表了文章 • 0 个评论 • 229 次浏览 • 2018-03-14 18:57 • 来自相关话题

P2PKH: "Pay To Public Key Hash"

This is how transactions are made. You are requiring the sender to supply a valid signature (from the private key) and public key. The transaction output script will use the signature and public key and through some cryptographic functions will check if it matches with the public key hash, if it does, then the funds will be spendable. This method conceals your public key in the form of a hash for extra security.

P2PK: "Pay To Public Key"

This is similar to P2PKH; the difference is that it does not conceal your public key. Anyone using this method to send funds over the P2P network is showing people their public key in the transaction details.

P2SH: "Pay To Script Hash"

The outputs of a transaction are just scripts that, if are executed with specific parameters, will result in a boolean of true or false. If a miner runs the output script with the supplied parameters and results in true, the money will be sent to your desired output. P2SH is used for multi-signature wallets making the output scripts logic that checks for multiple signatures before accepting the transaction. P2SH can also be used to allow anyone, or no one, to spend the funds. If the output script of a P2SH transaction is just 1 for true, then attempting to spend the output without supplying parameters will just result in 1 making the money spendable by anyone who tries. This also applies to scripts that return 0, making the output spendable by no one.


P2WPKH: "Pay To Witness Public Key Hash"

This was a feature of segwit which stands for Segregated Witness. Instead of using scriptSigparameters to check the transaction validity, there is a new part of the transaction called witnesswhere the validity occurs. 查看全部
P2PKH: "Pay To Public Key Hash"

This is how transactions are made. You are requiring the sender to supply a valid signature (from the private key) and public key. The transaction output script will use the signature and public key and through some cryptographic functions will check if it matches with the public key hash, if it does, then the funds will be spendable. This method conceals your public key in the form of a hash for extra security.

P2PK: "Pay To Public Key"

This is similar to P2PKH; the difference is that it does not conceal your public key. Anyone using this method to send funds over the P2P network is showing people their public key in the transaction details.

P2SH: "Pay To Script Hash"

The outputs of a transaction are just scripts that, if are executed with specific parameters, will result in a boolean of true or false. If a miner runs the output script with the supplied parameters and results in true, the money will be sent to your desired output. P2SH is used for multi-signature wallets making the output scripts logic that checks for multiple signatures before accepting the transaction. P2SH can also be used to allow anyone, or no one, to spend the funds. If the output script of a P2SH transaction is just 1 for true, then attempting to spend the output without supplying parameters will just result in 1 making the money spendable by anyone who tries. This also applies to scripts that return 0, making the output spendable by no one.


P2WPKH: "Pay To Witness Public Key Hash"

This was a feature of segwit which stands for Segregated Witness. Instead of using scriptSigparameters to check the transaction validity, there is a new part of the transaction called witnesswhere the validity occurs.

什么是比特币的hash验证

区块链技术刘登丰 发表了文章 • 0 个评论 • 208 次浏览 • 2018-03-14 18:36 • 来自相关话题

哈希是将一大段的内容用hash算法转换成一个特定字节长度的过程,其目的是为了防止内容的篡改。
比特币交易中,为了防止交易被篡改,会将交易通过merkle tree方式封装后计算其hash值并存放在区块中,
当区块被全网认可接受之前,会对区块中的交易进行merkle tree方式的封装并计算其hash值,然后与区块中的hash值进行比较,如果不相同,该区块会被拒绝。
最后强调一点,
哈希不是加密!
哈希不是加密!
哈希不是加密! 查看全部
哈希是将一大段的内容用hash算法转换成一个特定字节长度的过程,其目的是为了防止内容的篡改。
比特币交易中,为了防止交易被篡改,会将交易通过merkle tree方式封装后计算其hash值并存放在区块中,
当区块被全网认可接受之前,会对区块中的交易进行merkle tree方式的封装并计算其hash值,然后与区块中的hash值进行比较,如果不相同,该区块会被拒绝。
最后强调一点,
哈希不是加密!
哈希不是加密!
哈希不是加密!

Ubuntu:搭建以太坊开发环境

技术交流guazi 回复了问题 • 2 人关注 • 1 个回复 • 808 次浏览 • 2018-03-14 18:16 • 来自相关话题

wifidog 与 apfree wifidog 那个更好

WiFi矿机guazi 回复了问题 • 2 人关注 • 3 个回复 • 211 次浏览 • 2018-03-14 18:15 • 来自相关话题

[区块链技术] 吐血推荐!区块链从入门到放弃(区块链入门汇总整理)

区块链技术guazi 回复了问题 • 2 人关注 • 2 个回复 • 244 次浏览 • 2018-03-14 18:05 • 来自相关话题

现在区块链主要应用在哪方面?

区块链技术guazi 回复了问题 • 3 人关注 • 1 个回复 • 165 次浏览 • 2018-03-14 17:36 • 来自相关话题

币的匿名性是怎么做到的

区块链技术刘登丰 发表了文章 • 0 个评论 • 120 次浏览 • 2018-03-14 16:09 • 来自相关话题

 作者:MTTP
链接: https://www.zhihu.com/question/61198789/answer/187240292
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Zcash通过零知识证明za-SNARKs(零知识简洁非互动性知识参数)实现UTXO模式下交易信息的完全隐藏。在Zcash网络中发起一笔转账不需要写明转账的目标地址,而是将一个零知识证明链下发送给对方即可。当然发送交易的同时需要在区块链记录一些信息,但这些信息不会泄露交易的具体信息,包括对方帐号和交易金额。Corda解决链上数据隐私的方法是只在有权阅读数据的双方间建立共识网络,这样从根本上避免了数据泄露的风险。Hyperledger Fabric 0.6版中通过普通加密的方法解决区块链上数据隐私的问题,通过维护一棵分层的密钥树,实现对数据的分级加密。Monero通过两个关键技术:隐蔽地址和环签名,实现了不依赖于中心节点的加密混合方案。隐蔽地址是为了解决输入输出地址关联性的问题,环签名是用于保证交易地址的不可追踪性。除了交易地址,交易金额也会暴露部分隐私。门罗币还提供了一种叫做环状保密交易(RingCT)的技术来同时隐藏交易地址以及交易金额。闪电网络和最近的Aeternity 项目利用状态通道保护交易数据。状态通道的原理是,不在区块链上记录每一笔交易记录,而是隔一段时间记录一次状态变化,这样就不会透露单笔交易信息。交易双方会链下保存交易信息,当发生纠纷时,链下保存的信息可以结合链上信息一起解决问题。
  查看全部

 作者:MTTP
链接: https://www.zhihu.com/question/61198789/answer/187240292
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Zcash通过零知识证明za-SNARKs(零知识简洁非互动性知识参数)实现UTXO模式下交易信息的完全隐藏。在Zcash网络中发起一笔转账不需要写明转账的目标地址,而是将一个零知识证明链下发送给对方即可。当然发送交易的同时需要在区块链记录一些信息,但这些信息不会泄露交易的具体信息,包括对方帐号和交易金额。Corda解决链上数据隐私的方法是只在有权阅读数据的双方间建立共识网络,这样从根本上避免了数据泄露的风险。Hyperledger Fabric 0.6版中通过普通加密的方法解决区块链上数据隐私的问题,通过维护一棵分层的密钥树,实现对数据的分级加密。Monero通过两个关键技术:隐蔽地址和环签名,实现了不依赖于中心节点的加密混合方案。隐蔽地址是为了解决输入输出地址关联性的问题,环签名是用于保证交易地址的不可追踪性。除了交易地址,交易金额也会暴露部分隐私。门罗币还提供了一种叫做环状保密交易(RingCT)的技术来同时隐藏交易地址以及交易金额。闪电网络和最近的Aeternity 项目利用状态通道保护交易数据。状态通道的原理是,不在区块链上记录每一笔交易记录,而是隔一段时间记录一次状态变化,这样就不会透露单笔交易信息。交易双方会链下保存交易信息,当发生纠纷时,链下保存的信息可以结合链上信息一起解决问题。
 

比特币开发专题(交易平台基本原理和指南)

开源讨论wangyin 发表了文章 • 1 个评论 • 115 次浏览 • 2018-03-14 15:26 • 来自相关话题

许多人都在猜测比特币和USD之间的价格将会如何波动, 并在寻找如何以比特币价格基础来进行评估、定价、交易以及投机的方法。本篇指导文章会解释:假设在市场中有理性的参与者尝试获利时,“市场锚定”将会起到何种作用。


如果某人持有大量资金,但又不想通过交易来获利的话,那么所有市场都会有被操纵的风险。而随着市场规模成长,操纵市场的难度就会上升。因为比特币(BitCNY、BitEUR等)是由比特币所背书, 对比特币的攻击也将攻击到比特币(反之亦然)。因此无论攻击那一边的市场,攻击者都将会承受经济损失。


*攻击方法不包含在这篇文章之内,如想详细了解可以查看:


为简单起见, 本篇指南将聚焦在比特币上,但内容也同样适用于其他比特资产。其中的核心概念是:比特币交易价格的基础是要接近市场共识对于其未来价格的预测。这基于一项基本事实:平仓比特币的唯一途径,就是通过未来的市场价格触发的自动交易。


比特币所扎根的共识在于:1 比特币的价值应该和1美元的价值相等。因此,除非有什么情况让这个共识发生变化,否则最有利可图的交易应当是在比特币价值低于1美元时买入,在高于1美元时卖出。如果你反其道而行, 这表示你认为其他人将会做和你一样的事情,但目前为止我们没有想到这么做的理由。


然而,这项基本建议只适用于一种类型的交易者: 那些通过收取小额费用提供给比特币高流通性的交易者(供应商)。但市场上还有其他类型交易者, 我想要探讨这些交易者将如何影响比特币价格。


看涨比特币者


看涨比特币的人会想要看空比特币,因为他们认为将来能够以更便宜的价格买回。对这些人而言,即使比特币的价格稍微低于美元,他们仍然会想要做空比特币,因为他们预期比特币相对于比特币的价格将会下跌,这样能够从做空中获利。这种情况下, 看涨比特币者将会在低于1美元的价位做空比特币,从而为想要获得廉价美元的人创造出买入位。这其实等同于看空比特币者(看涨比特币)支付溢价(或利息)给看多比特币者(看跌比特币),并因此他们可以结束空仓位。


看跌比特币者


这些人则是认为比特币相对于美元的价格被高估了,并预期美元会涨价。或许他们认为比特币正在泡沫化。看跌比特币者将会在高于市场共识价格的时候买入比特币,并因此支付利息(溢价)给卖空者以保证价格稳定。


做市商


这些市场参与者并不想预测市场的长期走向,他们只观察短期内比特币和USD之间的价格波动。做市商知道:BitSUD和USD之间的价格变化是基于比特币和USD之间的资金流动净值,并造成锚定偏差,直到更多的资金被价差所吸引(也就是背后的利益)。


看涨者和看跌者的心理价位之间会出现拉锯的局面,会造成过渡阶段的锚定偏差,直到价格再次稳定。


寻求以数学方式来解释的人们,可以将比特币相对于USD价格预期的偏差看作和USD/比特币价格曲线里的一阶导数相关连。假设绿线代表比特币相对于USD价格的长期趋势,红线是一阶导数并基于市场的方向进行震荡。


比特币-trading-guide


做市商依照红线趋势进行交易,而看涨看跌者则是依照绿线趋势进行交易。依照红线趋势交易的人,是假设绿线迟早会变换方向,并因此能够通过预测获利。对于这些可预期利润的竞争,将会使锚定机制在所有市场环境下都非常牢固。当市场规模变得越大,有了更多的自动交易机器人以及提供流动性的供应商进场之后,价格的偏离就会越小,因为搬砖的“时间范围”将会大幅萎缩。


市场撮合算法


比特股X使用了非传统的挂撮合配算法。该算法将总是匹配给购买者“恰好”他们所要求的价格,而非传统的挂单撮合算法:让他们“至少”得到他们所要求的价格,或甚至更多。当最高买单价格大于最低卖单时,其中的差价就被网络获取作为手续费。在比特股X当中买家和卖家并没有差别,因为用USD买入比特币和用比特币买入USD本质是一样的。交易的双方都能得到他们所要求的价格,而非得到相同的价格。其中的差价被网络保留为手续费。


采用这种算法,是为了通过产生与单一回合的订单数量成正比的手续费,来惩罚那些藉由击穿订单来操纵市场的作恶者。这样的设计,用意在强化基于价值的投资,而不鼓励技术性投机。这预期将会减少波动性以及流动性,因为网络上的扰乱交易(trading noise)被消除了。对于只得到他们所要求的价格,市场参与者应该不会抱怨,并因此他们应该只按照他们认为公平的价格下单。


最大价格波动


做空的能力,以及执行追加保证金的价位,都受到价格的移动平均数所限制。价格移动平均数变化的速度和幅度,限制在每10秒0.09%。这个平均值相当于每小时33%。这些限价措施并不会影响卖出比特币来获得比特币的人们,只适用于寻求做空或追加保证金的人们。这些限制的目的是给市场时间来反击潜在的操纵攻击市场行为。


补平空仓


如果你看涨比特币并且想要通过做空比特币进行杠杆操作,你将会需要在预测错误时维持足够的抵押金。你需要在下单时锁定一些作为抵押的比特币,但是你还需要维持足够的额外比特币,以买入补仓所需的USD。


但你不能够使用作为抵押的比特币来买补仓所需的USD!


因此做空所需的比特币数量,等于建仓所需的1倍比特币数量,以及额外的1倍以上比特币作为抵押金,以让你在需要时可以先不用赎回就可以补仓。


直到仓位完全补平之前,你拿不回任何抵押金。所以如果你部分补平你的空仓, 那么剩余的比特币将会有充足的抵押金做背书。


爆仓


当最高的买价低于赎回价格(并高于移动平均数的2/3)时,你的空仓将会自动被补平。赎回价格的定义是: 当你要买回所欠的USD,需要花费相当于你抵押金75%的价位。当开始赎回时,你的抵押金会被用于买入比特币。另外,在补平空仓之后如果还有剩余抵押金,那么其中的95%将会返回空仓,另外的5%则被网络保留为手续费。


增加保证金


长线交易者可能会希望避免由于短期市场波动造成必须追加保证金的情况发生。那么最简单的做法就是,他们可以藉由部分补仓来增加保证金。 查看全部
许多人都在猜测比特币和USD之间的价格将会如何波动, 并在寻找如何以比特币价格基础来进行评估、定价、交易以及投机的方法。本篇指导文章会解释:假设在市场中有理性的参与者尝试获利时,“市场锚定”将会起到何种作用。


如果某人持有大量资金,但又不想通过交易来获利的话,那么所有市场都会有被操纵的风险。而随着市场规模成长,操纵市场的难度就会上升。因为比特币(BitCNY、BitEUR等)是由比特币所背书, 对比特币的攻击也将攻击到比特币(反之亦然)。因此无论攻击那一边的市场,攻击者都将会承受经济损失。


*攻击方法不包含在这篇文章之内,如想详细了解可以查看:


为简单起见, 本篇指南将聚焦在比特币上,但内容也同样适用于其他比特资产。其中的核心概念是:比特币交易价格的基础是要接近市场共识对于其未来价格的预测。这基于一项基本事实:平仓比特币的唯一途径,就是通过未来的市场价格触发的自动交易。


比特币所扎根的共识在于:1 比特币的价值应该和1美元的价值相等。因此,除非有什么情况让这个共识发生变化,否则最有利可图的交易应当是在比特币价值低于1美元时买入,在高于1美元时卖出。如果你反其道而行, 这表示你认为其他人将会做和你一样的事情,但目前为止我们没有想到这么做的理由。


然而,这项基本建议只适用于一种类型的交易者: 那些通过收取小额费用提供给比特币高流通性的交易者(供应商)。但市场上还有其他类型交易者, 我想要探讨这些交易者将如何影响比特币价格。


看涨比特币者


看涨比特币的人会想要看空比特币,因为他们认为将来能够以更便宜的价格买回。对这些人而言,即使比特币的价格稍微低于美元,他们仍然会想要做空比特币,因为他们预期比特币相对于比特币的价格将会下跌,这样能够从做空中获利。这种情况下, 看涨比特币者将会在低于1美元的价位做空比特币,从而为想要获得廉价美元的人创造出买入位。这其实等同于看空比特币者(看涨比特币)支付溢价(或利息)给看多比特币者(看跌比特币),并因此他们可以结束空仓位。


看跌比特币者


这些人则是认为比特币相对于美元的价格被高估了,并预期美元会涨价。或许他们认为比特币正在泡沫化。看跌比特币者将会在高于市场共识价格的时候买入比特币,并因此支付利息(溢价)给卖空者以保证价格稳定。


做市商


这些市场参与者并不想预测市场的长期走向,他们只观察短期内比特币和USD之间的价格波动。做市商知道:BitSUD和USD之间的价格变化是基于比特币和USD之间的资金流动净值,并造成锚定偏差,直到更多的资金被价差所吸引(也就是背后的利益)。


看涨者和看跌者的心理价位之间会出现拉锯的局面,会造成过渡阶段的锚定偏差,直到价格再次稳定。


寻求以数学方式来解释的人们,可以将比特币相对于USD价格预期的偏差看作和USD/比特币价格曲线里的一阶导数相关连。假设绿线代表比特币相对于USD价格的长期趋势,红线是一阶导数并基于市场的方向进行震荡。


比特币-trading-guide


做市商依照红线趋势进行交易,而看涨看跌者则是依照绿线趋势进行交易。依照红线趋势交易的人,是假设绿线迟早会变换方向,并因此能够通过预测获利。对于这些可预期利润的竞争,将会使锚定机制在所有市场环境下都非常牢固。当市场规模变得越大,有了更多的自动交易机器人以及提供流动性的供应商进场之后,价格的偏离就会越小,因为搬砖的“时间范围”将会大幅萎缩。


市场撮合算法


比特股X使用了非传统的挂撮合配算法。该算法将总是匹配给购买者“恰好”他们所要求的价格,而非传统的挂单撮合算法:让他们“至少”得到他们所要求的价格,或甚至更多。当最高买单价格大于最低卖单时,其中的差价就被网络获取作为手续费。在比特股X当中买家和卖家并没有差别,因为用USD买入比特币和用比特币买入USD本质是一样的。交易的双方都能得到他们所要求的价格,而非得到相同的价格。其中的差价被网络保留为手续费。


采用这种算法,是为了通过产生与单一回合的订单数量成正比的手续费,来惩罚那些藉由击穿订单来操纵市场的作恶者。这样的设计,用意在强化基于价值的投资,而不鼓励技术性投机。这预期将会减少波动性以及流动性,因为网络上的扰乱交易(trading noise)被消除了。对于只得到他们所要求的价格,市场参与者应该不会抱怨,并因此他们应该只按照他们认为公平的价格下单。


最大价格波动


做空的能力,以及执行追加保证金的价位,都受到价格的移动平均数所限制。价格移动平均数变化的速度和幅度,限制在每10秒0.09%。这个平均值相当于每小时33%。这些限价措施并不会影响卖出比特币来获得比特币的人们,只适用于寻求做空或追加保证金的人们。这些限制的目的是给市场时间来反击潜在的操纵攻击市场行为。


补平空仓


如果你看涨比特币并且想要通过做空比特币进行杠杆操作,你将会需要在预测错误时维持足够的抵押金。你需要在下单时锁定一些作为抵押的比特币,但是你还需要维持足够的额外比特币,以买入补仓所需的USD。


但你不能够使用作为抵押的比特币来买补仓所需的USD!


因此做空所需的比特币数量,等于建仓所需的1倍比特币数量,以及额外的1倍以上比特币作为抵押金,以让你在需要时可以先不用赎回就可以补仓。


直到仓位完全补平之前,你拿不回任何抵押金。所以如果你部分补平你的空仓, 那么剩余的比特币将会有充足的抵押金做背书。


爆仓


当最高的买价低于赎回价格(并高于移动平均数的2/3)时,你的空仓将会自动被补平。赎回价格的定义是: 当你要买回所欠的USD,需要花费相当于你抵押金75%的价位。当开始赎回时,你的抵押金会被用于买入比特币。另外,在补平空仓之后如果还有剩余抵押金,那么其中的95%将会返回空仓,另外的5%则被网络保留为手续费。


增加保证金


长线交易者可能会希望避免由于短期市场波动造成必须追加保证金的情况发生。那么最简单的做法就是,他们可以藉由部分补仓来增加保证金。

Ubuntu下从源码编译比特币qt客户端(Bitcoin-qt)教程

开源讨论wangyin 发表了文章 • 1 个评论 • 152 次浏览 • 2018-03-14 15:22 • 来自相关话题

以前看过龙少这篇Windows下的教程,《VC编译调试比特币源码》,搞了半天没搞定。。最近装了个Ubuntu玩玩,于是想再试试,编译安装成功,有兴趣的可以试试。
我的系统版本 Ubuntu 14.04,可以装双系统也可以装虚拟机,至于怎么装Ubuntu可以另外搜索。




1,先安装一些必要的依赖库(见参考资料(3),反正能装的都装上,具体作用可见参考资料)sudo apt-get install build-essential libtool autotools-dev autoconf pkg-config libssl-dev libevent-dev复制代码sudo apt-get install libboost-all-dev复制代码sudo apt-get install libdb4.8-dev libdb4.8++-dev复制代码sudo apt-get install libminiupnpc-dev复制代码sudo apt-get install libqt4-dev libprotobuf-dev protobuf-compiler复制代码sudo apt-get install libqrencode-dev复制代码
这几个工具没装的也要装一下(已经装的会自动略过):sudo apt-get install make gcc g++ git复制代码
2,下载源码git clone https://github.com/bitcoin/bitcoin.git复制代码
用git拉可能很慢,可以直接去 https://github.com/bitcoin/bitcoin 右下角下载zip压缩包就行了

3,git clone的直接进入目录cd bitcoin复制代码
下载的解压后进入文件夹后打开终端

4,./autogen.sh复制代码
执行这一步,如果这一步有问题可能上面的依赖没装完整,看提示没问题的话继续下一步

5,./configure复制代码
如果你遇到这样的提示:configure: error: Found Berkeley DB other than 4.8, required for portable wallets 那就可以这样:./configure --with-incompatible-bdb复制代码
看提示没问题的话继续下一步

6,make复制代码
开始编译,我的电脑大约10分钟,然后安装编译好的二进制文件

7,sudo make install复制代码
8,接下来就可以运行了bitcoin-qt复制代码


当然,这个只可以玩玩,不能正式使用哦 查看全部
以前看过龙少这篇Windows下的教程,《VC编译调试比特币源码》,搞了半天没搞定。。最近装了个Ubuntu玩玩,于是想再试试,编译安装成功,有兴趣的可以试试。
我的系统版本 Ubuntu 14.04,可以装双系统也可以装虚拟机,至于怎么装Ubuntu可以另外搜索。




1,先安装一些必要的依赖库(见参考资料(3),反正能装的都装上,具体作用可见参考资料)sudo apt-get install build-essential libtool autotools-dev autoconf pkg-config libssl-dev libevent-dev复制代码sudo apt-get install libboost-all-dev复制代码sudo apt-get install libdb4.8-dev libdb4.8++-dev复制代码sudo apt-get install libminiupnpc-dev复制代码sudo apt-get install libqt4-dev libprotobuf-dev protobuf-compiler复制代码sudo apt-get install libqrencode-dev复制代码
这几个工具没装的也要装一下(已经装的会自动略过):sudo apt-get install make gcc g++ git复制代码
2,下载源码git clone https://github.com/bitcoin/bitcoin.git复制代码
用git拉可能很慢,可以直接去 https://github.com/bitcoin/bitcoin 右下角下载zip压缩包就行了

3,git clone的直接进入目录cd bitcoin复制代码
下载的解压后进入文件夹后打开终端

4,./autogen.sh复制代码
执行这一步,如果这一步有问题可能上面的依赖没装完整,看提示没问题的话继续下一步

5,./configure复制代码
如果你遇到这样的提示:configure: error: Found Berkeley DB other than 4.8, required for portable wallets 那就可以这样:./configure --with-incompatible-bdb复制代码
看提示没问题的话继续下一步

6,make复制代码
开始编译,我的电脑大约10分钟,然后安装编译好的二进制文件

7,sudo make install复制代码
8,接下来就可以运行了bitcoin-qt复制代码


当然,这个只可以玩玩,不能正式使用哦

Ubuntu下geth搭建私有链+部署智能合约+与合约交互笔记

开源讨论wangyin 发表了文章 • 0 个评论 • 167 次浏览 • 2018-03-14 15:19 • 来自相关话题

最近在学习以太坊,就把一点学习笔记记录分享下来,希望对刚入门跟我一样迷茫的人有点帮助。
首先,所有需要用到的指令都在https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console ,多记住一些方法方便使用
第一步:按照官方文档,安装好Geth客户端(https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum),这个比较简单。
第二步:搭建自己的私有链
搭建私有链之前应该准备的东西:Custom Genesis File
Custom Data Directory
Custom NetworkID
(Recommended) Disable Node Discovery
Genesis file: 创世区块是所有区块的根,区块链开始的地方--第一块、区块0、以及仅有的一块没有父区块的区块。协议保证了不会有其他节点根你的版本的区块链达成一致,除非他们跟你有相同的创世区块,因此,只要你想,你就可以创建任意多个私有测试区块链。
CustomGenesis.json
{
"nonce": "0x0000000000000042", "timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0", "gasLimit": "0x8000000", "difficulty": "0x400",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333", "alloc": { }
}
稍后你将会用到这个文件:geth init /path/to/CustomGenesis.json
用于私有网络的命令行参数
--nodiscover 使用这个参数,你的节点就不会被其他人发现,除非手动添加你的节点。否则,就只有一个被无意添加到一个陌生区块链上的机会,那就是跟你有相同的genesis文件和networkID。
--maxpeers 0 如果你不想有人连上你的测试链,就用maxpeers 0。或者,你可以调整参数,当你确切的知道有几个节点要连接上来的时候。
--rpc 允许RPC操作你的节点。这个参数在Geth上是默认的。
--rpcapi "db,eth,net,web3" 这个命令指示了允许通过RPC访问的命令。默认情况下,Geth允许web3。
--rpcport "8080"
--rpccorsdomain "http://chriseth.github.io/browser-solidity/"
--datadir "/home/TestChain1" 私有链存放路径(最好跟公有链路径不同)
--port "30303" 网络监听端口,用来和其他节点手动连接
--identity “TestnetMainNode" 用来标识你的节点的,方便在一大群节点中识别出自己的节点
了解完上面这几个内容之后,就可以开始搭建自己的私有链了,用如下命令:
geth --identity "MyNodeName" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir "/home/to/TestCahin1" --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 init /path/to/CustomGenesis.json
上面这条命令就初始化了创世区块,存放区块链数据的路径"/home/to/TestCahin1"根据自己需要修改一下。/path/to/CustomGenesis.json为存放CustomGenesis.json的地方。下面进入geth客户端:
geth --identity "MyNodeName" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir "/home/to/TestCahin1" --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 console
现在就进入到了自己的私有链中,启动成功之后会显示如下图:
我的就存放在自己用户目录下的etherTest目录下。如果觉得每次进入客户端时要写这么一大堆指令很麻烦,完全可以把它写到一个文件中,给文件赋予可执行权限,就不必这么麻烦了。例如,我把这个指令写在了gethLaunch文件下:
#!/bin/bash
geth --identity "asurily" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir ~/etherTest --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 console
然后执行chmod +x gethLaunch
这样我就不必每次都都输入那么一长串了,直接输入gethLaunch就可以了。
第三步、创建与部署智能合约
1、首先得有一个有ether的账户
私有链中,ether很容易获得。用personal.newAccount("111")创建一个账户,111为密码。然后可以用eth.accounts查看所有的账户。
可以看见我创建成功,并且查看了有几个账户。
以太坊中默认第一个地址为今后的挖矿分配奖金的地址,当然可以修改这个地址。miner.setEtherbase(eth.accounts[1])进行地址更换;
刚创建的账户中余额为0,可以用eth.getBalance("0xa65bf431f4f07a22296dc93a7e6f4fe57642bee6")查看余额。如果是第一个地址,启用挖矿miner.start(),稍等一下就能有余额了。
如果你不想进行挖矿,也有一个方法获得ether,就是在CustomGenesis.jso文件中加入
"alloc":
{
"<your account address e.g. 0x1fb891f92eb557f4d688463d0d7c560552263b5a>":
{ "balance": "20000000000000000000" }
}
然后再重新初始化,就能在你的账户中出现20个ether。
2、创建和部署智能合约
我就是部署的官网上的示例。
1)编写智能合约源代码:source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
2)编译:contract = eth.compile.solidity(source).test。本来编译之后得到的是一个map类型,test就是那个key,所以这样就能得到相应的对象了。
保存下其中的code和abiDefinition,后面会用上:
code = contract.code
abi = contract.info.abiDefinition
3)创建智能合约对象:MyContract = eth.contract(abi)。
4)部署合约。部署合约就是向以太坊上发送一个交易,目的地址不写就是发送给区块链。
contract = MyContract.new(arg1, arg2, ..., {from: primaryAddress, data: evmByteCodeFromPreviousSection})
例如:contract = MyContract.new({from:eth.accounts[0],data:code})
此时,可能会提示你账户不可用,就是没有解锁,用personal.unlockAccount()解锁即可。然后在部署,会得到如下所示:
如上所示,此时的地址是undefined,因为交易才发送出去,没有矿工挖矿,没有写进区块链,所以还不知道。现在可以用txpool.status查看到
启动挖矿,把交易写进区块链。miner.start(),然后关闭挖矿miner.stop()
挖矿之后,交易就写进区块链了。此时再查看contract就能看见有地址了:
至此,合约成功部署在了以太坊上。
5)与合约交互
我们把合约部署到以太坊上不是目的,目的是能与部署在以太坊上的合约进行交互。
与合约交互要用到两个东西,abi和address。abi(应用程序二进制接口)用来创建合约对象;合约地址address用来定位在以太坊上的那个地址的合约。
创建合约对象:Multiply7 = eth.contract(abi);
定位在addres处的那个合约:myMultiply7 = Multiply7.at(address)
调用合约中的方法,应该有两种方式进行调用,一是call(),它直接返回结果,不会写进区块链;二是sendTransaction(),它是一笔交易,会写到区块链中,返回值是交易的哈希值。
成功得到结果。
第四步、再次调用部署好的合约
之前一直没有弄明白,既然合约都已经部署好了在区块链上,那么下次肯定还会再次调用它,但是我一直都不知道怎么调用它。虽然现在也不怎么明白,好像有register之类的方法,还没完全弄清楚。现在我的笨方法就是保存下来合约地址根合约的abi。既然调用合约时的两个重要步骤就是用abi创建合约对象和定位区块链中合约,所以就保存下来abi和address。
退出私有链,然后重新进入,那么之前所有的变量都不存在了。
记录abi:
记录地址:
然后就能成功调用address处的合约了。
  查看全部

最近在学习以太坊,就把一点学习笔记记录分享下来,希望对刚入门跟我一样迷茫的人有点帮助。
首先,所有需要用到的指令都在https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console ,多记住一些方法方便使用
第一步:按照官方文档,安装好Geth客户端(https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum),这个比较简单。
第二步:搭建自己的私有链
搭建私有链之前应该准备的东西:Custom Genesis File
Custom Data Directory
Custom NetworkID
(Recommended) Disable Node Discovery
Genesis file: 创世区块是所有区块的根,区块链开始的地方--第一块、区块0、以及仅有的一块没有父区块的区块。协议保证了不会有其他节点根你的版本的区块链达成一致,除非他们跟你有相同的创世区块,因此,只要你想,你就可以创建任意多个私有测试区块链。
CustomGenesis.json
{
"nonce": "0x0000000000000042", "timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0", "gasLimit": "0x8000000", "difficulty": "0x400",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333", "alloc": { }
}
稍后你将会用到这个文件:geth init /path/to/CustomGenesis.json
用于私有网络的命令行参数
--nodiscover 使用这个参数,你的节点就不会被其他人发现,除非手动添加你的节点。否则,就只有一个被无意添加到一个陌生区块链上的机会,那就是跟你有相同的genesis文件和networkID。
--maxpeers 0 如果你不想有人连上你的测试链,就用maxpeers 0。或者,你可以调整参数,当你确切的知道有几个节点要连接上来的时候。
--rpc 允许RPC操作你的节点。这个参数在Geth上是默认的。
--rpcapi "db,eth,net,web3" 这个命令指示了允许通过RPC访问的命令。默认情况下,Geth允许web3。
--rpcport "8080"
--rpccorsdomain "http://chriseth.github.io/browser-solidity/&quot;
--datadir "/home/TestChain1" 私有链存放路径(最好跟公有链路径不同)
--port "30303" 网络监听端口,用来和其他节点手动连接
--identity “TestnetMainNode" 用来标识你的节点的,方便在一大群节点中识别出自己的节点
了解完上面这几个内容之后,就可以开始搭建自己的私有链了,用如下命令:
geth --identity "MyNodeName" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir "/home/to/TestCahin1" --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 init /path/to/CustomGenesis.json
上面这条命令就初始化了创世区块,存放区块链数据的路径"/home/to/TestCahin1"根据自己需要修改一下。/path/to/CustomGenesis.json为存放CustomGenesis.json的地方。下面进入geth客户端:
geth --identity "MyNodeName" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir "/home/to/TestCahin1" --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 console
现在就进入到了自己的私有链中,启动成功之后会显示如下图:
我的就存放在自己用户目录下的etherTest目录下。如果觉得每次进入客户端时要写这么一大堆指令很麻烦,完全可以把它写到一个文件中,给文件赋予可执行权限,就不必这么麻烦了。例如,我把这个指令写在了gethLaunch文件下:
#!/bin/bash
geth --identity "asurily" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir ~/etherTest --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 console
然后执行chmod +x gethLaunch
这样我就不必每次都都输入那么一长串了,直接输入gethLaunch就可以了。
第三步、创建与部署智能合约
1、首先得有一个有ether的账户
私有链中,ether很容易获得。用personal.newAccount("111")创建一个账户,111为密码。然后可以用eth.accounts查看所有的账户。
可以看见我创建成功,并且查看了有几个账户。
以太坊中默认第一个地址为今后的挖矿分配奖金的地址,当然可以修改这个地址。miner.setEtherbase(eth.accounts[1])进行地址更换;
刚创建的账户中余额为0,可以用eth.getBalance("0xa65bf431f4f07a22296dc93a7e6f4fe57642bee6")查看余额。如果是第一个地址,启用挖矿miner.start(),稍等一下就能有余额了。
如果你不想进行挖矿,也有一个方法获得ether,就是在CustomGenesis.jso文件中加入
"alloc":
{
"<your account address e.g. 0x1fb891f92eb557f4d688463d0d7c560552263b5a>":
{ "balance": "20000000000000000000" }
}
然后再重新初始化,就能在你的账户中出现20个ether。
2、创建和部署智能合约
我就是部署的官网上的示例。
1)编写智能合约源代码:source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
2)编译:contract = eth.compile.solidity(source).test。本来编译之后得到的是一个map类型,test就是那个key,所以这样就能得到相应的对象了。
保存下其中的code和abiDefinition,后面会用上:
code = contract.code
abi = contract.info.abiDefinition
3)创建智能合约对象:MyContract = eth.contract(abi)。
4)部署合约。部署合约就是向以太坊上发送一个交易,目的地址不写就是发送给区块链。
contract = MyContract.new(arg1, arg2, ..., {from: primaryAddress, data: evmByteCodeFromPreviousSection})
例如:contract = MyContract.new({from:eth.accounts[0],data:code})
此时,可能会提示你账户不可用,就是没有解锁,用personal.unlockAccount()解锁即可。然后在部署,会得到如下所示:
如上所示,此时的地址是undefined,因为交易才发送出去,没有矿工挖矿,没有写进区块链,所以还不知道。现在可以用txpool.status查看到
启动挖矿,把交易写进区块链。miner.start(),然后关闭挖矿miner.stop()
挖矿之后,交易就写进区块链了。此时再查看contract就能看见有地址了:
至此,合约成功部署在了以太坊上。
5)与合约交互
我们把合约部署到以太坊上不是目的,目的是能与部署在以太坊上的合约进行交互。
与合约交互要用到两个东西,abi和address。abi(应用程序二进制接口)用来创建合约对象;合约地址address用来定位在以太坊上的那个地址的合约。
创建合约对象:Multiply7 = eth.contract(abi);
定位在addres处的那个合约:myMultiply7 = Multiply7.at(address)
调用合约中的方法,应该有两种方式进行调用,一是call(),它直接返回结果,不会写进区块链;二是sendTransaction(),它是一笔交易,会写到区块链中,返回值是交易的哈希值。
成功得到结果。
第四步、再次调用部署好的合约
之前一直没有弄明白,既然合约都已经部署好了在区块链上,那么下次肯定还会再次调用它,但是我一直都不知道怎么调用它。虽然现在也不怎么明白,好像有register之类的方法,还没完全弄清楚。现在我的笨方法就是保存下来合约地址根合约的abi。既然调用合约时的两个重要步骤就是用abi创建合约对象和定位区块链中合约,所以就保存下来abi和address。
退出私有链,然后重新进入,那么之前所有的变量都不存在了。
记录abi:
记录地址:
然后就能成功调用address处的合约了。