Sunday, 4 November 2018

Note For Ethernaut#2 - Fallout

Solidity

pragma solidity ^0.4.18;

import 'zeppelin-solidity/contracts/ownership/Ownable.sol';

contract Fallout is Ownable {

  mapping (address => uint) allocations;

  /* constructor */
  function Fal1out() public payable {
    owner = msg.sender;
    allocations[owner] = msg.value;
  }

  function allocate() public payable {
    allocations[msg.sender] += msg.value;
  }

  function sendAllocation(address allocator) public {
    require(allocations[allocator] > 0);
    allocator.transfer(allocations[allocator]);
  }

  function collectAllocations() public onlyOwner {
    msg.sender.transfer(this.balance);
  }

  function allocatorBalance(address allocator) public view returns (uint) {
    return allocations[allocator];
  }
}

What I learned From It

  • careless could cause some harm mistake
tags: ethernaut solidity

Note For Ethernaut#1 - Fallback

Solidity

pragma solidity ^0.4.18;

import 'zeppelin-solidity/contracts/ownership/Ownable.sol';

contract Fallback is Ownable {

  mapping(address => uint) public contributions;

  function Fallback() public {
    contributions[msg.sender] = 1000 * (1 ether);
  }

  function contribute() public payable {
    require(msg.value < 0.001 ether);
    contributions[msg.sender] += msg.value;
    if(contributions[msg.sender] > contributions[owner]) {
      owner = msg.sender;
    }
  }

  function getContribution() public view returns (uint) {
    return contributions[msg.sender];
  }

  function withdraw() public onlyOwner {
    owner.transfer(this.balance);
  }

  function() payable public {
    require(msg.value > 0 && contributions[msg.sender] > 0);
    owner = msg.sender;
  }
}

What I learned From It

Fallback Function

每個合約裡最多能有一個未命名的公開 funtion,沒有參數、回傳值。
在幾種情況下會執行:
  1. 呼叫合約的函式不在 abi 裡。
  2. 對合約轉帳 (不帶 data 參數)。
只有 payable 的 Function 才能接收 Ether.

Reference:

tags: ethernaut solidity

Note For Ethernaut#0 - Hello

Solidity

pragma solidity ^0.4.18;

contract Instance {

  string public password;
  uint8 public infoNum = 42;
  string public theMethodName = 'The method name is method7123949.';
  bool private cleared = false;

  // constructor
  function Instance(string _password) public {
    password = _password;
  }

  function info() public pure returns (string) {
    return 'You will find what you need in info1().';
  }

  function info1() public pure returns (string) {
    return 'Try info2(), but with "hello" as a parameter.';
  }

  function info2(string param) public pure returns (string) {
    if(keccak256(param) == keccak256('hello')) {
      return 'The property infoNum holds the number of the next info method to call.';
    }
    return 'Wrong parameter.';
  }

  function info42() public pure returns (string) {
    return 'theMethodName is the name of the next method.';
  }

  function method7123949() public pure returns (string) {
    return 'If you know the password, submit it to authenticate().';
  }

  function authenticate(string passkey) public {
    if(keccak256(passkey) == keccak256(password)) {
      cleared = true;
    }
  }

  function getCleared() public view returns (bool) {
    return cleared;
  }
}
在判斷參數時用到 keccak256,文件提到 keccak256 是 “tight pakced”,而 “tightly packed” 是指不會對參數進行 padding 處理。

What I learned From It

  • 參數會先經過 keccak256 pack
  • 取 public 變數與參數方式一樣
tags: ethernaut solidity

Friday, 5 October 2018

Music HW#1 - 3度音程

比起一個8度內的3度音程,更喜歡高8度的3度的聲響,2個是完全不同的感覺。

3度音在指板上的相對位置

1. 一個8度的3


  • Root on 6th String

  • Root on 5th String

  • Root on 4th String

  • Root on 3th String

  • Root on 2th String


2. 高8的3


  • Root on 6th String

  • Root on 5th String

  • Root on 4th String


例子

1. 一個8度的3


  • 金雅中 - 瑪麗亞

分析:
 Key: B
 3度在前奏/主歌部份:運用 I VII VI VII 的3度和聲

2. 高8的3


  • RHCP - Scar Tissue



這首是讓我發現原來這麼好聽的聲音,其實只是3度 的歌。

分析:
 Key: F
 3度在前奏/主歌部份:運用 I V VI 的 R & 3 單音製造出遼闊的感覺。

  • James Bay - Let It Go



分析:
 Key: A#m
 

  • The Beatles - Blackbird



分析:
 這首是例子裡面最令人驚奇的,非常大量運用3度,除了前幾首的手法外,與根音的距離也是3。

Thursday, 13 July 2017

Reference to a Pointer

Notes for reading C++ Primer 4/e.
void ptrswap(int *&v1, int *&v2) {
    int *tmp = v2;
    v1 = v2;
    v2 = tmp;
}

int main() {
    int i = 10;
    int j = 20;
    int *pi = &i;
    int *pj = &j;

    cout << *pi << "  " << *pj << endl;
    ptrswap(pi, pj);
    cout << *pi << " " << *pj << endl;

    return 0;
}
Result:
10 20
20 10

Reference

Notes for reading C++ Primer 4/e.

Reference

nonconst reference can only reference to the same nonconst object.
int incr(int val) {
  return ++val;
}

int incrRef(int &val) {
  return ++val;
}

int incrRefConst(const int &val) {
  cout << val << endl;

  return val;
}

int main() {
  short v1 = 0;
  const int v2 = 42;
  double v4 = 3.4;

  int v3 = incr(v1);
  v3 = incrRef(v1);  // X: no matching function for call to 'incrRef'
  v3 = incrRefConst(v1);  // 0

  int v5 = incr(v4);
  v5 = incrRef(v4);  // X: no matching function for call to 'incrRef'
  v5 = incrRefConst(v4);  // 3
  cout << v4 << " " << v5 << endl;  // 3.4 3

  return 0;
}


[note]:

  • nonconst refernce parameter 的彈性較低,不能以 const object 初始化,也不能以字面常數 (ex. 42, 'a', "Hello", 3.14...) 或 rvalue 做為 argument.