以太坊怎么了?Tetras提议看空ETH五益阳由

来源:http://www.njdw890.com 作者:美高梅游官网 人气:144 发布时间:2019-08-15
摘要:以太坊代币 ETH 创下今年以来最低点。让我们重读纽约加密货币对冲基金Tetras Capital 在上个月发出的研究报告。该机构看空ETH 走势,并提出做空 ETH 的五大理由。 本文介绍以太坊(Eth

以太坊代币 ETH 创下今年以来最低点。让我们重读纽约加密货币对冲基金 Tetras Capital 在上个月发出的研究报告。该机构看空ETH 走势,并提出做空 ETH 的五大理由。

本文介绍以太坊(Ethereum)的转账,依据web3j库实现。

当然,对于 ETH 走势,市场争议颇大。不少机构和投资者依然看好以太坊未来发展方向和投资前景。比如, Visa 负责合作事务的加密货币信徒 Cuy Sheffield 提出:即便 ETH 缺乏「储存价值」的功能,但是如果从保护国家安全的角度,或许 ETH 的价值是被低估的。

概念介绍

DSA一种公开密钥算法,它不能用作加密,只用作数字签名。参考
ECDSA椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的加密。生成的r、s签名值参考

撰文:Tetras Capital

一、解码钱包

也就是是根据用户密码从钱包读出keystore信息。这基本就是钱包生成的逆向流程。
1.将用户密码根据scrypt算法重新生成derivedKey.如下图红框所示,跟create()相互对照
2.根据derivedKey调用performCipherOperation()解密方法得到私钥。如下图蓝框所示,跟create()相互对照
3.将私钥传给ECKeyPair::create()便可重新得到公钥。具体调用Sign::publicKeyFromPrivate():BigInteger感兴趣的可以追进去看看。
4.根据ECKeyPair生成Credentials类,这个类主要包含ECKeyPair和钱包地址。
这个地方需要注意的是,钱包地址是重新根据公钥生成的,而不是从文件里读取出来。
大伙想一下这样做有什么好处?(安全呗,这不是p话么,放文件里被篡改了咋办。)

图片 1

decrypt.jpg

具体代码

//Wallet.java内解码钱包
public static ECKeyPair decrypt(String password, WalletFile walletFile)throws CipherException {
    validate(walletFile);
    WalletFile.Crypto crypto = walletFile.getCrypto();
    byte[] mac = Numeric.hexStringToByteArray(crypto.getMac());
    byte[] iv = Numeric.hexStringToByteArray(crypto.getCipherparams().getIv());
    byte[] cipherText = Numeric.hexStringToByteArray(crypto.getCiphertext());
    byte[] derivedKey;
    //获得scrypt加密的相关参数,并解码用户密码。
    WalletFile.KdfParams kdfParams = crypto.getKdfparams();
    if (kdfParams instanceof WalletFile.ScryptKdfParams) {
        WalletFile.ScryptKdfParams scryptKdfParams =
                (WalletFile.ScryptKdfParams) crypto.getKdfparams();
        int dklen = scryptKdfParams.getDklen();
        int n = scryptKdfParams.getN();
        int p = scryptKdfParams.getP();
        int r = scryptKdfParams.getR();
        byte[] salt = Numeric.hexStringToByteArray(scryptKdfParams.getSalt());
        derivedKey = generateDerivedScryptKey(
                password.getBytes(Charset.forName("UTF-8")), salt, n, r, p, dklen);
    } else if (kdfParams instanceof WalletFile.Aes128CtrKdfParams) {
        WalletFile.Aes128CtrKdfParams aes128CtrKdfParams =
                (WalletFile.Aes128CtrKdfParams) crypto.getKdfparams();
        int c = aes128CtrKdfParams.getC();
        String prf = aes128CtrKdfParams.getPrf();
        byte[] salt = Numeric.hexStringToByteArray(aes128CtrKdfParams.getSalt());
        derivedKey = generateAes128CtrDerivedKey(
                password.getBytes(Charset.forName("UTF-8")), salt, c, prf);
    } else {
        throw new CipherException("Unable to deserialize params: "   crypto.getKdf());
    }
    byte[] derivedMac = generateMac(derivedKey, cipherText);
    if (!Arrays.equals(derivedMac, mac)) {
        throw new CipherException("Invalid password provided");
    }
    byte[] encryptKey = Arrays.copyOfRange(derivedKey, 0, 16);
    //根据用户密码生成的encryptKey解码cipherText获得私钥
    byte[] privateKey = performCipherOperation(Cipher.DECRYPT_MODE, iv, encryptKey, cipherText);
    return ECKeyPair.create(privateKey);
}

//Credentials.java内,根据ECKeyPair参数重新获取地址并保存到当前类内。
public static Credentials create(ECKeyPair ecKeyPair) {
    String address = Numeric.prependHexPrefix(Keys.getAddress(ecKeyPair));
    return new Credentials(ecKeyPair, address);
}

经过上面的步骤我们便解码了钱包,后面就可以根据这些信息执行转账功能了。

编译:Perry Wang

二、获取Nonce

nonce:整数类型,会随着账户下的交易不断累加。作用是“防止交易的重播攻击”。
我们通过调用ethscan的相关接口查询到上次交易的nonce值,此值从0开始。

过去一年,区块链基础架构附加价值理论推动加密货币市场狂野上涨。现在我们看到,几乎每个区块链项目都把自己定位为「某某产业的区块链基础设施」,这些区块链网络上几乎所有的原生代币价格都一飞冲天。

三、代码处理

开始之前先介绍一个r、s、v的概念,其中r、s便是ECDSA签名值。v是chainid.
1.根据nonce以及gasPrice、gasLimit等初始化RawTransaction类
也就是交易描述文件。
RawTransaction.createTransaction()
2.根据描述文件生成byte文件。TransactionEncoder.signMessage()
此文件为在网络上传输的文件。此步骤会根据ECDSA进行数字签名以及加密。
3.调用api?action=eth_sendRawTransaction将描述文件发送到相关服务器。
4.服务器将此文件广播到ETH公链。
接口调用代码,具体见Github内TransactionService.kt类

class TransactionService : IntentService("Transaction Service") {

    private var builder: NotificationCompat.Builder? = null
    internal val mNotificationId = 153

    override fun onHandleIntent(intent: Intent?) {
        sendNotification()
        try {
            val fromAddress = intent!!.getStringExtra("FROM_ADDRESS")
            val toAddress = intent.getStringExtra("TO_ADDRESS")
            val amount = intent.getStringExtra("AMOUNT")
            val gas_price = intent.getStringExtra("GAS_PRICE")
            val gas_limit = intent.getStringExtra("GAS_LIMIT")
            val data = intent.getStringExtra("DATA")
            val password = intent.getStringExtra("PASSWORD")

            val keys = WalletStorage.getInstance(applicationContext).getFullWallet(applicationContext, password, fromAddress)

            EtherscanAPI.INSTANCE.getNonceForAddress(fromAddress)
                    .subscribe(
                            object : SingleObserver<NonceForAddress> {
                                override fun onSuccess(t: NonceForAddress) {
                                    if (t.result.length < 2) return

                                    val nonce = BigInteger(t.result.substring(2), 16)

                                    val tx = RawTransaction.createTransaction(
                                            nonce,
                                            BigInteger(gas_price),
                                            BigInteger(gas_limit),
                                            toAddress,
                                            BigDecimal(amount).multiply(ExchangeCalculator.ONE_ETHER).toBigInteger(),
                                            data
                                    )

                                    Log.d("Aaron",
                                            "Nonce: "   tx.nonce   "n"  
                                                    "gasPrice: "   tx.gasPrice   "n"  
                                                    "gasLimit: "   tx.gasLimit   "n"  
                                                    "To: "   tx.to   "n"  
                                                    "Amount: "   tx.value   "n"  
                                                    "Data: "   tx.data
                                    )

                                    val signed = TransactionEncoder.signMessage(tx, 1.toByte(), keys)

                                    forwardTX(signed)
                                }

                                override fun onSubscribe(d: Disposable) {
                                }

                                override fun onError(e: Throwable) {
                                    error("Can't connect to network, retry it later")
                                }

                            }
                    )

        } catch (e: Exception) {
            error("Invalid Wallet Password!")
            e.printStackTrace()
        }

    }

    @Throws(IOException::class)
    private fun forwardTX(signed: ByteArray) {

        EtherscanAPI.INSTANCE.forwardTransaction("0x"   Hex.toHexString(signed))
                .subscribe(
                        object : SingleObserver<ForwardTX> {
                            override fun onSuccess(t: ForwardTX) {
                                if (!TextUtils.isEmpty(t.result)) {
                                    suc(t.result)
                                } else {
                                    var errormsg = t.error.message
                                    if (errormsg.indexOf(".") > 0)
                                        errormsg = errormsg.substring(0, errormsg.indexOf("."))
                                    error(errormsg) // f.E Insufficient funds
                                }
                            }

                            override fun onSubscribe(d: Disposable) {
                            }

                            override fun onError(e: Throwable) {
                                error("Can't connect to network, retry it later")
                            }


                        }
                )
    }

    private fun suc(hash: String) {
        builder!!
                .setContentTitle(getString(R.string.notification_transfersuc))
                .setProgress(100, 100, false)
                .setOngoing(false)
                .setAutoCancel(true)
                .setContentText("")

        val main = Intent(this, MainActivity::class.java)
        main.putExtra("STARTAT", 2)
        main.putExtra("TXHASH", hash)

        val contentIntent = PendingIntent.getActivity(this, 0,
                main, PendingIntent.FLAG_UPDATE_CURRENT)
        builder!!.setContentIntent(contentIntent)

        val mNotifyMgr = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        mNotifyMgr.notify(mNotificationId, builder!!.build())
    }

    private fun error(err: String) {
        builder!!
                .setContentTitle(getString(R.string.notification_transferfail))
                .setProgress(100, 100, false)
                .setOngoing(false)
                .setAutoCancel(true)
                .setContentText(err)

        val main = Intent(this, MainActivity::class.java)
        main.putExtra("STARTAT", 2)

        val contentIntent = PendingIntent.getActivity(this, 0,
                main, PendingIntent.FLAG_UPDATE_CURRENT)
        builder!!.setContentIntent(contentIntent)

        val mNotifyMgr = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        mNotifyMgr.notify(mNotificationId, builder!!.build())
    }

    private fun sendNotification() {
        builder = NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setColor(0x2d435c)
                .setTicker(getString(R.string.notification_transferingticker))
                .setContentTitle(getString(R.string.notification_transfering_title))
                .setContentText(getString(R.string.notification_might_take_a_minute))
                .setOngoing(true)
                .setProgress(0, 0, true)
        val mNotifyMgr = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        mNotifyMgr.notify(mNotificationId, builder!!.build())
    }


}

Git地址:https://github.com/snailflying/ETH_Wallet_Kotlin

创业家们争先恐后打造各种去中心化社区、区块链和代币,其实这些不仅不是必需品,在某些案例中,甚至对其支撑的产业体系还有害无益。监管尚不确定,此外加密货币资产捕获的价值比起传统私募投资要高出多个数量级,几乎到了荒谬的程度,加密货币资产的估值也螺旋攀升至更高。

以太坊及其原生代币 Ether ETH,是这场狂欢中的主角。近期 ETH 价格大跌,这显示过去一年的投机行为将它抬到创纪录高点位置,但现在这种助推力已然枯竭。

ETH 享受到非理性牛市的福利爬得越高,不可避免就会跌得越深。

我们认为 ETH 当前价格依然估值过高,依然与以太坊当前及不远将来的技术状态严重脱钩。我们的研究得出如下结论:以太坊的市场和技术远未成熟到能支撑起 ETH 目前估值的状态。

ETH 币价的大涨都是源于投机炒币,我们认为目前市场不够完善,不足以正确评估风险或一般经济问题。

表面看,以太坊生态的部分关键指标 KPI 表现强劲。截止2018 年 7月,ETH 市值约为 450 亿美元。以太坊目前支持数以千种 ERC20 代币,其中 35 种代币市值超过 1 亿美元,同时支持超过 1,500 个去中心化 DApp 项目。以太坊区块链目前每日交易数据量约为 750,000 笔。

以太坊确实有一些真正的需求,但我们认为这种需求远远不足以支持 ETH 的高价格。当外界期待加密货币总值能达到或超过1 万亿美元时,加密资产必须变成某种价值存储工具。我们认为 ETH 缺乏主导性价值存储工具所必需的特征,我们同时认为,ETH 取代比特币 BTC 成为加密货币之王的可能性也极低,更不要提成为美元和黄金那种全球性主导资产的可能。

无论可能性是多少,ETH 未来成为价值存储工具的机会将严重依赖于它在以下方面中的一个取得成功:

  • 去中心化应用平台

  • 资本募集平台

进一步挖掘,我们目前认为以太坊在这两个方面表现都很疲软:

  • 以太坊平台在技术和去中心化问题上都存在严重问题,无论是结构上和政治上都是,而这些问题在短期乃至长期都会一直存在。这些问题让所谓以太坊比起那些成本更低的、效率更高的、风险性更低的应用平台更有价值的说法站不住脚。

  • 资本募集的同质化已经吞噬了 ETH 的真正需求渠道。另外,围绕 ICO 未来可能到来的监管将严重阻碍这一需求的增长。

  • 以太坊目前的「品牌知名度」优势还能保持一段时间,但实质性的功能竞争优势还需要切实巩固。

清楚了解到这种蜕变已是箭在弦上, 我们在 2018 年 5 月开始囤积 ETH 做空仓位。尽管我们切实相信单纯做空 ETH 是合理的投资,不过我们做空 ETH 的主要动机还是对冲比特币 BTC 的做多仓位。正像我们自年初以来对客户的信息提示中一直说的那样,我们认为加密货币市场的下一波牛市将会由 拉动。

做空 ETH 是对冲加密货币市场整体风险的完美策略,因为 :

  • 能让价格突然异动的「突发新闻风险」,ETH 最低;

  • ETH 是资产,以太坊是我们认为的仅次于比特币的区块链排名第二的生态;

  • ETH 有成熟的市场 ,能达成合理的借贷条款。

我们相信,未来的几个月对于以太坊的未来走向有着决定性的意义。网络的阻塞压力 来自于 DApp 的使用 、竞争压力 来自于其它 DApp 平台 和监管压力 主要针对 ICO 将会考验这场热闹的投机炒作和 ETH 的价格。

为何现在做空 ETH:一触即发的催化剂

投机性市场都是被一个个故事炒起来的。做空 ETH 的一大附加好处是能让我们在市场脱钩现象中享受其它加密货币上涨的同时,还能对冲更大的市场风险。

我们为什么现在做空 ETH?具体来说五大原因:

  • 以太坊网络资源紧张将与即将到来的重量级 DApp 上线 譬如 Augur 相冲突。这种冲突将会让大众充分了解到以太坊扩容技术的迟滞和对其中心化的担忧。

  • 监管机构即将出拳打击 ICO,没有了 ICO,ETH 的市场需求荡然无存,会引发市场反思。ETH 抛压加大,由于 ICO 在监管重压可能枯竭,ICO投资者和组织者们都不再沾手 ETH。

  • 以太坊 DApp 和融资平台的竞争者不断涌现,将侵蚀掉 ETH 很大的价值

  • 价值存储市场逐步成熟

  • 比特币 BTC 需要引领下一波加密货币牛市

原因 1

重量级 DApp 即将发布之际,以太坊交易费用和节点运营成本在上升

尽管以太坊中没有任何一个 DApp 的日活量超过 5,000,但其区块空间已经接近饱满。

图片 2

Source:etherscan.io

除了区块网络拥堵之外,以太坊交易费还超过了比特币社区的交易费。我们即将迎来几个翘首期待已久的重量级 DApp 登场,譬如 Funfair、 Augur 和 Gnosis。如果这些应用上线,而以太坊区块空间拥挤不堪,费用可能更难降下来。

图片 3

Source:coinmetrics.io

以太坊的区块大小可以由矿工扩大,以处理更高的交易量。这会降低交易成本,但代价是运营全节点的成本大增,这就带来了系统更趋中心化的风险。

以太坊需要降低交易费用,原因有二:

  • 目前交易需求很低,因为迄今没有「爆款」DApp

  • EOS 等竞争对手采取降低交易费用方式来争夺市场份额

在不久的将来,某些新发布的以太坊 DApp 很可能成「爆款」,日活量完全可能创下新高,但会带来区块拥堵和交易费用高企等结果,因此以太坊交易费用下调已经迫在眉睫。为保持 DApp 平台神话和市场份额,以太坊近期必须增大区块,对节点网络采取更中心化策略。

原因 2

监管利剑即将落下

尽管 SEC 近期宣布 ETH 不是证券,但以太坊生态中的多数 ICO 可不是这样。我们不是很清楚监管力度有多大,但毫无疑问会判定 ICO 这种去中心化的融资模式属于非法,这也会严重影响到同样作为融资平台的其它竞争者和他们的 ICO。

如果 ICO 被认定为非法,将触发市场中强大的 ETH 抛售狂潮。

图片 4

Source:coinmarketcap.com, tokendata.io

以往投资者用 ETH 参与 ICO融资。随着 ETH 价格大跌,会出现两种情况:

  • 以太坊生态中的 ICO 吸引力大为下降

  • 持 ETH 的 ICO 组织者难套现

如果 ICO 是 ETH 需求的重要来源,那么会带来的后果包括:

  • ICO 需求锐减,ETH 价格受挫

  • 通过 ICO 募集到自己的项目方会抛出 ETH,通过资产多样化将持有 ETH 的损失降低到最小,锁定静态资本

我们近期已经管中窥豹,注意到 EOS 背后项目方大批抛售通过 ICO 融来的 ETH。ICO 项目方资产配置中的 ETH 和 ICO 代币数量代表了 ETH 总量和单个代币总供应量中相当大的比例。因此,如果突然有大规模的抛售必然会严重打压币价。

以下是部分应用及这些项目方的 ETH 账户余额。仅占 ETH 总额的 2%,也许数目并不大,但考虑到以往流动性比较低,从这些大型项目中如果抛售 ETH,将会带来巨大抛压。

图片 5

 Source:etherscan.io/accounts

原因 3

以太坊 DApp 融资平台竞争者层出不穷

DApp 平台竞争

随着生态不断发展壮大,我们认为每个区块链网络对终端用户的彼此依附关系就越来越淡,无论对消费者或开发者都是如此。用户可以通过 Web 3.0 界面进行链间互动,用去中心化交易所接入任何需要用代币的网络。用户不在乎用的是以太坊、EOS、小蚁还是 Dfinity 区块链。他们只会用自己最爱的应用、最好用户体验的平台。

鉴于此类 DApp 平台已经大量存在,并依然像雨后春笋般即将涌现,我们没有理由相信全部或者多数 DApp 会聚集在以太坊生态里。互用性协议和 Web 3.0 界面让应用可以在不同链上运行。然后会看到更多智能合约的应用,也会看到不同平台间兼容性更强大,不同平台也会拥有更鲜明的特点。

我们认为,短期内这种应用平台竞争中的胜利者可能会牺牲掉一定的去中心化,通过扩容能力和有竞争力的成本优势击败对手,因为对于多数应用而言,强烈的去中心化并非必需品。EOS 主网上线已经做出了范例。

图片 6

Source:etherscan.io

随着以太坊交易成本的进一步攀升,开发者可能越来越多选择远离以太坊。更低价的替代平台可能会张开臂膀接纳这些开发者。

融资平台竞争者

Waves、小蚁、 Stellar 和 NEM 是几个同样大批接纳 ICO 的融资平台竞争者。其中单单是小蚁上的项目就融资超过 3 亿美元。以太坊不再是唯一募集去中心化资本的平台,也不一定是最适合的那一个。

图片 7

Source: New AlchemyResearch, TokenData

另外还有很多资金雄厚的竞争者已经上线,或者即将上线,包括 Dfinity、Qtum、Tezos、Wanchain、 Achain、Lisk 和 Rchain。

原因 4

价值存储市场将会逐步成熟

今日的加密货币市场主要吸引的是散户和科技领域投资者。科技领域投资者追逐「下一个比特币」,散户则痴迷波动性最大的资产 不管自己懂不懂行。这种投资者构成也是 ETH 价格严重错配的重要原因。

我们可能很快看到传统金融机构杀入加密货币市场,他们不会完全忽视以太坊这样的平台,但考虑到在宏观金融体系中对货币的理解,以及比特币 BTC 投资类产品的繁荣 期货交易、更强的流动性等等,我们认为传统金融机构投资者会更青睐 BTC,而不是 ETH。

我们同时也看到很多因投资非主流币而吃过大亏的投资者接受与我们类似的价值存储理论。随着价值存储理论得到更多认可,我们认为更多的市场参与者会采取设计更完备的风险体系,会把 BTC 视为资本内在成本。

我们认为目前的市场价位没能完全反应出投资者关注力会迅速转向「下一个爆款」的杀伤力。

图片 8

Source:coinmarketcap.com/historical

原因 5

比特币将会引领加密货币下一波牛市

我们不认为加密货币牛市已是一去不复返,但我们认为唯一可能带动新一波牛市是比特币 BTC。加密货币市场是在定义非常清晰的周期中运行。每个周期的波动幅度超过了上一次。 下图帮助我们了解这种市场周期,其显示了过去三波周期,其中,市值排名第 5-100 位的替代币在 90 天内上涨超过了 200%。

图片 9

Source:coinmarketcap.com

是什么推动了这种上涨?是比特币,替代币投资中的流通法币。

每个周期开始时,比特币上涨,然后替代币币波澜不惊,然后比特币在大涨之后,很多投资者在比特币上赚到的钱又被投入其他币种 :

图片 10

Source:coinmarketcap.com

在替代币大涨之前,投资者需要在比特币上先赚到财富,这是多个周期的共同特点。在最新一波牛市中,随着比特币大涨,ETH/BTC 交易对大跌超过 50%:

图片 11

Source:coinmarketcap.com

过去三波牛市清晰表明替代币,甚至包括 ETH,只能在比特币大涨后才会上涨。

目前 BTC 与 ETH 的关联指数已经 >0.9。

关于 ETH 及其他数字货币与 BTC 价格关联的现状,可以参阅链闻之前发表的文章「你的感觉是对的,大部分代币确实都傻傻随市场大势和比特币涨跌」

图片 12

Source:sifrdata.com/cryptocurrency-correlation-matrix,7/13/18

贯穿历史长河,最好的交易都是在关系脱钩时站队最终获胜的一方。即使是在过去严重依赖的关联关系已经瓦解、新的投资模板正在形成之时依然如此。

图片 13

Source:coinmetrics.io/correlations/#assets=btc-eth

以太坊目前的状态和对其近期合理的预期都不足以支持 ETH 目前的高估价。我们认为,即将到来的这五大催化剂将给 ETH 价格带来极大的下行压力。

除了这些短期的不利因素外,我们长期的基本面分析也认为 ETH 估值过高,整体市场对其存在误读。

我们的做空仓位旨在捕捉住市场对 ETH 重新估值的机会,并对冲我们做多比特币的风险。

本文由美高梅游官网发布于美高梅游官网,转载请注明出处:以太坊怎么了?Tetras提议看空ETH五益阳由

关键词: 美高梅游官网

最火资讯