区块链学习(二)以太坊访问

1、进入geth的交互式平台

geth --rpc --rpccorsdomain "*" –identity "haha" –datadir "/data/eth/chain" –networkid 100000 –rpcapi "db,eth,net,web3" –port 2220 –rpcport "30303" –bootnodes "enode://5d1f52b69d7473389e77475a1e972f45215b184ad6734e9b77088f00cc311fe493ed8352359685dee79c64db50041351da60785801328cb5ada82ab206287d1c@172.18.0.2:2220" console

    rpccorsdomain 指定可以访问APi的domain地址,设置为“*”则任何地址都可以访问,这样做不安全
    –identity 用来标示区块链网络的名字,随便写
    datadir 跟初始化时保持一致,用来存放区块链数据
    –networked 设置区块链的网络ID,用来标识不同的网络
    –rpc 启动rpc通信,可以用来智能合约的部署和调用
    –port 网络监听端口

    –bootnodes 用来连接某个节点,这里我们设置为主节点的信息



2、基本的操作

    查看账户信息eth.accounts
    创建一个新账户personal.newAccount()
    查看账户0的地址eth.accounts[0]
    查看账户1余额eth.getBalance(eth.accounts[1])
    账户0解锁personal.unlockAccount(eth.accounts[0])
    0账户发起交易转账给1账户3以太币,账户需要解锁才能发起交易eth.sendTransaction({from:eth.accounts[0],to:eth.accounts,value:web3.toWei(3,’ether’)})
    查看交易池txpool.status
    通过交易哈希值查看交易的具体信息eth.getTransaction(“0x521c52450559bc98d41e29823c53be0036bfffbe142db489d19065e2e9c9887a”)
    挖矿miner.start()
    停止挖矿minier.stop()
    查看区块高度eth.blockNumber

    查看某个区块的具体信息 eth.getBlock(79)


3、部署和调用智能合约

    function Sample(uint v){
                value=v;
      }
      function set(uint v){
                value=v;
      }
      function get() constant returns (uint){
                return value;
      }

}

    1)先在以太坊智能合约的浏览器编译器编译合约,得到abi接口和二进制代码 赋值给abi

abi=[{"constant":true,"inputs":[],"name":"value","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint256"}],"name":"set","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"v","type":"uint256"}],"payable":false,"type":"constructor"}]

2)需要使用eth.contract来定义一个合约类

sample=eth.contract(abi)

3)合约的二进制代码赋值给SampleHEX方便使用

SampleHEX="0x6060604052341561000c57fe5b60405160208061013a833981016040528080519060200190919050505b806000819055505b505b60f9806100416000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514604e57806360fe47b11460715780636d4ce63c14608e575bfe5b3415605557fe5b605b60b1565b6040518082815260200191505060405180910390f35b3415607857fe5b608c600480803590602001909190505060b7565b005b3415609557fe5b609b60c2565b6040518082815260200191505060405180910390f35b60005481565b806000819055505b50565b600060005490505b905600a165627a7a72305820208c8101070c8ba5a9b32db2bf4b8062a9ba50bc2869c39ac2297938756540e80029"

4)部署合约,并把1传递给合约一个初始化

hesample=sample.new(1,{from:eth.accounts[0],data:SampleHEX,gas:3000000})

5) 通过部署合约返回的交易哈希查看合约细节

samplerecpt=eth.getTransactionReceipt("0x1d875c7ea3a19458c0ec1473f6c643ebb90c400406f3c160660d12aa3a520995")

6) 通过交易细节得到的合约的地址给合约命名

samplecontract=sample.at("0x80a52a1e0daa54dc6ce3a5bea84cce9c39b162e5")


7)调用合约
调用get()函数查看,并没有改变变量的值所以可以用call,不需要花费gas

samplecontract.get.call()

调用set()函数改变合约参数,所以必须用交易的形式,

samplecontract.set.sendTransaction(9, {from:eth.accounts[0], gas:3000000})



        


    


猜你喜欢

转载自blog.csdn.net/qq_22894935/article/details/79818508