personal.unlockAccount

2046 단어
1. 실행 결과
personal.unlockAccount("0xd4c3b95bf0bbf0fd0087062125dd572114ded44f") Unlock account 0xd4c3b95bf0bbf0fd0087062125dd572114ded44f Passphrase: true
2. 데이터 구조
type KeyStore struct {
    unlocked map[common.Address]*unlocked // Currently unlocked account (decrypted private keys)
}

3. 소스 코드
  • 계산 시간 길이
  • 비밀 번 호 를 통 해 복호화
  • 잠 금 해제 계 정 을 KeyStore. unlocked
  • 에 추가 합 니 다.
    3.1. go-ethereum/internal/ethapi/api.go
    func (s *PrivateAccountAPI) UnlockAccount(addr common.Address, password string, duration *uint64) (bool, error) {
        const max = uint64(time.Duration(math.MaxInt64) / time.Second)
        var d time.Duration //      
        if duration == nil {
            d = 300 * time.Second
        } else if *duration > max {
            return false, errors.New("unlock duration too large")
        } else {
            d = time.Duration(*duration) * time.Second
        }
        err := fetchKeystore(s.am).TimedUnlock(accounts.Account{Address: addr}, password, d)
        return err == nil, err
    }
    

    3.2. go-ethereum/accounts/keystore/keystore.go
    func (ks *KeyStore) TimedUnlock(a accounts.Account, passphrase string, timeout time.Duration) error {
        a, key, err := ks.getDecryptedKey(a, passphrase) //  
        if err != nil {
            return err
        }
    
        ks.mu.Lock()
        defer ks.mu.Unlock()
        u, found := ks.unlocked[a.Address] 
        if found {  //    unlock
            if u.abort == nil {
                // The address was unlocked indefinitely, so unlocking
                // it with a timeout would be confusing.
                zeroKey(key.PrivateKey)
                return nil
            }
            // Terminate the expire goroutine and replace it below.
            close(u.abort)
        }
        if timeout > 0 {
            u = &unlocked{Key: key, abort: make(chan struct{})}
            go ks.expire(a.Address, u, timeout) //    , unlock        
        } else {
            u = &unlocked{Key: key}  //        
        }
        ks.unlocked[a.Address] = u
        return nil
    }
    

    좋은 웹페이지 즐겨찾기