工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.51099.com 注册 | 登陆
浏览模式: 标准 | 列表分类:以太坊

深入解析ABI

 https://zhuanlan.zhihu.com/p/27574211

Solidity 官方文档中文版

 

内部-优化器

Solidity 优化器是在汇编级别上的操作,所以它也可以同时被其他语言所使用。它将指令的(执行)次序,在JUMP 和 JUMPDEST上分成基本的块。在这些块中,指令被解析 。 堆栈、内存或存储上的每一次修改,都将作为表达式被记录。该表达式包括一条指令以及指向其他表达式的一系列参数的一个指针。现在的主要意思是要找到相等的表达式(在每次输入),做成了表达式的类。优化器首先在已知的表达式列表里找,若找不到的话,就根据constant + constant = sum_of_constants  或 X * 1 = X  来简化。 因为这样做是递归的,如果第二个因子是一个更复杂的表达式,我们也可以应用latter规则来计算。存储和内存位置的修改,是不知道存储和内存的位置的区别。如果我们先写到的位置x,再写到位置y , x,y均是输入变量。第二个可以覆写第一个,所以我们不知道x是存放在y之后的。另一方面,如果一个简化的表达式 x-y 能计算出一个非零常数,我们就知道x存放的内容。

在这个过程结束时,我们知道,表达式必须在堆栈中结尾,并有一系列对内存和存储的修改。这些信息存储在block上,并链接这些block。此外,有关堆栈,存储和内存配置的信息会转发到下一个block。如果我们知道所有的 JUMP 和 JUMPI 指令,我们可以建立一个完整的程序控制流图。如果我们不知道目标块(原则上,跳转目标是从输入里得到的),我们必须清除所有输入状态的存储块上的信息,(因为它的目标块未知)。如果条件计算的结果为一个常量,它转化为一个无条件jump。

作为最后一步,在每个块中的代码完全可以重新生成。从堆栈里block的结尾表达式开始,创建一个依赖关系图。每个不是这个图上的操作将舍弃。现在能按照原来代码的顺序,生成对存储和内存修改的代码(舍弃不必要的修改)。最后,在正确位置的堆栈上,生成所有的值。

这些步骤适用于每一个基本块, 如果它是较小的,用新生成的代码来替换。如果一个基本块在JUMPI上进行分割,在分析过程中,条件表达式的结果计算为一个常数,JUMP就用常量值进行替换。代码如下

 

使用命令行编译器

一个 Solidity 库构建的目标是solc, Solidity命令行编译器。使用solc –help  为您提供所有选项的解释。编译器可以产生不同的输出,从简单的二进制文件,程序集的抽象语法树(解析树)到gas使用的估量。如果你只想编译一个文件,你运行solc –bin sourceFile.sol , 将会打印出二进制。你部署你的合约之前,使用solc –optimize –bin sourceFile.sol 来激活优化器。如果你想获得一些solc更进一步的输出变量,可以使用solc -o outputDirectory –bin –ast –asm sourceFile.sol,(这条命令)将通知编译器输出结果到单独的文件中。

命令行编译器会自动从文件系统中读取输入文件,但也可以如下列方法,提供重定向路径prefix=path :

solc github.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/ =/usr/local/lib/fallback file.sol

该命令告诉编译器在/usr/local/lib/dapp-bin目录下,寻找以github.com/ethereum/dapp-bin/  开头的文件,如果找不到的话,到usr/local/lib/fallback目录下找(空前缀总是匹配)。

solc不会从remapping目标的外部,或者显式定义的源文件的外部文件系统读取文件,所以要写成 import “/etc/passwd”;     只有增加 =/ 作为remapping,程序才能工作。

如果remapping里找到了多个匹配,则选择有共同的前缀最长的那个匹配。

如果你的合约使用了  libraries ,你会注意到字节码中包含了 form LibraryName 这样的子字符串。你可以在这些地方使用solc 作为链接器,来插入库地址 :

Either add –libraries “Math:0x12345678901234567890 Heap:0xabcdef0123456”    提供每个库的地址, 或者在文件中存放字符串(每行一个库)

然后运行solc,后面写 –libraries fileName.

如果solc后面接着 –link 选项,所有输入文件将被解释为未链接的二进制文件(十六进制编码), LibraryName形式如前所述, 库此时被链接(从stdin读取输入,从stdout输出)。在这种情况下,除了–libraries,其他所有的选项都将被忽略(包括 -o)

提示和技巧

  • 在数组中使用delete,就是删除数组中的所有元素。

  • 使用较短的类型和结构元素,短类型分组在一起进行排序。sstore操作可能合并成一个单一的sstore,这可以降低gas的成本(sstore消耗5000或20000 gas,所以这是你必须优化的原因)。使用天gas的价格估算功能(优化器 enable)进行检查!

  • 让你的状态变量公开,编译器会免费创建 getters 。

  • 如果你结束了输入或状态的检查条件,请尝试使用函数修饰符。

  • 如果你的合约有一个功能send, 但你想使用内置的send功能,请使用 address(contractVariable).send(amount)。

  • 如果你不想你的合约通过send接收ether,您可以添加一个抛出回退函数 function() { throw; }.。

  • 用单条赋值语句初始化存储结构:x = MyStruct({a: 1, b: 2});

陷阱

不幸的是,还有一些编译器微妙的情况还没有告诉你。

  • 在for (var i = 0; i < arrayName.length; i++) { ... },  i的类型是uint8,因为这是存放值0最小的类型。如果数组元素超过255个,则循环将不会终止。

列表

 
http://wiki.jikexueyuan.com/project/solidity-zh/miscellaneous.html

以太坊的存储结构

 以太坊并不存在中心服务器,而是基于p2p协议连接起来的平等节点,在众多节点中存储了全部数据。当用户发起一笔交易,会通过广播通知每一个节点,矿工对此进行验证打包并进一步广播,在区块链确认以后,此操作即认为是不可更改的。

在每个节点上,数据是以区块链来存储的。区块链由一个个块串起来而组成。以太坊被描述为一个交易驱动的状态机。它在某个状态下接收一些输入,会确定的转移到另一个状态。

状态机,包含一组状态集(states)、一个起始状态(start state)、一组输入符号集(alphabet)、一个映射输入符号和当前状态到下一状态的转换函数(transition function)的计算模型。

在以太坊的一个状态下,每个账户都有确定的余额和状态信息,当他接收到新的交易以后就会进入一个新的状态,从创世块开始,不断的收到新的交易,由此能进入到一系列新的状态。

以太坊每隔一段时间就会把一批交易信息打包存储到一个块里,这个块中包含的信息有:

  1. ParentHash:父块的哈希值
  2. Number:块编号
  3. Timestamp:块产生的时间戳
  4. GasUsed:交易消耗的Gas
  5. GasLimit:Gas限制
  6. Difficulty:POW的难度值
  7. Beneficiary:块打包手续费的受益人,也称矿工
  8. Nonce:一个随机数,使得块头哈希满足POW需求

这些字段我们在上面的web3接口中都可以获取得到。

nonce,整数类型,允许使用相同随机数覆盖自己发送的处于pending状态的交易。

为了防止交易的重播攻击,每笔交易必须有一个nonce随机数,针对每一个账户nonce都是从0开始,当nonce为0的交易处理完之后,才会处理nonce为1的交易,并依次加1的交易才会被处理。以下是nonce使用的几条规则:

  • 当nonce太小,交易会被直接拒绝。
  • 当nonce太大,交易会一直处于队列之中,这也就是导致我们上面描述的问题的原因;
  • 当发送一个比较大的nonce值,然后补齐开始nonce到那个值之间的nonce,那么交易依旧可以被执行。
  • 当交易处于queue中时停止geth客户端,那么交易queue中的交易会被清除掉。

以太坊客户端Geth命令用法-参数详解

以太坊客户端Geth命令用法-参数详解

 

 

https://www.cnblogs.com/tinyxiong/p/7918706.html

以太坊开发框架truffle以及testrpc注意事项

 环境版本:

Truffle v3.4.9 (core: 3.4.8)
Solidity v0.4.15 (solc-js)
EthereumJS TestRPC v4.1.1 (ganache-core: 1.1.2)
 
问题:通过Truffle和TestRPC生成测试环境以后,无法通过IP地址访问环境,而只能在本机通过localhost访问
解决方案:修改testrpc和truffle环境的三个地方

1.修改truffle生成的web框架文件里面的truffle.js文件
a96921164cd81032b7e497aa66e24e992f79c652
2.使用###>testrpc -h 0.0.0.0命令启动testrpc
3.修改truffle文件的webpack.config.js文件
c4a8a7a490ac82b3a6dac99d9ce6e1ca475b8f9f
具体全部命令

1. >mkdir myproject  

2. >cd myproject  

3. >truffle init webpack


修改完成,需要重新编译

     >truffle compile -all

4.   >truffle migrate

5.   >testrpc -h 0.0.0.0(请在另一个终端下运行这个命令)

6.   >npm run dev

来自ETH源码,手动生成以太坊钱包,ERC20标准钱包

 安装完成后用node自带的npm(node package manger)下载两个依赖: 椭圆加密算法包,keccak哈希包

npm install secp256k1 
npm install keccak

进入node交互界面

node

执行node脚本

 //引入包  const secp256k1 = require("secp256k1/elliptic")  const createKeccakHash =  require("keccak")  const crypto = require('crypto')   // 生成私钥  const privateKey = crypto.randomBytes(32)  // 生成公钥  const publicKey = secp256k1.publicKeyCreate(privateKey, false).slice(1)  // 生成地址  const address = createKeccakHash("keccak256").update(publicKey).digest().slice(-20)   // 查看结果  privateKey.toString('hex')  address.toString('hex')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

以上代码在 Imtoken钱包 导入成功, 并能够正常使用,即 核对导入后的钱包address与 脚本生成的address一致

ERC20 Token标准接口

下是一个接口合同,声明所需的功能和事件以符合ERC20标准:

 

// https://github.com/ethereum/EIPs/issues/20

  contract ERC20 {

      function totalSupply() constant returns (uint totalSupply);

      function balanceOf(address _owner) constant returns (uint balance);

      function transfer(address _to, uint _value) returns (bool success);

      function transferFrom(address _from, address _to, uint _value) returns (bool success);

      function approve(address _spender, uint _value) returns (bool success);

      function allowance(address _owner, address _spender) constant returns (uint remaining);

      event Transfer(address indexed _from, address indexed _to, uint _value);

      event Approval(address indexed _owner, address indexed _spender, uint _value);

    }

大部分Ethereum主要标记符合ERC20标准。

 

一些令牌包括描述令牌合同的进一步信息:

 

string public constant name = "Token Name";

string public constant symbol = "SYM";

uint8 public constant decimals = 18;  // 大部分都是18

如何工作?

 

以下是令牌合约的一个片段,用于演示令牌合约如何维护Ethereum帐户的令牌余额

 

contract TokenContractFragment {

 

     // Balances 保存地址的余额

     mapping(address => uint256) balances;

 

     // 帐户的所有者批准将金额转入另一个帐户

     mapping(address => mapping (address => uint256)) allowed;

 

      // 特定帐户的余额是多少?

      function balanceOf(address _owner) constant returns (uint256 balance) {

          return balances[_owner]; //从数组中取值

      }

 

      // 将余额从所有者帐户转移到另一个帐户

      function transfer(address _to, uint256 _amount) returns (bool success) {

          //判断条件 发送者余额>=要发送的值  发送的值>0  接收者余额+发送的值>接收者的余额

          if (balances[msg.sender] >= _amount 

              && _amount > 0

              && balances[_to] + _amount > balances[_to]) {

              balances[msg.sender] -= _amount;   //发送者的余额减少

              balances[_to] += _amount;         //接收者的余额增加

              return true;

         } else {

              return false;

          }

      }

 

      // 发送 _value 数量的token从地址 _from 到 地址 _to

      // transferFrom方法用于提取工作流程,允许合同以您的名义发送令牌,例如“存入”到合同地址和/或以子货币收取费用; 该命令应该失败,除非_from帐户通过某种机制故意地授权消息的发送者; 我们提出这些标准化的API来批准:

      function transferFrom(

          address _from,

          address _to,

          uint256 _amount

     ) returns (bool success) {

          //和上面一样的校验规则

          if (balances[_from] >= _amount

              && allowed[_from][msg.sender] >= _amount

              && _amount > 0

              && balances[_to] + _amount > balances[_to]) {

              balances[_from] -= _amount;

              allowed[_from][msg.sender] -= _amount; //减少发送者的批准量

              balances[_to] += _amount;

              return true;

         } else {

             return false;

          }

      }

 

      // 允许_spender多次退出您的帐户,直到_value金额。 如果再次调用此函数,它将以_value覆盖当前的余量。

      function approve(address _spender, uint256 _amount) returns (bool success) {

          allowed[msg.sender][_spender] = _amount; //覆盖当前余量

          return true;

      }

  }

 

http://blog.csdn.net/diandianxiyu_geek/article/details/78082551?utm_source=gold_browser_extension

如何分叉以太坊并变成私链?

 http://blog.csdn.net/fidelhl/article/details/50654813

 

http://blog.csdn.net/yooliee/article/details/72818932

 

http://www.jianshu.com/p/c53ede8fab36

Records:24123