以太坊又是啥? - Go语言中文社区

以太坊又是啥?


----------------------------------------------------------------------------------------------------------------

1

正式介绍智能合约之前,先来说说当前存在的最有影响力的两大 公链 ,即比特币和以太坊。
前者作为区块链1.0版本的代表,区块加载的账本信息比较单一,集中于认证新币产生以及旧币在账户间转移,并无其他更多功能。而后者作为区块链2.0版本的代表,更重要的是想要创建一种操作系统式的生态,人们可以利用该生态实现更多样化的价值创造与转移,而其核心工具就是所谓的“智能合约”。以太坊上也存在数字货币,但以太币主要是用于支付智能合约的相关运算,其存在的意义和比特币有着重大差别。

如果说比特币为代表的加密货币提供了区块链技术应用的原型,以太坊为代表的智能合约平
台延伸了区块链技术的适用场景,那么面向企业场景的超级账本项目则开拓了区块链技术的
全新阶段。它首次将区块链技术引入到了联盟账本的应用场景,引入权限控制和安全保障,
这就为基于区块链技术的未来全球商业网络打下了坚实的基础。

----------------------------------------------------------------------------------------------------------------

2

智能合约其实就是一段EVM可执行的代码,可理解为面向对象编程中的对象。

----------------------------------------------------------------------------------------------------------------

3

以太坊区块链主要由区块头,交易列表,叔区块头 三部分组成。

----------------------------------------------------------------------------------------------------------------

4

Ethash算法

以太坊区块链所使用的PoW。为了抵抗ASIC矿机形成的中心化

区块头-->seed-->16M缓存-->DAG(1GB数据集,随时间线性增长)
旷工从DAG选择元素进行哈希寻找合适的元素,类似比特币试探nonce的过程。

----------------------------------------------------------------------------------------------------------------

5

POW( Proof of Work)工作量证明
一句话介绍:劳动致富,多劳者多得!

POS( Proof of Stake)权益证明
一句话介绍:持有越多,获得越多。

----------------------------------------------------------------------------------------------------------------

6

创世区块文件
genesis.json

{
    "config": {
        "chainId": 10,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "coinbase" : "0x0000000000000000000000000000000000000000",
    "difficulty" : "0x40000",
    "extraData" : "",
    "gasLimit" : "0x2fefd8",
    "nonce" : "0x0000000000000000",
    "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp" : "0x00",
    "alloc": { 
        "0x<3845225b05f291d4f0c9b8bd7fb2320232b3c84b>" : {"balance":"1000000000000000000"},
        "0x<5586fd7bb8b81992526bbf6bf707f0eba9ab3c7a>" : {"balance":"2000000000000000000"}
    }
}

----------------------------------------------------------------------------------------------------------------

7

创建账户
geth --datadir .data account new

创建账户
personal.newAccount()

以太坊账户
5586fd7bb8b81992526bbf6bf707f0eba9ab3c7a
3845225b05f291d4f0c9b8bd7fb2320232b3c84b
d82d76fe4e33e1771cb9baef5132f2c826a180f8

密码
123456

创建新链
geth --datadir .data init .genesis.json

在链上启动节点
geth --datadir .data --networkid 10 console

查看账户
eth.accounts

查看账户余额,以wei为单位
eth.getBalance(eth.accounts[0])
查看账户余额,以ether为单位
web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")

获取节点的地址
admin.nodeInfo.enode

查看已连接上的其他节点信息
admin.peers

动态添加其他节点
admin.addPeer("enode://b774fe575b754057d8e68702f9eb9c35e6baaa06dcb9c3af0105361dce3117093c0ded04bc95290a7953612112b47b667a666ddd78d0f8d424c66823d12603a4@192.168.235.128:30303")

VM:
admin.addPeer("enode://03e88656d8c08763b096a2b0d591ed593b08aa81016adccd7a3352c3de6c51fbd62a3764fa6497b64a81c2c280f0538e9183a702f19d4668da19f148b9e4b31a@192.168.1.116:30303")

解锁账户
personal.unlockAccount(eth.accounts[1]) 

预设挖矿收益账户
miner.setEtherbase(eth.accounts[0])

查看挖矿收益账户
eth.coinbase

开始挖矿
miner.start(1)

停止挖矿,完整输入回车即可
miner.stop()

交易池中待确认的交易
txpool.status

账户0向账户1转账,返回交易哈希
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:50*1e18})
0xce6806fc8bd3ed8b5c9e6031375add175e9675a6650e84662072f3f3e5bea5a1

获取交易信息
eth.getTransaction("0xce6806fc8bd3ed8b5c9e6031375add175e9675a6650e84662072f3f3e5bea5a1")
{
  blockHash: "0x31500e06c76fbaacfb5096d97fee33b95efc0ee2d83d0f6ecfd2f6395185677e",
  blockNumber: 157,
  from: "0x5586fd7bb8b81992526bbf6bf707f0eba9ab3c7a",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0xce6806fc8bd3ed8b5c9e6031375add175e9675a6650e84662072f3f3e5bea5a1",
  input: "0x",
  nonce: 0,
  r: "0xa761eb235f2d8c654f779f36706686907127bf950550703a541b25fa2937b00d",
  s: "0x37215eaf80bbe6fafc9d20c0cdc87e1d679f88e138eac9eee996c209d99818f4",
  to: "0x3845225b05f291d4f0c9b8bd7fb2320232b3c84b",
  transactionIndex: 0,
  v: "0x37",
  value: 50000000000000000000
}

获取交易所在区块的信息
eth.getBlock(eth.getTransaction("0xce6806fc8bd3ed8b5c9e6031375add175e9675a6650e84662072f3f3e5bea5a1").blockNumber)
{
  difficulty: 138318,
  extraData: "0xd883010803846765746886676f312e31308777696e646f7773",
  gasLimit: 3661621,
  gasUsed: 21000,
  hash: "0x31500e06c76fbaacfb5096d97fee33b95efc0ee2d83d0f6ecfd2f6395185677e",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x3845225b05f291d4f0c9b8bd7fb2320232b3c84b",
  mixHash: "0x6066d53072d4d801f3821bce028ed5c11674a5c99485a35b9222e32143dca2cf",
  nonce: "0x232b876e1785143f",
  number: 157,
  parentHash: "0xc00d1ddb4b9a06af55d5d60869b85532ec3429e116002655df93bd7a0e47666b",
  receiptsRoot: "0xbf94a21a7ab67563248d840812f35e3dee4b903f583e658ee8c77f2976146ed9",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 652,
  stateRoot: "0x2364c1d21b696383704eec4057fdab50eacc1d9f196f8d77cae044b02f0d96b0",
  timestamp: 1548756548,
  totalDifficulty: 21137481,
  transactions: ["0xce6806fc8bd3ed8b5c9e6031375add175e9675a6650e84662072f3f3e5bea5a1"],
  transactionsRoot: "0x637c7ff2d6661b4a4c3e8157d1013a4bdc75152109b9cc6aa12862a94d6018ff",
  uncles: []
}

----------------------------------------------------------------------------------------------------------------

8

remix在线开发工具
http://remix.ethereum.org/

pragma solidity >=0.4.22 <0.6.0;
contract Counter
{
    uint public count = 10;
    function inc(uint num) public returns (uint)
    {
        return count += num;
    }
}

contract CallCounter
{
    uint public count = 20;
    function callByAddr(address addr) public returns (uint)
    {
        return Counter(addr).inc(2);
    }
}

contract Caller_by_call
{
    uint count = 20;
    function callByAddr(address addr) public returns (bool)
    {
        bytes4 methodId = bytes4(keccak256("inc(uint256)"));
        return addr.call(methodId, 2);
    }
}


contract address 
0x692a70d2e424a56d2c6c27aa97d1a86395877b3a

----------------------------------------------------------------------------------------------------------------

9

以太坊虚拟机的存储方式分为三类:栈,账户存储、内存。

创建一个交易将合约部署到区块链上,旷工打包进区块链时,合约创建完成,区块链上出现一个与该智能合约相对应的合约账户,并拥有一个特定地址,合约代码保存在该合约账户中。

状态变量与部分类型的局部变量(数组、结构体等复杂类型)是默认保存在账户存储中的,而函数的形参和其他简单类型的局部变量则保存在内存中。
使用memory和storage强制限定变量的存储地点。

注:当调用合约时,EVM会获取相应的合约账户,在合约账户对应的账户存储中获得状态变量,并处理合约中的函数返回结果,新的状态变量会继续保存在该合约账户的账户存储中,直到调用销毁函数。发起调用合约的交易会一直保存在区块链上。

LevelDB以太坊使用的数据库。以太坊共有三个数据库BlockDB、StateDB、ExtrasDB。
BlockDB,保存块的主体内容。
StateDB,保存账户的状态信息。即账户存储中,合约的状态变量。
ExtrasDB,保存了收据信息和其他辅助信息。

----------------------------------------------------------------------------------------------------------------

10

在以太坊测试链上编译、部署、调用智能合约
https://my.oschina.net/feistel/blog/3007913

转载于:https://my.oschina.net/feistel/blog/3007768

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_34068198/article/details/91890754
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-08-27 11:25:42
  • 阅读 ( 1859 )
  • 分类:区块链

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢